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
}
}