Java接口和继承

时间:2014-10-29 08:10:38

标签: java

我对Java接口和继承有一个非常基本的疑问。 假设我有两个类A和B,一个接口C具有以下定义

interface C{
 public void check();
}

class A implements C{
 public void check(){
  System.out.println("A");
 }
}

class B extends A implements C{

// Is the following method overriding the method from class A or implementing the method from C?
 public void check(){
  System.out.println("B");
 }

}

我很困惑,无论是在B级中覆盖还是实施check()方法?

4 个答案:

答案 0 :(得分:8)

两者兼而有之,它们并不相互排斥。接口的目的是定义应该在实现类中可用的方法签名。

你应该用@Override来注释方法,但这只是一个很好的形式,因为它清楚地表明它来自一个基类,并且它会防止意外的错别字。

答案 1 :(得分:4)

正如@Jeroen Vannevel和@EJP上面提到的那样,它都是压倒一切的。

为了理解这一点,我认为你需要在编译/运行时的上下文中看到它。

您有以下可能的情况:

C c = new B();
c.check();

编译时,您会看到C#check()(您可以使用IDE来获取c.check()指向的位置)运行时被覆盖的B#check()

A a = new B();
a.check();

编译时,您会看到A#check()(您可以使用IDE来获取c.check()指向的位置)运行时被覆盖的B#check()

B b = new B();
b.check();

编译时,您会看到B#check()(您可以使用IDE来获取c.check()指向的位置)运行时被覆盖的B#check()

如果您选择直接在方法中传递方法调用:

someMethod(new B().check())

然后这等同于上述最后一个场景

答案 2 :(得分:2)

这既是超越又是实施。

答案 3 :(得分:0)

在你的例子中:

class B extends A implements C{

// Is the following method overriding the method from class A or implementing the method from C?
 public void check(){
  System.out.println("B");
 }

}

您正在接口C中将检查方法定义为:

 public void check(){
  System.out.println("B");

您可以这样做,因为接口在创建时不包含接口中方法的定义,因此可以反复使用类似于使用相同方法的方法。一些调整。