0

我是 Java 新手,我了解继承的基本基本概念。我有一个关于通过超类引用的问题。由于从超类继承或使用接口实现的类的方法可以通过超类引用(接口或类)来引用。当扩展和实现都涉及一个类时,它将如何工作?

class A {
  void test() {
    System.out.println("One");
  }
}

interface J {
  void first();
}

// This class object can referenced using A like A a = new B()
class B extends A {
  // code    
}

// This class object can referenced using J like J j = new B()
class B implements J {
  // code
}

// my question is what happens in case of below which referencing for runtime polymorphism?
class B extends A implements J {
  // code 
}

哪个无法编译:

Main.java:16:错误:重复类:B
B 类实现 J {
^
Main.java:21:错误:重复类:B
B 类扩展 A 实现 J {
^
2 个错误
4

2 回答 2

0

当扩展和实现都涉及一个类时,它将如何工作?

假设这是你的问题。

extends关键字用于扩展超类。

implements用于实现接口


接口和超类之间的区别在于,在接口中你不能指定整体的特定实现(只有它的“接口”——接口不能被实例化,而是被实现)。所以这意味着你只能指定你想要的方法合并,但不以同样的方式在您的项目中实施它们。

于 2013-08-24T16:09:23.263 回答
0

引用超类方法与接口方法时可能存在一些差异,尤其是在您使用super它们调用时。考虑这些接口/类:

public interface MyIFace {
    void ifaceMethod1();
}


public class MyParentClass {
    void parentClassMethod1();
}

public class MyClass extends MyParentClass implements MyIFace {

    public void someChildMethod() {
        ifaceMethods(); // call the interface method
        parentClassMethod1(); // call the parent method just like you would another method. If you override it in here, this will call the overridden method
        super.parentClassMethod1(); // you can use for a parent class method. this will call the parent's version even if you override it in here
    }

    @Override
    public void ifaceMethod1() {
      // implementation
    }

}

public class AnExternalClass {
    MyParentClass c = new MyClass();
    c.parentClassMethod1(); // if MyClass overrides parentClassMethod1, this will call the MyClass version of the method since it uses the runtime type, not the static compile time type
}

一般来说,不调用方法super会调用该类的运行时版本实现的方法(无论该方法是来自类还是接口)

于 2013-08-24T16:10:07.763 回答