java基础之多态性的小结和理解

一、多态性,是面向对象中最重要的概念,在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类及其子类对象

以上是我对于这块知识的学习的一个总结和理解。

猜你喜欢

转载自jiongsca.iteye.com/blog/2201658