一、多态性,是面向对象中最重要的概念,在java中有两种体现:
1.方法的重载和重写。
2.对象的多态性 ——可以直接应用在抽象类和接口上。
Java引用变量有两个类型:编译时类型和运行时类型。
编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
注意: 若编译时类型和运行时类型不一致,就出现多态。
二、对象的多态 —在Java中,子类的对象可以替代父类的对象使用
1.一个变量只能有一种确定的数据类型。
2.一个引用类型变量可能指向(引用)多种不同类型的对象。
Person p = new Student();//子类的向上转型
Object o = new Person();//Object类型的变量o,指向Person类型的对象
o = new Student(); //Object类型的变量o,指向Student类型的对象
子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型。
需要注意的是:
一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
例如:
Student m = new Student();
m.school = “abc”; //合法,Student类有school成员变量
Person e = new Student();
e.school = “abc”; //非法,Person类没有school成员变量
属性是在编译时确定的,编译时e为Person类型,没有school成员变量,因而编译错误。
三、
实现多态性的前提:
1.需要存在继承或者实现关系
2.要有覆盖操作
成员方法:
编译时:要查看引用变量所属的类中是否有所调用的方法。
运行时:调用实际对象所属的类中的重写方法。
成员变量:
不具备多态性,只看引用变量所属的类。
需要注意的是:
若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中。
对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量。
这时候,我们可以使用一下instanceof这个关键字。
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
如果x属于类A的子类B,x instanceof A值也为true。
public class Person extends Object {…}
public class Student extends Person {…}
public class Graduate extends Person {
-------------------------------------------------------------------
public void method1(Person e) {
if (e instanceof Person)
// 处理Person类及其子类对象
if (e instanceof Student)
//处理Student类及其子类对象
if (e instanceof Graduate)
//处理Graduate类及其子类对象
以上是我对于这块知识的学习的一个总结和理解。