【Java】面向对象进阶-多态

前言

1.之前学过,因此本文是个人复习笔记,为视频的总结以及个人思考,可能不是很详细。

2.教程是b站黑马程序员的JAVASE基础课程,笔记中的大部分图片来自于视频中的PPT截图。

3.Java环境为Java SE 17.0.3.1,IntelliJ IDEA版本为2025.2

https://www.bilibili.com/video/BV1Cv411372m

内容概览

1.本文内容主要包括多态的概念与特点,多态的前提,以及多态的特点

2.笔记对应视频105-107节

更新记录

多态的概念

多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态。

例如:

People p1 = new Student();

p1.run();

People p2 = new Student();

p2.run();

多态的前提

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

!多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。

Object4Demo1.java

package com.zbhgis.object4;

public class Object4Demo1 {
    public static void main(String[] args) {
        People p1 = new Student();
        p1.run(); // 编译看左边,运行看右边。
        System.out.println(p1.name); // 对于变量,编译看左边,运行看左边。

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

class People{
    public String name = "People";
    public void run(){
        System.out.println("People run");
    }
}

class Student extends People{
    public String name = "Student";

    @Override
    public void run(){
        System.out.println("Student run");
    }
}

class Teacher extends People{
    public String name = "Teacher";

    @Override
    public void run(){
        System.out.println("Teacher run");
    }
}

打印结果

Student run
People
Teacher run
People

多态的特点

优点:

在多态形式下,右边对象是解耦合的,更便于扩展和维护。

定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强、更便利。

缺点及其解决:

多态不能使用子类的独有功能。为了解决这个问题,可以使用类型转换。

自动类型转换:父类 变量名 = new 子类();

强制类型转换:子类 变量名 = (子类)父类变量;

存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来(可以使用instanceof关键字判断避免抛出异常)。

Object4Demo2.java

package com.zbhgis.object4;

import java.rmi.StubNotFoundException;

public class Object4Demo2 {
    public static void main(String[] args) {
        // 解耦合,右边对象可以随时切换
        Person p1 = new Family();
        p1.run();
        // p1.live(); // 多态不能使用子类的独有功能

        // 可以使用父类类型的变量作为形参,可以接收一切子类对象
        Friend f1 = new Friend();
        go(f1);

        Family f2 = new Family();
        go(f2);

    }

    public static void go(Person p){

    }
}


class Person{
    public String name = "Person";
    public void run(){
        System.out.println("Person run");
    }
}

class Friend extends Person{
    public String name = "Friend";

    @Override
    public void run(){
        System.out.println("Friend run");
    }

    public void play(){
        System.out.println("play");
    }
}

class Family extends Person{
    public String name = "Family";

    @Override
    public void run(){
        System.out.println("Family run");
    }

    public void live(){
        System.out.println("live");
    }
}

打印结果

Family run
live

live

Friend run
play
Family run
live

总结

1.多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。

2.多态不能使用子类的独有功能,需要加上类型转换

3.类型转换要转换对,不然会抛出异常

4.可以结合instanceof关键字识别对象的类型

posted @ 2025-12-15 08:26  浩瀚地学  阅读(2)  评论(0)    收藏  举报