JAVA 面向对象进阶 09 - 11 多态

1 什么是多态

  • 同类型的对象,表现出的不同形态
  • 表现形式:父类类型  对象名称  =  子类对象;   即 Fu f = new Zi();
  • 多态前提:有继承/实现关系、有父类引用指向子类(Fu f = new Zi())、有方法重写
  • 多态的好处:使用父类型作为参数,可以接收所有子类对象

2 多态应用场景

3 例子

3.1 父类

package com.bjpowernode.op_extends.Demo006;

public class Person {
    public String name;
    public int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public void show(){
        System.out.println(name + ", " + age);
    }
}

3.2 子类

package com.bjpowernode.op_extends.Demo006;

public class Student extends Person{

    @Override
    public void show() {
        System.out.println("学生的信息为:" + getName() + ", " + getAge());
    }
}
package com.bjpowernode.op_extends.Demo006;

public class Teacher extends Person {
    @Override
    public void show() {
        System.out.println("老师的信息为:" + getName() + ", " + getAge());
    }
}
package com.bjpowernode.op_extends.Demo006;

public class Administrator extends Person{
    @Override
    public void show() {
        System.out.println("管理员的信息为:" + getName() + ", " + getAge());
    }
}

3.3 测试类

package com.bjpowernode.op_extends.Demo006;

public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("张三");
        s.setAge(23);

        Teacher t  = new Teacher();
        t.setName("李四");
        t.setAge(46);

        Administrator a = new Administrator();
        a.setName("王五");
        a.setAge(35);

        register(s);
        register(t);
        register(a);
    }

    //这个方法既能接收老师,又能接收学生,还能接收管理员
    //只能把参数写成这三个类型的父类
    public static void register(Person p){
        p.show();
    }
}

运行结果:

4 多态调用成员的特点

  • 变量调用:编译看左边,运行也看左边
  • 方法调用:编译看左边,运行看右边
//创建对象(多态方式)
//Fu f = new Zi();
Animal a = new Dog();
//调用成员变量:编译看左边,运行也看左边
//编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。
//运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
System.out.println(a.name);//动物
//调用成员方法:编译看左边,运行看右边
//编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
//运行看右边:java运行代码的时候,实际上运行的是子类中的方法。
a.show();///Dog---show方法

4.1 理解

  • Animal a = new Dog();
  • 现在用 a 去调用变量和方法的呀?是的
  • 而 a 是 Animal 类型的,所以默认都会从 Animal 这个类中去找
  • 成员变量:在子类的对象中,会把父类的成员变量也继承下的。父:name    子:name
  • 成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。

4.2 内存角度

5 多态的优势和弊端

5.1 多态优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
  • 方法中,使用父类型作为参数,可以接收所有子类对象

5.2 多态弊端

没有办法调用子类特有的方法(因为多态调用成员方法,编译看左边,运行看右边,对于子类特有的成员方法,父类里没有,所以编译都不能通过)

5.2.1 解决方案

变回子类类型就可以了

  • Animal a = new Dog();
  • Dog d = (Dog)a;     //强制转换回子类    但是由于最开始是 new Dog,所以只能转成 Dog
  • 转换类型与真实对象类型不一致会报错
  • 转换的时候用 instanceof 关键字进行判断

参考链接:

面向对象进阶-09-认识多态_哔哩哔哩_bilibili

面向对象进阶-10-多态中调用成员的特点_哔哩哔哩_bilibili

面向对象进阶-11-多态的优势和弊端_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值