码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象——多态

时间:2019-08-01 20:18:40      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:ceo   编程   继承   http   sleep   extend   eof   图片   测试   

1、多态的实现

创建Person类:

package pers.zhb.Person;

public class Person {
    protected String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void sleep() {
        System.out.println("睡觉");
    }

    public void eat() {
        System.out.println("吃饭");
    }
}

创建学生类:

package pers.zhb.Person;

public class Student extends Person {
    public Student(String name) {
        this.name = name;
    }

    public void study() {
        System.out.println("学习");
    }

}

创建测试类:

package pers.zhb.Person;

public class Test {
    public static void main(String[] args) {
        /*
         * 当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。 只能使用父类和子类共有的的内容,而无法使用子类特有功能
         */
        Person s = new Student("Tom");
        s.eat();
        s.sleep();

        /*
         * 为子类特有功能,需要向下转型 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型
         */
        ((Student) s).study();
    }
}

2、向上转型和向下转型

 向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程,向上转型之后,只能调用子父类共有的内容。例如:

Person s = new Student("Tom");

s.eat();

s.sleep();
睡觉和吃饭是子类和父类都有的方法。

 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的。向下转型后可以调用子类特有的功能。例如:

((Student) s).study();

学习为子类特有方法。

3、多态的好处与弊端:
好处:
(1)不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化(扩展性)。
(2)提高了代码的维护性(继承保证)。
弊端:
(1)只能使用父类和子类共有的的内容,而无法使用子类特有功能。
(2)ClassCastException异常,可以通过instanceof运算符,判断对象所属的类型。
4、多态的特点

 (1)成员变量

当子父类中出现同名的成员变量时,多态调用该变量时:

编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。

运行时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,运行失败。

即:编译和运行都参考等号的左边。

技术图片

 

将父类中的成员变量去掉后,编译和运行都出现错误。

(2)成员方法

编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败。

运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。

即:编译看左边,运行看右边。

编译去掉父类方法:

技术图片

但是运行的时候,执行的是子类方法:

技术图片

 

 

面向对象——多态

标签:ceo   编程   继承   http   sleep   extend   eof   图片   测试   

原文地址:https://www.cnblogs.com/zhai1997/p/11284464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!