我们都知道java不支持多继承,就是一个子类不能有两个或多个父类,但是可以通过实现接口实现多实现,个人感觉也就是变相的多继承了,只不过是方法的实现交给了别人。

在我们所学的继承中是子类可以继承父类所有的成员变量和方法的(不包含private修饰的)

定义一个A类

public class A {
    private String name;
    String IDcard;
    protected int age;
    public int year;

    private void find(){
        System.out.println("find方法");
    }

    void find2(){
        System.out.println("默认");
    }

    protected void find3(){
        System.out.println("protected权限");
    }

    public void find4(){
        System.out.println("pubilc权限");
    }
}

然后B类继承A类

public class B extends A {

}

那么B类就拥有了A类的非private属性和方法

Java 不能被继承的类 java不支持多继承_子类

因为继承某一个父类之后如果我们子类对父类的某个方法的实现不满意的话是可以进行方法的重写的,这里是单继承所以并没有什么冲突的地方,如果说我修改了B类,现在B类不继承A类了,我还给B类添加了find4方法

public class B  {
    public void find4(){
        System.out.println("B类的pubilc权限");
    }

}

现在有一个C类来继承A类和B类,那么问题就来了,如果我的C类并没有重写find4的方法,我通过继承就是将父类的非private属性和方法都继承下来了,但是A类和B类都拥有find4方法,那么我调用的时候究竟是调用哪一个呢?这就造成了混乱,所以java里面是不允许多继承的。

多继承不行但是可以多实现,但是接口里面的方法在都是一些抽象方法(当然也有静态方法,jdk8之后还有了默认方法),这些抽象方法的实现就交给了别人来实现并不是自己实现的,所以多实现是可以的,但是在jdk8是出现了默认方法,我刚刚前面不是说到了多实现就是变相的多继承嘛,多了个默认方法又使得多实现会混乱了

interface faceA                   //定义接口faceA
{   
    void someMethod( );
    
    default public void DefaultMethod( )//定义接口中默认方法
    {
        System.out.println("Default method in the interface A");
    }
}
interface faceB                   //定义接口faceB
{  
    default public void DefaultMethod( )//定义接口InterfaceB中同名的默认方法
    {
        System.out.println("Default method in the interface B");
    }
}
class DefaultMethodClass implements faceA,faceB  //定义子类实现接口InterfaceA, InterfaceB
{  public void someMethod( )                    //实现接口InterfaceA的抽象方法
   {
        System.out.println("Some method in the subclass");
    }  
}
public class Interfacsamedefaults
{  
    public static void main(String[] args)
    {  
        DefaultMethodClass def = new DefaultMethodClass( );
        
        def.someMethod();               //调用抽象方法
        def.DefaultMethod();            //调用默认方法      
    }
}

Java 不能被继承的类 java不支持多继承_子类_02

实例化子类DefaultMethodClass的对象时,编译器不知道应该在两个同名的default方法中选择哪一个,因此产生了二义性。因此,一个类实现多个接口时,若接口中有默认方法,不能出现同名的方法。

Java之所以禁止多继承,就是想避免类似的二义性。但是接口中允许实现默认方法,又回到“二义性”的灾难之门

为什么接口会有默认方法?


以前创建了一个接口,并且已经被大量的类实现。 如果需要再扩充这个接口的功能加新的方法,就会导致所有已经实现的子类需要重写这个方法。 如果在接口中使用默认方法就不会有这个问题。 所以从 JDK8 开始新加了接口默认方法,便于接口的扩展。


所以很多时候都是有两面性的,只能自己根据实际情况使用了,但是我平时还没有使用过接口的默认方法。