内部类是第五大成员
底层源码有大量的内部类
局部内部类
局部内部类是定义在外部类的局部位置,通常在方法,可以直接访问外部类的所有成员,包括私有的,不能添加访问修饰符,可以用final修饰
作用域仅在方法或代码块{}
中
public class Main{
public static void main(String[] args){
Outer o = new Outer();
o.m();//100
}
}
class Outer{
private int n = 100;
public void m(){
class Inner{
public void f(){
System.out.println("n=" + n);
}
}
Inner i = new Inner();
i.f();
}
}
外部类在方法中,可以创建内部类实例,然后调用方法即可
细节
不可直接访问
如果重名,遵从就近原则,如果想访问,用外部类.this.属性访问
匿名内部类
非常重要!!!
该类没有名字
分清编译类型(=左边)和运行类型(匿名内部类)即可
在底层,class xxxx implements TA(){
…
}
public class Main{
public static void main(String[] args){
IA t = new IA(){
public void cry(){
System.out.println("aaaa");
}
};
System.out.println(t.getClass());//获得运行类型class Main$1
}
}
interface IA{
public void cry();
}
把实例的地址返回给t
匿名内部类使用一次就不能再次使用
匿名内部类使用、细节和实践
可以重写方法
如果是抽象类必须重写方法
匿名类不能写重写构造函数
会直接调用父类的
public class Main{
public static void main(String[] args){
IA t = new IA(){
public void cry(){
System.out.println("aaaa");
}
};
t.cry();
/*
输出
super.IA
aaaa
*/
}
}
class IA{
public IA(){
System.out.println("super.IA");
}
public void cry(){
}
}
也可以直接调用
new IA(){
public void cry(){
System.out.println("aaaa");
}
}.cry();