这是我学习java过程中遇到的一个概念问题,要讨论这个问题,首先我们应明白抽象类和接口肯定不能实例化;那么匿名内部类又是什么意思呢?且看下面代码。
public class TestHome {
public static void main(String[] args) {
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
Home h=new Home(){
@Override
public void playGames() {
System.out.println("I don't like playing games");
}
public void eat(){
System.out.println("I'm having lunch");
}
};
h.playGames();
//错误,不能调用eat方法
h.eat();
}
}
interface Home{
public void playGames();
}
//Aaa做上型转换就相当于一个Home类型的匿名内部类
class Aaa implements Home{
@Override
public void playGames() {
System.out.println("I don't like playing games");
}
public void eat(){
System.out.println("I'm having lunch");
}
}
我的理解是:创建一个对象的匿名内部类相当于创建了一个这个对象的子类,只是这个子类没有名字,我们要用特殊的写法来实现它。
匿名内部类只能调用重写方法,如果匿名对象里有成员变量,引用变量h还可以调用成员变量。但其不能调用自己的特有方法,这和上转型的作用是相同的。
接口、抽象类不能实例化与匿名内部类是不矛盾的,因为匿名内部类的实质是创建了一个没有名字的子类。相当于创建了一个新的类,并不是实例化接口。