java不支持多继承,因为存在安全隐患,当多个父类中定义了相同的成员变量和相同的方法时,子类不确定要调用哪一个,但是java保留了这种机制,并用另一种体现形式来表示-也就是接口的多实现。我们可以通过下面两个例子来验证。
1.若子类继承的父类拥有相同的成员变量,那么子类在调用改成员变量时,就不确定调用哪个父类的成员变量如:
class A{//父类A
protected int num=0;
}
class B{//父类B
private int num=1;
}
public class C extends A,B{
public static void main(String[] args){
C obj=new C();
obj.print();//调用父类的成员变量,那num是0还是1?
}
public void print(){
System.out.println(super.num);
}
}
2.若一个子类继承的多个父类中拥有相同的方法,同时子类并未重写该方法,(若重写,则直接使用子类中该方法),那么调用时将不确定调用哪个方法。如:
public class A{
public void fun(){//父类A
System.out.println("Hello");
}
public class B{
public void fun(){
System.ot.println("Hello");
}
public class C extends A,B{
public static void main(String[] args){
C obj=new C();
obj.print();
}
public void print(){
System.out.println(sper.fun);// 因为父类都有//fun()方法,将无法确定使用,哪个父类中的方法。
}
}
因此当一个继承多个类时,如果继承的多个父类出现了相同的方法时,就出现了调用的不确定性,这个不确定是指方法体不确定虚拟机就挂了。然后解释为什么支持多实现:虽然实现了多个接口,但是接口中的方法没有方法体,不管你调用复写实现的接口中任意方法都是一样的,因为它没有方法体,方法明名相同也没问题。
在类中,只能做单重继承,而实现接口时,一次则可以实现多个接口,每个接口间使用逗号“,”分隔。如:
//类与类 ---继承
//类与接口---实现
//接口与接口---继承
public class A6_62接口_2 {
public static void main(String[] args) {
Students one=new Students();
one.smoket();
one.play();
}
}
interface smokets{//同一个包中接口不能重名
public abstract void smoket();
}
interface geme{
public abstract void play();
}
class Students implements smokets,geme{//注意在含有实现implements 关键字的类
//分别要实现接口的方法。
public void smoket(){
System.out.println("在吸烟");
}
public void play() {
System.out.println("在游戏");
}
}