返回信息流1、为什么非静态内部类无法声明静态成员变量和静态成员函数?
2、为什么静态内部类只能访问外部类的静态成员变量和静态成员方法,而非静态内部类可以访问外部类的所有成员变量和成员方法?
3、为什么创建非静态内部类的实例必须通过一个外部类的实例,而创建一个静态内部类的实例就不需要?
期待详细的涉及到底层JVM机制的解释。
这是一条镜像帖。来源:北邮人论坛 / java / #58157同步于 2017/11/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
静态内部类与非静态内部类
gxlihao
2017/11/25镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
第一个没试过,2.即使对于一个普通类,其静态方法也只能访问自己的静态字段,类比类的字段,静态内部类只能访问外部类的静态变量,否则静态内部类将可以一次性访问类的所有实例,改动一个对象,就会改动所有对象。 3.因为非静态内部类访问了类的非静态成员,而外部类的非静态成员实例化后都是对象的独立字段(非所有类对象共享),因此从逻辑上说非静态内部类对象依赖具体的外部类对象。 //刚试了1,确实不能在非静态内部类中定义静态字段,除非是final的。我猜了一下设计原因,就像3中所说,非静态内部类依赖于外部类对象,如果外部类对象a新建了一个内部类对象b,外部类对象a2新建了一个内部类对象b2,从逻辑上来说b依赖a,b2依赖a2,那么b和b2间不应该有逻辑粘连。如果非静态内部类存在静态字段,那么在操作b的过程中会改变该内部类静态字段,有可能影响b2的逻辑。但是本身b和b2应该是逻辑分离的。除非这个静态变量是final的。(但是即使定义final的静态字段,仍然有办法让b和b2通过该final静态字段耦合在一起,具体应该看业务的需求。最好不用)
《Think in C++》?
【 在 intmain 的大作中提到: 】
: 感觉2,3问题原因类似
: 非静态内部类的对象在创建时需要与一个外部类的对象绑定
: thinking in c++中有详细介绍
以下是我的理解,不一定对,但道理说得通
1.既然是非静态内部类,那就是属于某个实例的,那你声明静态成员变量就会每个实例都有一个,然后每个实例都可以修改,就会引起混乱。
2.既然是静态内部类,那它就是属于这个外部类而不是某个实例的,那你访问外部非静态变量的时候,到底访问的是哪个实例的?非静态内部类是属于某个实例的,那它访问外部类任何变量都能知道是属于谁的变量。
3.跟1,2类似,想想应该能明白。