讲解java的多态

本文详细介绍了Java中的多态概念,包括其前提条件(继承和方法重写),如何在代码中使用多态提高代码的灵活性和扩展性,以及使用多态时可能出现的问题和解决策略,如类型转换的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是多态?

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

2.多态的前提

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

3.多态的注意事项

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

package com.web201.poly;

public class People {
    String name = "父类";

    public void run() {
        System.out.println("I can run.");
    }
}
package com.web201.poly;


public class Student extends People {

    String name = "学生类";

    @Override
    public void run() {
        System.out.println("学生跑得快···");
    }
}

package com.web201.poly;

public class Teacher extends People {
    String name = "老师类";

    @Override
    public void run() {
        System.out.println("老师跑得慢");
    }
}
package com.web201.poly;

public class Main {
    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);
    }
}

4.使用多态

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

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

5.使用多态存在的问题

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

要解决这种办法就只能使用类型转换。

类型转化 :

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

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

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

存在继承/实行关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。

运行时,如果发现对象的真实类型与强制转换后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。

所以在强制转换前,应该使用instanceof关键字,判断当前对象的真实类型,再进行强制转换。

package com.web201.poly;


public class Student extends People {

    String name = "学生类";

    @Override
    public void run() {
        System.out.println("学生跑得快···");
    }

    public void study() {
        System.out.println("学生正在学习···");
    }
}

package com.web201.poly;

public class Teacher extends People {
    String name = "老师类";

    @Override
    public void run() {
        System.out.println("老师跑得慢");
    }

    public void teach() {
        System.out.println("老师正在讲课");
    }
}
package com.web201.poly;

public class People {
    String name = "父类";

    public void run() {
        System.out.println("I can run.");
    }
}
package com.web201.poly;

public class Main {
    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);

        Student s = new Student();
        use(s);
    }

    public static void use(People people) {
        System.out.println("--------开始------------");
        people.run();
        if(people instanceof Student){
            Student s = (Student) people;
            s.study();
        }else if(people instanceof Teacher){
            Teacher t = (Teacher) people;
            t.teach();
        }
        System.out.println("--------结束------------");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与风过山岗

您的鼓励是我莫大的荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值