OOP访问修饰符:编译时或运行时(OOP Access Modifiers: Compile-tim

2019-07-22 14:18发布

我听说访问修饰符 Public, Private and Protected只是一些编译器的东西,他们是在编译的二进制代码并不实际存在。

现在,我不知道它有多少是正确的? 如果这是正确的,这是否意味着封装未在运行时的二进制代码存在吗? 所以,如果你修改二进制访问Private非法方法,从理论上讲,没有什么检查您的权利,既没有任何OOP机制,也没有操作系统,对不对?

我也标记为C ++和Java的问题。 我知道他们之间的区别,只是好奇,想看看他们是如何处理不同的访问修饰符

Answer 1:

访问修饰符只在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 ,该代码不会了,因为你已经删除编译mPrivMember重新实现时DoSomething 。 为了防止这种代码的所有脑干,你限制访问mPrivMember 。 做到这一点的机制是通过预选赛获得诸如privateprotected

这可以让你无需担心其他代码可能会使用内部成员在重构未来的代码。

概括

public privateprotected在C ++编译时的机制。 他们不会在你的程序生成的二进制形式存在,正是如此这样的保护没有得到执行。 什么是从任何地方访问。

在Java然而,可以在运行时,如果我没有记错创建类。 这就是为什么它也必须检查在运行时访问过,因此它可以执行它们,因此有理由Private PublicProtected在Java二进制确实存在。



Answer 2:

请注意,这个答案是相对于Java的
都。 如果你尝试编译它试图访问不可访问的对象或方法的代码,你会得到编译时错误:

在运行时,JVM检查访问:

您将获得以下情况例外,如果你尝试在运行时访问。 不当访问级别java.lang.IllegalAccessError:

希望能帮助到你



Answer 3:

编译的C ++代码没有任何私有/保护/公共的概念。 它下降到机器代码,它没有这些概念。 如果没有为原生支持,你怎么能支持他们? 更重要的是,你怎么能甚至使该原生支持。

访问修饰符是人类,而不是机器。 访问修饰符设计方面,而不是安全方面。

TL;博士 :到时候C ++代码实际上运行的机器已经不知道私人/公共/受保护曾经存在过。



文章来源: OOP Access Modifiers: Compile-time or Run-time