Java接口与继承
我对Java接口和继承有一个非常基本的怀疑。 假设我有两个类A和B,还有一个接口C,定义如下Java接口与继承,java,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 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方法?这两者都有,它们并不是相互排斥的。接口的目的是定义应该在实现类中可用的方法签名
你应该用@Override注释这个方法,这是一种很好的形式,因为它清楚地表明它来自一个基类,并且可以防止意外的输入错误。这两者都有,它们不是相互排斥的。接口的目的是定义应该在实现类中可用的方法签名
您应该使用@Override注释该方法,这是一种很好的形式,因为它清楚地表明它来自一个基类,它将保护您避免意外的打字错误。它既是凌驾性的,也是实现性的。它既是凌驾性的,也是实现性的。正如@Jeroen Vannevel和@EJP在上面提到的,它既是覆盖性的,也是实现性的 为了理解这一点,我认为您需要在编译/运行时的上下文中看到它 您有以下可能的场景:
C c = new B();
c.check();
在编译时,您可以看到Ccheck,在运行时,您可以使用IDE获取c.check指向的位置,您可以看到被重写的Bcheck
在编译时,您可以看到Acheck,您可以使用IDE在运行时看到被重写的Bcheck时获取c.check指向的位置
在编译时,您可以看到Bcheck,在运行时,您可以使用IDE获取c.check指向的位置,您可以看到被重写的Bcheck
或者,如果您在方法中直接传递方法调用:
someMethod(new B().check())
那么这就等同于上述场景中的最后一个,因为@Jeroen Vannevel和@EJP已经在上面提到了它的覆盖和实现 为了理解这一点,我认为您需要在编译/运行时的上下文中看到它 您有以下可能的场景:
C c = new B();
c.check();
在编译时,您可以看到Ccheck,在运行时,您可以使用IDE获取c.check指向的位置,您可以看到被重写的Bcheck
在编译时,您可以看到Acheck,您可以使用IDE在运行时看到被重写的Bcheck时获取c.check指向的位置
在编译时,您可以看到Bcheck,在运行时,您可以使用IDE获取c.check指向的位置,您可以看到被重写的Bcheck
或者,如果您在方法中直接传递方法调用:
someMethod(new B().check())
那么这就等同于您的示例中上述场景的最后一个:
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");
您可以这样做,因为在创建接口时,接口不包含接口中方法的定义,因此可以反复用于类似的事情,只需稍加调整即可使用相同的方法 在您的示例中:
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");
您可以这样做,因为在创建接口时,接口不包含接口中方法的定义,因此可以反复用于类似的事情,只需稍加调整即可使用相同的方法 两者都有。方法签入B实现了接口C中的方法,但它覆盖了超类A中的现有实现。方法签入B实现接口C中的方法,但它覆盖超类A中的现有实现。