这是我今天在网上找到的一段程序,发现比较有意思,仔细思考了一下,果然有所收获!
class MyPerson {
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}
class subMyPerson extends MyPerson{
public void mydisplay(char abc)
{
System.out.println("SubMyPerson");
}
}
public class MyTestProject {
public static void main(String[] args) {
char i1=100;
MyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}
执行结果为"MyPerson"
第一次修改:
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}
class subMyPerson extends MyPerson{
public void mydisplay(char abc)
{
System.out.println("SubMyPerson");
}
}
public class MyTestProject {
public static void main(String[] args) {
char i1=100;
System.out.println(i1);
MyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}
执行结果为
d
MyPerson
第二次修改:
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}
class subMyPerson extends MyPerson{
public void mydisplay(char abc)
{
System.out.println("SubMyPerson");
}
}
public class MyTestProject {
public static void main(String[] args) {
char i1=100;
MyPerson mytemp = new subMyPerson();
System.out.println(mytemp.getClass().getName());
mytemp.mydisplay(i1);
}
}
执行结果为:
subMyPerson
MyPerson
通过第一次修改,发现i1的确是char类型,他的值是d
通过第二次修改,发现mytemp指向的对象是SubMyPerson类型的;
可是奇怪的事情发生了,明明mytemp指向的是subMyPerson类型的对象,为何在调的display方法确是MyPerson类型的;
考虑 MyPerson mytemp = new subMyPerson();
就其深层次构造方式是赋值构造!即用subMyPerson()产生的对象对MyPerson的引用赋值!
当然结果是subMyPerson类型的,也印证了第二次修改的结果
仔细考究他的赋值过程就不难发现,由于MyPerson并没有声明display(char abc)的方法
此时编译器不知道如何对这个display(char abc)进行赋值,因为MyPerson中并没有display(char abc)方法,
只有display(int abc)方法,因此display(char abc)并没有赋值成功。mytemp对象中只有display(int abc);
由于char也是整型数据,可以有编译器系统自动转换成int。因此MyPerson的display方法被成功调用
打印结果为MyPerson!
我们再对程序进行修改:
第3次修改:
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}
class subMyPerson extends MyPerson{
public void mydisplay(int abc)
{
System.out.println("SubMyPerson");
}
}
public class MyTestProject {
public static void main(String[] args) {
char i1=100;
MyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}
执行结果为:
SubMyPerson
这就是大家熟知的多态,或者说是方法覆盖。
其原理就是subMyPerson中的display(int abc)方法在mytemp中成功赋值,因为MyPerson中有display(int abc)的声明
由于mytemp确实是subMyperson对象,因此成功调用SubMyPerson中的display(int abc)方法
打印结果为:
SubMyPerson