Base父类代码如下
public class Base {
public static String showme(){
return "Base";
}
public void print(){
System.out.println(showme());
}
}
Sub子类代码如下
public class Sub extends Base {
public static String showme(){
return "Sub";
}
}
main函数如下
public class AppMain {
public static void main(String args[]){
Base base=new Sub();
base.print();
Sub sub=new Sub();
sub.print();
}
}
打印结果两个都为Base
请问怎样解释在print方法中showme()方法的调用与什么有关?
Pour les méthodes statiques, l'instruction invoquéestatique est utilisée. L'instruction invoquéestatique ne nécessite pas de référence d'instance comme opérande. Elle nécessite uniquement une référence de symbole pour la méthode statique. Par conséquent, la méthode statique a été spécifiée au moment de la compilation, et quelques mots de la méthode d'impression Code de section :
Comme vous pouvez le voir, Invokestatic a spécifié que Base.showme est appelé, donc la façon dont vous appelez la méthode print ne changera pas le comportement d'invocatestatic.
De plus, j'ai l'impression que le questionneur a une mauvaise compréhension de la liaison statique et de la liaison dynamique. Je suggère au questionneur de se référer à cette question : Java, appelant des méthodes polymorphes dans le constructeur
.Les sous-classes peuvent hériter des propriétés statiques et des méthodes statiques de la classe parent, mais elles ne peuvent pas remplacer les méthodes statiques.
S'il existe une étiquette de méthode dans la sous-classe qui a la même étiquette de méthode que la classe parent (même nom de méthode, même type de paramètre, même type de valeur de retour et même le même niveau d'accès), cela ne peut signifier qu'un une nouvelle est créée pour la sous-classe. Une méthode statique avec le même nom que la classe parent, plutôt qu'un remplacement de la méthode statique de la classe parent.
Comme @kylewang l'a souligné, le bytecode de la méthode d'impression
L'appel de méthode est clairement spécifié comme Base.showme()