如何证明Java不支持多重继承?

时间:2014-04-16 06:13:30

标签: java oop

我们如何证明java不支持多重继承?

是否有任何替代方法可以在Java中实现多重继承?

6 个答案:

答案 0 :(得分:6)

  

我们怎样才能证明java不支持多重继承?

相同的包中创建3个类,让我们说Test1Test2Test3。试试这个。您将收到错误

public class Test extends Test2, Test3
{
    public static void main(String[] a)
    {
        // ...
    }
}
  

是否有任何替代方法可以在Java中实现多重继承

是的,您可以让您的班级实现多个(1个或多个)接口

答案 1 :(得分:4)

java中有 no multiple inheritance ,因为它是由语言规范指定的。

要证明它只是尝试扩展2个不相关的类:

public class MyClass extends Number, AbstractList {

}

这将导致编译错误。

你可以做一件事:

摘自java magic part 4: Unsafe

  

多重继承

     

java中没有多重继承。   正确,除非我们可以将每种类型转换为彼此,如果我们想要的话。

long intClassAddress = normalize(getUnsafe().getInt(new Integer(0), 4L));
long strClassAddress = normalize(getUnsafe().getInt("", 4L));
getUnsafe().putAddress(intClassAddress + 36, strClassAddress);
  

此代码段将String类添加到Integer个超类,因此我们可以在没有运行时异常的情况下进行转换。

(String) (Object) (new Integer(666))

我真的 不推荐 这个。如果你想要一些类似于多重继承的东西,或者其他人指出你也可以使用组合委托,那么它被认为是实现多个接口的“最佳实践”。 p>

答案 2 :(得分:3)

  

是否有任何替代方法可以在Java中实现多重继承

根据您的需要,您可以使用

获得几乎相同的效果
  • 实施多个接口

  • 使用对象组合和委托方法调用实现您原本继承的片段的对象

答案 3 :(得分:2)

Java不支持多重继承,但在Java中,您可以使用称为“接口”的不太复杂的功能来实现多重继承。

答案 4 :(得分:1)

如果一个类直接从两个或多个类继承,那么它将是多个继承。但在java中这是不允许的。

我们不需要在java语言规范中指定的证明。

但是如果你需要一个证明,请尝试在下面编译(这不会编译)

class A{
 void doSomething(){
   System.out.println(“from class A”);
 }
}


class B{
 void doSomething(){
  System.out.println(“from class B”);
 }
}


class C extends A,B{
  public static void main(String arr[]){
   C cob= new C();
   cob.doSomething();//now how does compiler knows which super method to call?
  }
}

Java的创建者选择不允许多重继承的原因是它可能变得非常混乱。但实际上你可以拥有这样的东西。

public interface InterfaceA {

  public void doSomething();
}



public interface InterfaceB {

 public void doSomething();
}



 public interface InterfaceC extends InterfaceA, InterfaceB {

  //same method is declared in InterfaceA and InterfaceB both
  public void doSomething();

 }

答案 5 :(得分:0)

class A
{
  public void methodAClassA()
  {
  System.out.println("In ClassA MethodA");
  }
}
class B extends A{
  public void methodAClassA(){
  System.out.print("in Class B Method ClassA");
  }
}
class C extends A,B {}

这是不可能的,因为  如果你使用上面的代码编译器没有  知道在C类中可以使用哪种实例方法  因此他们将其视为错误,它将显示编译错误。