java 子类引用指向派生类对象时 重载和覆盖的区分

 

这是我今天在网上找到的一段程序,发现比较有意思,仔细思考了一下,果然有所收获!
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值