面向对象三大特征之三:多态--java学习笔记

发布时间:2024年01月14日

什么是多态

  • 多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态
    对象多态:举个栗子,比如一个人,他可以是一个老师,也可以是一个歌手,也可以是一个丈夫......
    行为多态:举个栗子,比如都是人来唱歌,有的人唱的很好听,有的五音不全,或者说都是去上学,有的是学霸,而有的是学渣......

代码演示:

首先创建类:

public class People {   //人类
    public String name = "people";
    public void run(){  //跑步
        System.out.println("人会跑步");
    }
}

public class Student extends People{    //学生类,继承人类
    public String name = "student";
    @Override
    public void run() { //跑步
        System.out.println("学生跑的贼快~");
    }
}

public class Teacher extends People{    //老师类,继承人类
    public String name = "teacher";
    @Override
    public void run() { //跑步
        System.out.println("老师跑的气喘吁吁~");
    }
}

Test:

public class Test {
    public static void main(String[] args) {
        People s = new Student();   //对象多态,人可以是学生,人的范围比学生大,学生继承自人,学生也是人
        s.run();    //学生跑步

        People t = new Teacher();   //同理学生
        t.run();    //老师跑步
    }
}

运行结果:

?

?多态的前提

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

多态注意事项?

  • 多态强调对象和行为多态性,类中的属性(成员变量)不谈多态
  • 对于方法/行为,编译看左边,运行看右边,即编译看父类,实际运行看子类
  • 对于成员变量/属性,编译看左边,运行仍看左边,即编译看父类,实际运行也是父类的
  • 这里的左边右边是指对象定义时赋值=号的左边右边

举例:

仍然是刚才的人类、学生类、老师类?,输出他们的name:

public class Test2 {
    public static void main(String[] args) {
        People s = new Student();
        System.out.println(s.name); //编译看左边,运行看左边

        People t = new Teacher();
        System.out.println(t.name);
    }
}

结果:

?

使用多态的好处

  • 在多态形式下,右边对象是解耦合的,更便于维护和拓展
  • 定义方法时,使用父类类型的形参,可以接收一切子类对象,拓展性更强、更便利
    解耦合:右边对象随时切换,后续业务随时改变

多态的存在的问题?

  • 无法直接调用子类独有功能

多态下的类型转换?

类型转换

  • 自动类型转换:父类 变量名 = new 子类(); 例如 People p = new Teacher
  • 强制类型转换:子类 变量名 = (子类) 父类变量;例如 Teacher t = (Teacher)p;

强制类型转换的注意事项?

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

示例:

  • ?因此,强转前建议使用instanceof关键字,判断当前对象的真实类型,再进行强转

示例:

?

?

文章来源:https://blog.csdn.net/m0_71386740/article/details/135582690
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。