浅谈接口、抽象类不能实例化与匿名内部类是否互相矛盾

这是我学习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还可以调用成员变量。但其不能调用自己的特有方法,这和上转型的作用是相同的。

接口、抽象类不能实例化与匿名内部类是不矛盾的,因为匿名内部类的实质是创建了一个没有名字的子类。相当于创建了一个新的类,并不是实例化接口。

猜你喜欢

转载自blog.csdn.net/InfiniteNonCyclicLT/article/details/81216075
今日推荐