Code Bye

JAVA中Interface不能创建对象么

interface Monster{
	void menace();
}
interface DangerousMonster extends Monster{
	public abstract void destroy(); 
}
interface Lethal{
	void kill();
}
class DragonZilla implements DangerousMonster{
	public void menace(){}
	public void destroy() {}
}
interface Vampire extends DangerousMonster,Lethal{
	void drinkBllod();
}
class VeryBadVampire implements Vampire{
	public void destroy() {	}
	public void menace() {}
	public void kill() {}
	public void drinkBllod() {}
}
public class InterfaceExtends {
	static void u(Monster b){
		b.menace();
	}
	static void v(DangerousMonster d){
		d.menace();
		d.destroy();
	}
	static void w(Lethal l){
		l.kill();
	}
	public static void main(String[] args){
		DangerousMonster barney = new DragonZilla();
		u(barney);
		v(barney);
		Vampire vlad = new VeryBadVampire();
		u(vlad);
		v(vlad);
		w(vlad);
	}
}

记得java中的interface不能创建对象。但代码中 new VerBadVampire()将其转型成为interface。而w方法中也是接收一个interface的参数。

解决方案

1

很明显是用接口具体类实现的,w方法接收的接口的子实现,自然能进行调用。

1

看下向上转型吧

6

Vampire vlad = new VeryBadVampire();这个并不是创建接口对象,而是创建子类对象(接口是不能创建对象的),然后赋给父类引用。
当调用viad(接口)中定义的方法时,jvm会调用具体对象(子类)的方法。这就是java的多态。
Vampire vlad = new VeryBadVampire();
u(vlad);
v(vlad);
w(vlad);
这个u,v,w三个方法参数声明为Vampire(接口),这个就是我们常说的面相接口编程。这样做的好处是,可以根据不同的业务,创建不同的接口(Vampire)实现类,而u,v,w这三个方法中的代码则不需要改变。这样就可以在改动很少的情况下扩展业务。

6

通俗易懂地讲,你就记住,接口不可以直接用于new的对象。但是可以作为参数类型以及类类型出现,new 后边跟着的必须是非接口类,但是new 出来的对象实例可以用接口类类型来接受,同样一个方法的参数类型也可以用接口类型,跟这个道理一样,只是使用接口类型,而不是用接口类去实例化对象,接口类型声明变量,接受的是其实现类new出来的对象,这也是java 实现多态的必要条件:用接口类型或基类类型去声明变量,来接收实现类或子类的对象,当变量调用成员方法时,调用的是其实现类或子类的方法。

6

1、首先只有实际的类才能new,而interface和abstract class都不可以new
2、接口或基类的引用变量可以指向实现类或子类的对象,这是java实现多态性的前提。
什么是多态?也就是用接口或基类声明的引用变量来指向实现类或子类的对象,从而调用该接口的方法时表现的是子类对象的方法。这样就可以达到接口重用的目的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明JAVA中Interface不能创建对象么