内部类访问特点:
1.内部类可以直接访问外部类中的成员。
2.外部类要访问内部类,必须建立内部类的对象。
一般用于类的设计:
分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。
这时就是还有的事物定义或内部类来描述。
例:
class Outer{
private int num =3;
class Inner {
void show(){
System.out.println("show run :"+ num);
}
}
}
//直接访问外部类中的内部类中的成员。
Outer.Inner in = new Outer().new Inner();
in.show();
//如果内部类是静态的,相当于一个外部类
//如果类是静态,那么类中使用的变量也应该为静态。
Outer.Inner in = new Outer().Inner();
in.show();
class Outer{
private static int num =3;
static class Inner {
void show(){
System.out.println("show run :"+ num);
}
static void function(){
System.out.println("show run :"+ num); }
}
}
调用:Outer.Inner.function();
//如果内部类中定义了静态成员,该内部类必须也是静态的。
class Outer{
int num =3;
class Inner {
int num=4;
void show(){
int num=5;
System.out.println(Outer.this.num);
}
}
void method(){
new Inner(). show();
}
//Q:为什么内部类能直接访问外部类中成员呢?
//A:内部类持有外部类的引用。 外部类名.this
//内部类可以存放在局部位置上
//从内部类中访问局部变量 X , 需要被声明为最终类型即:final 修饰,X为 常量。
//内部类在局部位置上只能访问 局部中被final修饰的局部变量。
如:
void method(){
final int x = 9;
class Inner{
void show(){system.out.println("show"+ x);};
}
new Inner().show();
}
//匿名内部类,就是内部类的简写格式。
//前提:内部类必须继承或实现一个外部类或者接口。
//匿名内部类:其实就是一个匿名子类对象。
// 格式 new 类名or 接口 (){子类内容}
abstract class Demo {
abstract void show();
}
Class Outer{
public void method(){
new Demo(){
void show(){
System.out.println("匿名内部类");
}.show();
}
}
}
//应用场景:
//当函数参数是接口类型时,而且接口中的方法不超过三个。可以用匿名内部类作为实际参数进行传递。