Java t

Java t,java,inheritance,java-8,interface,static-methods,Java,Inheritance,Java 8,Interface,Static Methods,如果B和C重写从a继承的方法,D继承哪个方法 一个类可以实现多个接口,因为接口方法是约定重写的;如果类C实现了两个声明相同方法的接口a和B,那么C中的相同方法将被任一接口(a或B)的客户端调用。在Java8中为接口引入默认方法是通过强制实现者在出现歧义时重写默认方法实现的。这是一个可接受的折衷方案,因为默认方法旨在防御(如果实现者没有明确提供其他实现,则使用)。但是,由于编译器不能强制您重写静态方法(静态方法本身不能被重写),Java中为接口引入静态方法有一个限制:接口的静态方法不是继承的答案是

如果B和C重写从a继承的方法,D继承哪个方法


一个类可以实现多个接口,因为接口方法是约定重写的;如果类C实现了两个声明相同方法的接口a和B,那么C中的相同方法将被任一接口(a或B)的客户端调用。在Java8中为接口引入默认方法是通过强制实现者在出现歧义时重写默认方法实现的。这是一个可接受的折衷方案,因为默认方法旨在防御(如果实现者没有明确提供其他实现,则使用)。但是,由于编译器不能强制您重写静态方法(静态方法本身不能被重写),Java中为接口引入静态方法有一个限制:接口的静态方法不是继承的

答案是静态方法属于类/接口,静态块只有一个实例。这就是您不能重写任何静态方法的原因。

即使在类中,您也可以重写,但只能执行超类的静态方法。

静态方法永远不会被继承,它是由子类重新定义的。您能在接口中定义静态方法吗?我猜
Cat
只能扩展一个类,因此如果
Cat
扩展
Animal
Cat.identification
只有一个含义
Cat
可以实现多个接口,每个接口都可以有一个静态实现。哪一个是正确的?如果我再猜一次,我会说使用
default
实现是
Cat
vtable
的一部分。使用
静态
时,它不能是静态的。
main
函数必须绑定到某个对象。在编译时,
Cat.identify
可以被编译器替换为
Animal.identify
,但是如果Cat是重新编译的,而不是包含
main
@raxod502的类,那么代码将不符合实际情况。根据您的要求,我发布了一些注释作为答案这很有意义,但是我们不是已经有了默认方法的死亡钻石问题吗?编译器是否对此有解析支持(即,强制您实现一个新方法来解析不明确的默认继承)?为什么静态方法有什么不同?+1,但我刚刚写了一篇评论,大意是一样的。答案应该指出为什么相同(或类似)的机制对静态方法无效。@raxod502有人可能会说,静态成员的继承首先是一个错误,他们在这里做出了正确的选择。你真的不希望你的类被来自接口的所有静态方法污染,更不用说仅仅因为发生冲突就被迫引入虚假的静态方法了。你的编辑使类的静态方法(继承的)和接口的静态方法一样有效。那么问题是,为什么静态方法由子类继承?这是OP知道的。他在问为什么它是这样指定的,与类的静态成员相反。@WilliamF.Jameson更新了答案:)好的。。。但是,如果问题是方法的继承模棱两可,那么问题就变成了:“我们已经有了这个问题,使用默认方法。既然Java包括了对解决默认继承冲突的支持(请参见Styl回答的注释),为什么静态继承会有什么不同?”@控制论WerkGuruorc这很好,但我仍然没有弄清楚如何为静态方法执行多重继承。如果我使用接口,我必须用实现类的静态调用包装接口的静态方法调用。如果我使用一个子类,我就不能有多重继承。从我坐的地方看,它仍然很模糊。感谢您分享适当的答案@ButI'mNotAWrapperClass。从技术上讲,从Java 15开始,即使对于类,也不能重写(在动态分派的意义上)静态方法。但即使这是一个有争议的设计。@agbinfo“在编译时Cat.identify也可以被编译器替换为Animal.identify,但是如果Cat是重新编译的,而不是包含main的类,那么代码将不符合实际情况”-你能帮我理解这一点吗?您的意思是,如果main()方法中有语句“Cat.identify()”,编译器就不知道是否需要调用Animal.identify()或Cat.identify()?如果是这样的话,那么当我们在父类中有静态方法,但在子类中隐藏它们时,不是会发生这种情况吗?我不能理解这一部分。@shiva我已经很久没有用Java编程了。也就是说,在调用静态方法时,不需要指定类名吗?因此,
Cat.identify()
将毫无意义,除非它首先有一个定义。如果我调用
instance.identify()
@agbinfo,则情况并非如此。是的,它将需要类名。但是为什么编译器不能确保Cat.identify()具有静态方法的定义呢?最初的问题是为什么接口中的静态方法不能被继承。显而易见的答案是,一个类可以实现两个接口,并且两个接口可能具有相同的方法。但是,通过强制类提供其版本,默认方法解决了这个问题。从你的回答中我不明白的是,为什么不能对静态方法也执行相同的操作?@shiva编译器可以确保
Cat.identification()
有一个定义,但我的理解是,当你调用
Cat.identification()
时,你调用的是
identification()
方法的最“派生”版本。不仅仅是一种不同的方法。当为派生类调用
Cat.identify()
时,您允许开发人员最终为
identify()
提供一个定义,该定义更好地为该类定义,而无需更改代码的其余部分。对于静态接口方法,我想不出有什么好处。我
class Animal {
    public static void identify() {
        System.out.println("This is an animal");
    }
}
class Cat extends Animal {}

public static void main(String[] args) {
    Animal.identify();
    Cat.identify(); // This compiles, even though it is not redefined in Cat.
}
interface Animal {
    public static void identify() {
        System.out.println("This is an animal");
    }
}
class Cat implements Animal {}

public static void main(String[] args) {
    Animal.identify();
    Cat.identify(); // This does not compile, because interface static methods do not inherit. (Why?)
}
interface Floatable {

    default void float() {
        // implementation
    }

    static boolean checkIfItCanFloat(Object fl) {
         // some physics here
    } 
}

class Duck implements Floatable { }
public interface Foo {
  public static int bar();
}
public interface Foo {
  public static int bar() {
    ...
  }
}
module Foo
  def self.bar
    ...
  end
end
interface X
{
   static void foo()
   {
      System.out.println("foo");
   }
}

class Y implements X
{
}

public class Z 
{
   public static void main(String[] args)
   {
      X.foo();
      // Y.foo(); // won't compile
   }
}