Java_面向对象高级二-多态、使用多态的好处

什么是多态?

  • 多态是在继承/实现情况下的一种现象,表现为:对象多态(不同的对象)、行为多态(不同的行为)

多态的具体代码表现

package com.zzfeng.d1_polymorphism;

public class Test {
    public static void main(String[] args) {
//        认识多态:对象多态、行为多态
        People p = new Teacher();
        p.run();//识别技巧:编译看左边(有无run方法),运行看右边(有无run方法)

        People p1 = new Student();
        p1.run();
    }
}

多态的前提:

  • 有继承/实现关系;存在父类引用子类对象;存在方法重写

多态的一个注意事项

  • 多态是对象、行为的多态,Java中的属性(成员变量)不谈多态(成员变量会一直访问父类的成员变量)
package com.zzfeng.d1_polymorphism;

public class Test {
    public static void main(String[] args) {
//        认识多态:对象多态、行为多态
        People p = new Teacher();
        p.run();//识别技巧:编译看左边(有无run方法),运行看右边(有无run方法)
        System.out.println(p.name);//Java中的属性(成员变量)不谈多态

        People p1 = new Student();
        p1.run();
        System.out.println(p1.name);//Java中的属性(成员变量)不谈多态
    }
}

使用多态的好处

  • 在多态的形式下,右边对象时解耦合的,更便于扩展和维护
  • 定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强、更便利
  • 示例代码:
package com.zzfeng.d2_polymorphism;

import com.zzfeng.d2_polymorphism.Teacher;

public class Test {
    public static void main(String[] args) {
//        理解多态的好处
//        好处一:可以实现解耦合,右边对象可以随时切换,后续业务随即改变(可以是new Teacher,也可以是new Student)
        People p = new Student();
        p.run();

//        好处二:可以使用父类类型的变量作为形参,可以接收一切子类对象
        Student s = new Student();
        go(s);

        Teacher t = new Teacher();
        go(t);
    }

    public static void go(People p) {

    }
}

多态下会产生的一个问题

  • 多态下不能使用子类的独有功能

多态下的类型转换

  • 自动类型转换:父类 变量名=new 子类();
  • 强制类型转换:子类 变量名=(子类)父类变量
//        强制类型转换
        Student s1= (Student) p;
        s1.study();

强制类型转换的一个注意事项

  • 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错
  • 运行时,如果发现对象的真实类型与强制类型转换后的类型不同,就会报类型转换异常(ClassCastException)的错误

强转前,Java建议:

  • 使用instanceof关键字,判断当前对象的真实类型,在进行强转
  • 格式:对象 instanceof 类型
  • 示例代码:
//        强制类型转换可能存在问题:编译阶段有继承或实现关系就可以强制转换,但是运行时可能出现类型转换异常
//        Teacher t1 = (Teacher) p;p是学生对象,不能强转为老师对象
        
        if (p instanceof Teacher) {
            Teacher t2 = (Teacher) p;
            t2.teach();
        }else {
            Student s2 = (Student) p;
            s2.study();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值