Java学习day13-面向对象特征之三:多态性
一、多态性
多态性是面向对象中最重要的概念,在Java中有两种体现;
1.方法的重载(override)和重写(overwrite)。
2.对象的多态性——可以直接应用在抽象类和接口上。
Java引用变量有两个类型:
1.编译时类型。(编译时类型由声明该变量时使用的类型决定)
2.运行时类型。(运行时类型由实际付赋给该变量的对象决定)
若编译时类型和运行时类型不一致,就会出现多态(Polymorphism)。
对象的多态——在Java中,子类的对象可以替代父类的对象使用
1.一个变量只能有一种确定的数据类型
2.一个引用类型变量可能指向(引用)多种不同类型的对象。例如Person p = new Person(); Person e = new Student();//Person类型的变量e,指向Student类型的对象
3.向上转型(upcasting):子类可以看做是特殊的父类,所以父类类型的引用可以指向子类的对象。(Person e = new Student()就是向上转型,把子类的的对象给父类的类型的变量引用)
一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法,例如:
1 Student m = new Student(); 2 m.school = "pku";//合法,Student类中有school成员变量 3 Person e = new Student(); 4 e.school = "pku";//非法,Person类没有school成员变量 5 //属性是在编译时确定的,编译时e为Person类型,没有school成员变量,因而编译错误。
虚拟方法调用(Virtual Method Invocation)
1.正常的方法调用
Person p = new person(); p.getInfo(); Student s = new Student(); s.getInfo();
2.虚拟方法调用(多态情况下)
Person e = new Student(); e.getInfo();//调用Student类的getInfo()方法
3.编译时类型和运行时类型
编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法。——动态绑定
多态小结:
前提:1.需要存在继承或实现关系。2.要有覆盖操作。
成员方法:1.编译时:要查看引用变量所属的类中是否有所调用的方法。2.运行时:调用实际对象所属的类中的重写方法。(成员方法的多态性,也就是动态绑定,必须得存在于方法的重写之上)
成员变量:不具备多态性,只看引用变量所属的类。
子类继承父类:
1.若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中去。(即如果子类没有重写父类的方法,那么子类就直接使用父类的方法。如果重写了,子类就使用自己重写之后的方法)
2.对于实际变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量。
二、instanceof操作符
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
1.要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
2.如果x属于A的子类B,x instanceof A的值也为true。
3.instanceof就是检验某个对象是不是类A的子类。
三、Object类
1.Object类是所有Java类中的根父类/基类。(多层继承,处于最高层的父类一定是Object类)
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类是Object类。(public class Person{...} 等价于 public class Person extends Object{...})
3.Object类中的主要方法:


浙公网安备 33010602011771号