1,如何定义内部类 把一个类放在另一个类的内部即可 - public class Outer
- {
- class Inner
- {
- }
- }
复制代码 2,内部类的划分: 成员内部类: 非静态内部类 静态内部类 匿名内部类 局部内部类 成员内部类的意思是把这个类当做外部类的一个成员,等同于属性、方法、构造器的地位。 成员内部类是类成员,故可以同方法一样可以用public、protected、private修饰。 匿名内部类、局部内部类则不是类成员。
3,访问规则 非静态内部类可以访问外部类private成员。原因:在非静态内部类对象里,保存了一个它寄存的外部对象的引用。举例说明: - public class Outer{
- private int x = 10;//外部类属性 x
- private int y = 100;//外部类属性 y
- public Outer(){
- System.out.println("Outer"+"-->"+x);
- }
- class Inner{
- private int x = 12;//内部类成员 x
- public Inner(){
- int x = 20; //内部类局部变量 x
- System.out.println("Inner"+"-->"+x);
- System.out.println("Inner"+"-->"+this.x);
- System.out.println("Inner"+"-->"+Outer.this.x);
- System.out.println(y);//当发生调用时,其实是有一个Outer.this引用
- }
- }
- public static void main(String args[]){
- new Outer().new Inner();
- }
- }
复制代码- ---------- 运行java程序 ----------
- Outer-->10
- Inner-->20
- Inner-->12
- Inner-->10
- 100
- 输出完成 (耗时 0 秒) - 正常终止
复制代码结论: 1, 当在非静态内部类的方法内访问某个变量时(以 y为例),系统优先在该方法内产值是否存该名字的局部 变量,如果存在该名字的局部变量,就使用该变量;如果不存在,则到该方法所在内部类中 查找是否存在该名字的属性,存在则使用该属性;不存在则到内部类所在的外部类中查找是 否存在该名字的数组,存在则使用。如果还是没找到,则编译报错。 2,当外部类属性、内部类属性与内部类方法的局部变量同名(如 x),则可以通过使用this 、外部类名.this来指定调用谁的x。当不指定时参考第一条
写在后面的
由于时间有限,还有很多细节没写。推荐一个本书《疯狂java讲义》第六章 面向对象 内部类。讲的很详细。就是给的程序太啰嗦。
我写的例子就是简单粗暴了点,主要是方便说明问题。
建议:
把继承 构造器 this super引用好好看懂。
|