Java 如何';toString';在这里得到解决?

Java 如何';toString';在这里得到解决?,java,overriding,Java,Overriding,下面的接口I隐式地将类对象的公共方法作为抽象成员。其中之一是toString() 下面的类W继承类对象公共方法,其中一个是toString class W implements I{ public static void main(String[] args){ I w = new W(); w.toString(); //How toString() method is resolved here? } } 由于这两个,类W的超级接口(I)和超

下面的
接口I
隐式地将
类对象的公共方法作为抽象成员。其中之一是
toString()

下面的
类W
继承
类对象
公共方法,其中一个是
toString

class W implements I{
    public static void main(String[] args){
       I w = new W();
       w.toString();   //How toString() method is resolved here?
    }
}
由于这两个
类W
的超级接口(
I
)和超级类(
Object
)都有
toString()
方法

javac
如何在编译时解析
w.toString()
?我了解到这里使用的是
invokevirtual
指令


jvm如何在运行时解析
w.toString()

一个
接口不重写一个方法

此外,您的类不会重写方法
toString()
。您必须重写方法
toString()
,以使其出错


因此,它被简单地称为超类
对象
toString()
的实现,接口不会覆盖任何类中的方法。使用
toString()
方法时,默认的
toString()
对象执行,因为您的类
W
对象扩展而来。要了解更多信息,请重写类
W
中的
toString()
方法

@Override
public String toString() {

    return "Yo, baby! M here!";
}  
那么输出将是:

Yo, baby! M here!

接口没有任何超类,甚至对象类也没有

public class Main {
  public static void main(String[] argv) throws Exception {

    Class cls = java.lang.Cloneable.class;
    Class sup = cls.getSuperclass(); // will return null
  }
}
因此,接口从不重写对象类的方法

当接口没有直接的超级接口时,它将创建 中存在的所有这些公共方法的抽象公共方法 对象类


由于该方法是在接口类型为
I
的表达式上调用的,因此字节码将包含对应方法的指令

在运行时,将确定调用的方法

C
成为
objectref
的类。要调用的实际方法是 通过以下查找过程选择:

  • 如果
    C
    包含一个实例方法的声明,该方法与解析的方法具有相同的名称和描述符,那么它就是要调用的方法
  • 否则,如果
    C
    有一个超类,则搜索一个实例方法的声明,该实例方法的名称和描述符与解析的 方法,从直接超类
    C
    和 继续该类的直接超类,等等, 直到找到匹配项或不再存在其他超类。如果一场比赛 找到,则它是要调用的方法
  • 否则,如果在
    C
    的上界面中正好有一种与已解决问题相匹配的最大特定方法(§5.4.3.3) 方法的名称和描述符,并且不是抽象的,那么它就是 要调用的方法

在您的例子中,
objectref
是对
W
类型的对象的引用
W
不包含与解析方法具有相同名称和描述符的实例方法声明。因此,我们检查
W
对象的超类<代码>对象
是否有这样的方法。因此调用了该方法。

接口
不会覆盖
对象
中的任何内容……我看不出这里有什么问题吗?接口不是抽象类,如果这是您的混淆,并且接口中定义的方法从不重写类中的方法。@ErwinBolwidt当我说,
interface I{public int equals(Object obj);}
我得到编译器错误,
返回类型与Object.equals(obj)
不兼容。我如何理解这一点?这是不是因为,任何没有超级接口的接口,隐式地都有成员匹配
对象中的每个公共方法?这与过度估价有什么不同?
public class Main {
  public static void main(String[] argv) throws Exception {

    Class cls = java.lang.Cloneable.class;
    Class sup = cls.getSuperclass(); // will return null
  }
}