java - 如何在内存级别通过类的成员函数访问类的私有(private)成员?

标签 java memory-management jvm

class TestMemberOuter1{
 private int data=30;
 class Inner{
  void msg(){System.out.println("data is "+data);}
 }

 void display(){
  Inner in=new Inner();
  in.msg();
 }
 public static void main(String args[]){
  TestMemberOuter1 obj=new TestMemberOuter1();
  obj.display();
 }
}

为什么内部类可以访问外部类的私有(private)成员?

我想知道什么实现[在较低级别(可能在内存级别或特定于 java 实现或任何其他不确定)] 能够在 java 中实现这种行为。

最佳答案

我不认为你不需要任何内存级别的修改或逻辑实现来实现这个,我也不认为 java 在内存级别有任何巨大的代码逻辑来实现相同的。

内存与它无关。 private、public和protected只是一个访问过滤器,无论是private、public还是protected,所有这些变量都将驻留在为对象分配的同一内存中。

私有(private)、公共(public)或 protected 变量没有不同的内存分配。它们最终都是同一对象的属性。

那编译器怎么处理这个???

它比那更简单。

这些访问过滤器清楚地告知他们应该被允许访问的上下文。

私有(private):仅在类中:)每当编译器发现在类之外的任何地方访问被证明的变量时,它都会标记错误,就是这样。

protected :同一包中的所有类:)每当编译器看到 protected 变量在包外的任何地方被访问时,它都会标记错误 Thats all。

公共(public):所有人都可以访问 :) 没有标志。

记住在上下文之外访问变量会导致编译器错误而不是运行时错误??出于同样的原因。

背后不需要庞大的逻辑,只需保留私有(private)变量、 protected 变量和公共(public)变量的列表并检查它们的用法是否合适即可。

编辑 根据您更新的问题“为什么内部类能够访问外部类的私有(private)成员?”

从我上面解释的相同类比得出结论,允许在类中的任何地方访问私有(private)变量。

现在你的内部类在哪里声明?作为外部类本身的一部分不是吗?因此,当您在内部类内部访问外部类的私有(private)变量时,编译器没有问题,因为您的内部类本身位于外部类中。

我希望我的回答有点道理 :) 编码愉快。

关于java - 如何在内存级别通过类的成员函数访问类的私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884074/

相关文章:

java - GC 的 Glassfish JVM 设置

java - 如何从 public static void main 调用另一个类的变量?

java - SqlResultSetMapping 列和实体

c++ - 我怎样才能安全地使用 strcpy

c++ - 比较对象相等性的指针 C++

java - "modern JVMs"与旧版 JVM 有何不同?

java - 将用户名和页面名称保留到数据库

java - 在 C++ 中有条件地调用 JNI

c++ - C++中的析构函数是否自动释放类内声明的指针变量的内存?

java - Tomcat突然死了