匿名内部类必须继承一个父类(可以是抽象类,非抽象类)或者是实现一个接口,所以匿名内部类是一个非抽象类,只是没有类名。
这里用例子顺便复习下继承,多态的概念
首先定义一个非抽象类
class B {
int numB=2;
public void runB(){
System.out.println("B");
}
}
匿名内部类代码:
public static void main(String[] args) {
B b=new B(){
int numb=5;
public void run(){
System.out.println("匿名run");
}
public void runB(){
System.out.println("匿名runB");
}
};
}
new B()是一个匿名内部类(重写了类B{}里的实体内容),他与类B的关系是继承,这里是父类的引用的类型变量b指向了子类的对象,里面新定义了方法run()
和成员变量numb
执行:
System.out.println(b.numB);// 结果为2
System.out.println(b.numb);//报错,不能访问子类的成员变量。因为永远无法访问到,所以不要给匿名内部类定义成员变量.
执行:b.runB();
//如果没有重写runB()方法,则输出结果为"B",如果重写了runB方法则结果为"匿名runB";
执行:b.run();
//报错 ,多态情况下,不能调用子类特有的方法
如果想要使用给匿名内部类新增加的方法该如果做?
new B(){
public void run(){
System.out.println("匿名run");
}
}.run(); //输出为”匿名run”
接着抽象类
abstract class D{
int numD=4;
abstract public void runD();
}
匿名内部类代码:
D d=new D(){
int numd=5;
public void run(){
System.out.println("d");
}
public void runD() {
System.out.println("D");
}
};
这里的newD()与抽象类D的关系也是继承,下面的执行各种原因同上
d.run(); //报错
d.runD();//输出D
System.out.println(d.numD);//输出 4
System.out.println(d.numd);//报错
如果一个方法只用一次或者一个类只用一次就可以使用匿名内部类,简化重新定义一个类,再创建一个类的书写。
一般匿名内部类写法:
new 类名(){
重写某个方法
}.方法名
如:
new D() {
public void runD() {
重写方法体
}
}.runD();