java - OOP 访问修饰符 : Compile-time or Run-time

标签 java c++ oop compiler-construction

我听说访问修饰符 Public、Private 和Protected 只是一些编译器的东西,它们实际上并不存在于编译的二进制代码中.

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

我还标记了 C++ 和 Java 的问题。我知道它们之间的区别,只是想看看它们处理访问修饰符有何不同。

最佳答案

访问修饰符只是 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

现在,如果您的类之外有代码使用 mPrivMember,则该代码将无法再编译,因为您在重新实现 DoSomething 时删除了 mPrivMember >。为防止此类代码的存在,您限制对 mPrivMember 的访问。这样做的机制是通过访问限定符,例如privateprotected

这使您可以在将来重构代码,而不必担心其他代码可能会使用内部成员。

回顾

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

然而,在 Java 中,如果我没记错的话,可以在运行时创建类。这就是为什么它也必须在运行时检查访问权限以便强制执行它们的原因,因此 Private PublicProtected 确实存在于Java 二进制文件。

关于java - OOP 访问修饰符 : Compile-time or Run-time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15564011/

相关文章:

java - 更新 junit 在 @Rule 和 TestName 处出现编译错误

c++ - fork() 除了执行外部程序之外的用处

c++ - 错误 : no matching function for call to 'Subclass::...'

php - MVC 面向对象技术 - 如何最小化查询并保持灵活性?

javascript - 在 Javascript 中更改选定的对象

Java正则表达式用于删除除模式之外的所有字符

java - 如何部署 java derby 应用程序以分发给其他客户端

java - 如何在 Android 中的 AsyncTask 完成后更新 fragment ?

c++ - 为什么当我尝试使用带有参数的 priority_queue 作为指向结构的指针时会弹出错误

c++ - 广告牌 C++