访问修饰符只是 C++ 中的一种编译时机制。然而,在 Java 中,它们也在运行时强制执行,因为 Java 也有一个运行时类型系统,它可以动态(在运行时)创建类。因此,对于在编译时不知道的类型,它也需要在运行时强制访问。
为什么要使用访问修饰符?
访问修饰符的唯一目的是强制设计。
假设你有一个A
你实现的类
class A
{
public:
void DoSomething()
{
// use private member mPrivMember to do something
}
private:
int mPrivMember;
}
还有一些使用类的代码A
:
A a_obj;
上面的代码可以调用a_obj.DoSomething()
,但是他们没有直接访问 mPrivMember 的权限,所以a.mPrivMember
在类之外写的A
不会编译。
现在,为什么您希望某些成员可以访问外部代码而某些成员不能访问?好吧,这就是原因:目前,该方法DoSomething()
用于mPrivMember
实际做事。但一段时间后,您可能决定要重构DoSomething 中的代码,以改进它。你找到了一种不同的方式来做一些不再涉及使用的事情mPrivMember
。所以你删除mPrivMember
并DoSomething
以其他方式重新实现。
现在,如果您的类之外有代码 using mPrivMember
,则该代码将不再编译,因为您mPrivMember
在重新实现时删除了DoSomething
. 为了防止此类代码的存在,您限制对mPrivMember
. 这样做的机制是通过访问限定符,例如private
和protected
。
这使您可以在将来重构代码,而不必担心其他代码可能会使用内部成员。
回顾
public
private
并且protected
是 C++ 中的编译时机制。它们不存在于程序生成的二进制形式中,因此不会强制执行此类保护。任何东西都可以从任何地方访问。
然而,在 Java 中,如果我没记错的话,可以在运行时创建类。这就是为什么它还必须在运行时检查访问以便它可以强制执行它们的原因,因此Private
Public
并且Protected
确实存在于 Java 二进制文件中。