java - 内部类对象
问题描述
我无法理解以下代码的行为。
我的期望是它应该在这两种println()
方法中打印 100。为什么结果不一样?
如果我getX()
在内部类中取消注释方法,则println(
) 方法的输出相同,即 100。
我无法弄清楚不同行为的原因。请帮我理解。
public class Foo {
public static void main(String[] args) {
MyOuter outerObj = new MyOuter();
MyOuter.MyInner innerObj = outerObj.new MyInner();
innerObj.setX();
System.out.println("x: " + innerObj.getX()); //x: 3
System.out.println("x: " + outerObj.getX()); //x: 100
}
}
class MyOuter {
private int x = 3;
public int getX() { return x; }
class MyInner extends MyOuter {
public void setX(){ x = 100; }
// public int getX() { return x; }
}
}
解决方案
从MyInner
的角度来看,这里有两个private int x
领域在起作用:
super.x
继承自 的一个字段MyOuter
,但由于被声明为 而无法访问private
,并且MyInner
作为继承对象无法访问此字段。MyOuter.this.x
来自sorroundingMyOuter
-instance的一个字段(因为MyInner
是(非静态)内部类,它总是绑定到环境的实例MyOuter
),这是可访问的。
setX()
中的方法MyInner
无法访问继承的字段super.x
,因此它访问该字段MyOuter.this.x
并将其值设置为100
。对周围MyOuter
的连续呼叫getX()
将返回100
。
调用innerObj.getX()
(从 继承MyOuter
并可以访问super.x
)返回继承字段的值super.x
(仍然具有其初始值3
)。
如果我们删除extends MyOuter
from 并将getX()
-method包含在 中MyInner
,则代码将按预期运行。
MyInner
无法访问继承字段的事实private x
起初令人困惑,但该行为实际上与Hariharan在这篇文章中讨论的protected
继承类中静态方法的上下文中关键字的行为一致
推荐阅读
- kubernetes - 自定义 helm 图表 - helm dep 更新失败并出现错误:在 repo https://kubernetes-charts.storage.googleapis.com 中找不到 stable/nginx-ingress 图表
- sql - Oracle Sorted Nested 查询和 Exists 优化
- javafx - 错误:无法找到或加载主类 com.sun.javafx.css.parser.Css2Bin
- visual-studio-2015 - 如何解决“无法打开包含文件'odb_API.h'”ABAQUS 2018
- javascript - 在 for 循环中发出构建字符串
- python - 有没有更 Numpy 的方式来插值我的栅格?
- python - 获取 Zip 存档中的文件路径,这些路径可以传递给实用程序进行处理。 - Python
- java - 如何将 DSL 语法转换为脚本语法
- sql - postgresql 在 CONFLICT 更新上使用插入以获取流号
- elasticsearch - 比较elasticsearch索引中不同的文档字段值