`
fantaxy025025
  • 浏览: 1311238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

【朝花夕拾】java内部类,原理,使用

阅读更多

=

碰到类似问题,多读《thinking in java》。

=

 

多从更高的视角看问题。

 

设计者在设计的时候,为什么让内部类访问外部类的各种私有内容(变量和函数)?

进一步推论:因为外部成员变量是new出来的,等价于内部类(实例)持有外部类(实例)的引用。为什么?

再进一步推论:内部类不能单独new,只要单独new,就不能持有外部实例的引用了,因为外部实例很可能还没有创建。

再进一步推论:内部类只能被外部类来创建。

等价于:内部类是外部类的私有物品,只不过外部类可以暴露出来给外部使用,但外部不能随便创建。

 

有了上面的推理和设计视角,可以更容易理解下面的文章:

https://blog.csdn.net/wint_ing/article/details/81360278

 

publicclass A {

publicclass B {

 

}

};

 

需要实例B类时,按照正逻辑是,A.B ab = new A.B();

那么编译器就会出现一个错误–“is not an enclosing class”

 

再翻看相关的Java代码,发现原来写法出错了!正确的做法是

 

Aa = new A();

A.B ab = a.new B();

 

没有静态(static)的类中类(内部类)不能使用外部类进行.操作,必须用实例来进行实例化类中类.

 

内部类如何获得外部实例?

 

public Table getTable() {
    return Table.this;
}

这种语法是特殊规定的。

 

内部类的使用场景?

母子关系。

 

先有母,再有子。子持有母的引用。

 

最近在设计内存表的结构时,发现很符合内部类的设计初中。

Table

Row

先有table,再有row。row持有table的引用。

 

====分隔符====

参考《三种内部类的一些小总结》:

https://blog.csdn.net/m0_67713132/article/details/124829831

这篇文写的比较简单,没什么原理性内容。

 

参考:《深入理解Java中为什么内部类可以访问外部类的成员》

https://blog.csdn.net/fengyuyeguirenenen/article/details/123070246

这篇文章比较搞笑,题目的问题如果需要去看字节码来找原因,类似于研究治水需要去研究水分子一样。

-

-

-

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics