2014-10-29 63 views
1

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

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类?

+3

这是两个。'B'中的方法'check'在接口'C'中实现该方法,但它覆盖了超类'A'中的现有实现。 – 2014-10-29 08:14:01

回答

8

它既确实又不互相排斥。接口的目的是定义一个应该在实现类中可用的方法签名。

你应该用@Override注解该方法,但它只是一个很好的形式,因为它明确表示它来自基类,它会防止你意外错别字。

2

它既是超越又是实施。

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()) 

那么这相当于在过去的上述情况

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"); 

你被允许做到这一点,因为接口在创建接口时不包含接口中方法的定义,因此可以一次又一次地使用相似度足以使用调整方法相同。