多态之父子争权

转载自这篇文章

多态之父子争权

--模范青蛙

 

在谈及这个问题之前,先说一下多态的三个前提条件:

1.存在类的继承

2.存在方法的重写

3.父类引用指向子类对象

很多童鞋在多态这一块儿存在一些疑虑:什么时候调用父类的东西呢?什么时候又是调用子类的东西呢?好迷茫。

针对这一问题,咱们来结合例子简单分析一下:

看下面的一个简单的例子

public class Test_02 {

public static void main(String[] args) {

Father f=new Son();

f.name="";

f.drink();

}

}

class Father{

String name;

public void drink(){

System.out.println("Father在喝酒");

}

}

class Son extends Father{

String name;

public void drink(){

System.out.println("Son在喝酒");

}

}

下面就以上代码进行分析:

首先来谈论一下:对象“f”调用的是子类的方法?还是父类的方法?

大家都知道,子类继承父类会继承父类的一切非私有的方法和属性,但是,当子类的方法与父类的方法重名时,父类的方法就会被覆盖,所以:如果是对象调用方法,调用的是子类的方法,或许有人问:当调用的是子类没有的方法呢?《那肯定是调用的从父类继承过来的方法了》。

接下来讨论一下:对象“f”调用的是子类的属性?还是父类的属性:

在讨论之前,我们可以先做两个小实验:

实验一:将父类中的name属性加上私有的访问权限(private)这时你会发现在main()方法中“f.name”会报编译时错误:意思就是没有访问权限《如图一:所示》

 

 

图一:

 

实验二:将子类中的name属性加上私有的访问权限(private)这时你会发现在main()方法中“f.name”没有报错误:意思就是可以访问《如图二:所示》

 

 

 

 

图二:

经过上面的两个小实验童鞋们应该知道这里的“f”调用的是谁的name谁属性了吧

下面来简单总结一下为什么出现以上情况:

如果子类里存在与父类同名的方法,就意味着父类的那个方法已经被覆盖掉了,系统就不可能把父类里的方法搬到子类里面去了。

但是,属性却不是这样的,尽管子类里定义了与父类相同的水属性,父类的属性依然不会被子类的属性覆盖。

所以继承属性和继承方法之间存在着差异性,所以对于一个引用类型的变量而言,当通过变量访问它所引用的对象的属性时,该属性的值取决于声明该变量时的类型。

当通过该变量调用它所引用的对象的方法时,该方法的行为取决于它所实际引用的对象的类型

最近一直有童鞋纠结这样一个问题:父类引用指向子类对象后,可以调用子类所特有的方法吗?

答案是否定的,下面是个人的看法:父类引用指向子类对象后,会把父类的属性和方法都加载到那个子类中去(当然如果子类存在和父类同名的方法,父类的方法就会被覆盖了),而这个引用始终是指向从父类加载过来的那些属性和(被子类重写的和没有重写的方法),因此,这个引用是无法调用子类中所特有的方法的。
购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值