我对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()方法?
答案 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");
您可以这样做,因为接口在创建时不包含接口中方法的定义,因此可以反复使用类似于使用相同方法的方法。一些调整。