Java接口与继承

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

我对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方法?

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


你应该用@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中的现有实现。