JavaEE-10-内部类(Java)
内部类定义:
将一个类定义在另一个类里面,对里面那个类就称为内部类(内置类,嵌套类)
主要分为四种:非静态内部类,静态内部类,匿名类,本地类
访问特点:
1.内部类可以直接访问外部类的成员,包括私有成员;(这是内部类的最大优点)
2.外部类要访问内部类的成员,必须要先建立内部类的对象。
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
举例:Outer.Inner oi = new Outer().new Inner();
使用场所:一般用于类的设计:
分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。
这时就是还有的事物定义成内部类来描述。
内部类的修饰符:
1.如果内部类是静态的,相当于一个外部类,因此只能访问外部类的静态成员;
访问方式:外部类名.内部类名 对象名 =new 外部类名.内部类名();
举例:Outer.Inner oi = new Outer.Inner();
2.如果内部类中定义了静态成员,该类也必须是静态的。
为什么内部类能直接访问外部类中成员呢?
那是因为内部类持有了外部类的引用:外部类名.this。
举例:System.out.println(Outer.this.num);//此时访问的num是外部类Outer的成员变量
1 class Outer{ 2 public int num = 10; 3 class Inner{ 4 public int num =20; 5 public void show(){ 6 int num = 30; 7 System.out.println(num);//就近原则,num=30 8 System.out.println(this.num);//Inner类调用show方法,所以num=20 9 System.out.println(Outer.this.num);//通过外部类名限制this对象,num=10 10 } 11 } 12 }
Class InnerClassTest{
public static void main(String[] args){
Outer.Inner oi = new Outer().newInner();
oi.show();
}
}
内部类在局部位置上只能访问局部中被final修饰的局部变量,如下例:
原因:因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。
为了让数据还能继续被使用,就用final修饰,这样,在堆内存里面存储的其实是一个常量值。
1 class Outer 2 { 3 int num = 3; 4 void method() 5 { 6 final int x = 9; 7 class Inner 8 { 9 void show() 10 { 11 System.out.println("show ..."+x); 12 } 13 } 14 Inner in = new Inner(); 15 in.show(); 16 } 17 } 18 19 class InnerClassDemo3 20 { 21 public static void main(String[] args) 22 { 23 new Outer().method(); 24 } 25 }
匿名内部类:
就是内部类的简写格式。(其实就是一个子类对象)
(使用接口或者抽象类时,都必须创建一个子类,才能实现其方法。有时候为了快速使用,直接实例化一个抽象类,并“当场实现其抽象方法”,既然实现了抽象方法,那么就是一个新的类,只是这个类没有命名,称为“匿名类”)
前提:内部类必须继承或者实现一个外部类或者接口。
格式:new 父类or接口() {子类内容}
使用场景:当函数参数是接口类型时,而且接口中的类型不超过三个,可以用匿名内部类作为实际参数进行传递。
举例:
1 class Outer 2 { 3 int num = 4; 4 /* 5 class Inner extends Demo //方式一 6 { 7 void show() 8 { 9 System.out.println("show ..."+num); 10 } 11 } 12 public void method() 13 { 14 new Inner().show(); 15 } 16 */ 17 public void method()//方式二 18 { 19 //new Inner().show(); 20 new Demo() 21 { 22 void show() 23 { 24 System.out.println("show ..."+num); 25 } 26 }.show(); 27 } 28 } 29 30 class InnerClassDemo4 31 { 32 public static void main(String[] args) 33 { 34 new Outer().method(); 35 } 36 }