Java三大特性之多态性

多态性在Java中体现为对象的多态性:父类的引用指向子类的对象

多态性的体现:
(1)广义上多态性的体现:①方法的重写,方法的重载 ②子类对象的多态性
(2)狭义上多态性的体现:子类对象的多态性
说明:子类对象多态性是指父类的引用指向子类的对象

注:属性没有多态性
如果需要调用子类中的特有的属性和方法怎么办?向下转型

关于向上转型与向下转型:
向上转型:多态(父类的引用指向子类的对象)
向下转型:把父类的引用再转成子类的

多态性使用的前提:
①要有继承关系 ②要有方法的重写 ③父类的引用指向子类的对象

Java引用变量的两种类型:编译时类型和运行时类型

编译时类型由声明该变量时使用的类型决定, 运行时类型由实际赋给该变量的对象决定。简称: 编译看左边;运行看右边。若编译时类型和运行时类型不一致,就出现了 对象的多态性(Polymorphism)。
多态情况下,“看左边”:看的是父类的引用(父类中不具备子类特有的方法)
                      “看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)

对象的多态 —在Java中,子类的对象可以替代父类的对象使用

(1)一个变量只能有一种确定的数据类型
(2)一个引用类型变量可能指向(引用)多种不同类型的对象
Person p = new Student();
Object o = new Person();//Object类型的变量o,指向Person类型的对象
o = new Student(); //Object类型的变量o,指向Student类型的对象

注:一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。如在下面的例子中,由于属性是在编译时确定的,编译时person为Person类型,没有school成员变量,因而编译错误

Student student = new Student();
student.school = "pku"; 	//合法,Student类有school成员变量
Person person = new Student(); 
person.school = "pku";	//非法,Person类没有school成员变量

虚拟方法调用

多态情况下,子类中定义了与父类 同名同参数的方法,此时父类的方法称为 虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。
//已知Student继承自Person类,两个类中均有getInfo()方法
Person person = new Student();
person.getInfo();	//调用的是Student类的getInfo()方法

原因:之所以说调用的是Student类的getInfo()方法,是因为编译时person虽然为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法。——动态绑定

[面试题]:
多态是编译时行为还是运行时行为?
正解:运行时行为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值