OOP访问修饰符:编译时或运行时

Mah*_*hdi 6 c++ java compiler-construction oop

我听说Access Modifiers Public, Private and Protected只是一些Compiler Stuff,它们实际上并不存在于已编译的二进制代码中.

现在我想知道它是多少是正确的?如果它是正确的,是否意味着在运行时二进制代码中不存在封装?因此,如果您修改二进制文件以Private非法访问方法,理论上,没有任何东西可以检查您的权利,无论是任何OOP机制还是操作系统,对吧?

我还标记了C++和Java的问题.我知道它们之间的区别,只是好奇地看到它们处理Access Modifiers有多么不同.

Ed *_*rbu 7

访问修饰符只是C++中的编译时机制.但是在Java中,它们也在运行时强制执行,因为Java也有一个运行时类型系统,它可以动态地(在运行时)创建类.因此,它需要在运行时对其在编译时不知道的类型强制执行访问.

为什么要使用访问修饰符?

访问修饰符的唯一目的是强制设计.

假设您有一个A实施的课程

class A
{
public:
  void DoSomething()
  {
    // use private member mPrivMember to do something
  }
private:
  int mPrivMember;
}
Run Code Online (Sandbox Code Playgroud)

还有一些使用类的代码A:

A a_obj;
Run Code Online (Sandbox Code Playgroud)

上面的代码可以调用a_obj.DoSomething(),但是他们没有直接访问mPrivMember,所以a.mPrivMember写在外面的类A不会编译.

现在,为什么你想要一些成员可以访问外部代码而有些成员不可访问?好了,这是为什么:目前,该方法DoSomething()使用mPrivMember实际做的东西.但是过了一段时间,你可能会决定要在DoSomething中重构代码,以改进它.你找到了一种不同的方式去做一些mPrivMember不再使用的东西了.所以你删除mPrivMember并重新实现DoSomething其他方式.

现在,如果您的类外部有代码使用mPrivMember,则该代码将不再编译,因为您mPrivMember在重新实现时已删除DoSomething.为防止此类代码存在,您可以限制访问mPrivMember.这样做的机制是通过访问限定符,如privateprotected.

这允许您在将来重构代码而不必担心其他代码可能使用内部成员.

概括

public private并且protected是C++中的编译时机制.它们不存在于程序生成的二进制形式中,因此不会强制执行此类保护.任何地方都可以访问.

但是在Java中,如果我没有弄错的话,可以在运行时创建类.这也是为什么它还必须在运行时检查访问权限以便它可以强制执行它们,因此Private Public并且Protected确实存在于Java二进制文件中.