62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.*;
class Father{
protected void play(int c){
System.out.println("Father's Play with c callled");
}
}
class Son extends Father{
protected void play(char c){
System.out.println("Son's Play with c callled");
}
}
public class Main{
public static void main(String[] args){
Father fd = new Son(); //向上转型
char c = 'c';
//不是说实例方法是调用实例的那个版本吗?这里play明显属于实例方法, 却没有调用到Son的play(char c)方法???
fd.play(c);
//输出为 Father's Play with c callled
}
}
import java.util.*;
class Father{
protected void play(int c){
System.out.println("Father's Play with int c callled");
}
}
class Son extends Father{
protected void play(char c){
System.out.println("Son's Play with char c callled");
}
}
//测试调用的是哪个带参数的play
public class Main{
public static void main(String[] args){
Father fd = new Son(); //将Son的对象句柄赋值给Father句柄
char c = 'x';
fd.play(c);
}
}
[/quote][/quote]
我觉得这是正解, 但是如果按照你这种说法, 动态绑定依据的就不是对象的实际类型, 而是对象的句柄了.
动态绑定的过程:
虚拟机提取对象的实际类型的方法表;
虚拟机搜索方法签名;
调用方法。
按照这种绑定的过程, father句柄指向的实例应该是son的实例, 那么实际类型的方法表应该是 son的方法表, 虚拟机接下来搜索方法签名, son的play(char)方法将会完全匹配, 然而son的方法实际上并没有被调用...import java.util.*;
class Father{
protected void play(int c){
System.out.println("Father's Play with int c callled");
}
}
class Son extends Father{
protected void play(char c){
System.out.println("Son's Play with char c callled");
}
}
//测试调用的是哪个带参数的play
public class Main{
public static void main(String[] args){
Father fd = new Son(); //将Son的对象句柄赋值给Father句柄
char c = 'x';
fd.play(c);
}
}
[/quote]import java.util.*;
class Father{
protected void play(int c){
System.out.println("Father's Play with int c callled");
}
}
class Son extends Father{
protected void play(char c){
System.out.println("Son's Play with char c callled");
}
}
//测试调用的是哪个带参数的play
public class Main{
public static void main(String[] args){
Father fd = new Son(); //将Son的对象句柄赋值给Father句柄
char c = 'x';
fd.play(c);
}
}
import java.util.*;
class Father{
protected void play(int c){
System.out.println("Father's Play with c callled");
}
}
class Son extends Father{
protected void play(int c){ //将这里的char改为int就可以了
System.out.println("Son's Play with c callled");
}
}
public class DynamicBindinng{
public static void main(String[] args){
Father fd = new Son(); //向上转型
char c = 'c';
//不是说实例方法是调用实例的那个版本吗?这里play明显属于实例方法, 却没有调用到Son的play(char c)方法???
fd.play(c);
//输出为 Father's Play with c callled
}
}