Java多态

1.什么是多态嘞

Person p1 = new Man();//man和woman都是person的子类
p1.run();
Person p2 = new Woman();
p2.run();

即 person既可以指向man,执行man里的方法,又可以指向womam,执行woman中的方法(person类,man类和woman类在后面会有代码给出,可以下滑到全部代码那去瞅瞅)

2.多态的作用

        1等号右边解耦合

        

Person p1 = new Man();//man和woman都是person的子类
p1.run();
p1.jump();
p1.eat();//以下省略好多好多业务代码

当我们想将p1的业务换成woman而不是man时,仅仅只需改变一行代码,即

Person p1 = new Woman();//只需改变这一行代码
p1.run();
p1.jump();
p1.eat();//以下省略好多好多业务代码

 

        2便于接收对象

public class Test {
    public static void main(String[] args) {
        System.out.println("lllllllllhello");

        Man man = new Man();
        die(man);
        Woman woman = new Woman();
        die(woman);


    }
    public static void die(Person p){
        System.out.println("啊!我死了");
    }
}

方法die的形参若为person,则可以接收person的所有子类,否则,举个例子,若形参为man,则woman调用die方法时传入参数将会报错,参见下面

public class Test {
    public static void main(String[] args) {
        System.out.println("lllllllllhello");
        
        Woman woman = new Woman();
        die(woman);
        die1(woman);


    }
    public static void die(Person p){
        System.out.println("啊!我死了");
    }
    public static void die1(Man p){
        System.out.println("啊!我又死了,但可能死不了,因为我形参变了,欸嘿嘿,没想到吧,年轻人人!!!");
    }
}

运行结果,出错啦,果真没死成

 3.多态的缺点即解决

    多态不能使用子类独有的方法,即

Person p2 = new Woman();
p2.run();
p2.pregnancy();//会报错,无法调用子类独有的方法



//以下是定义
class Woman extends Person {
    @Override
    public void run() {
        System.out.println("女生跑");
    }
    public void pregnancy() {
        System.out.println("我怀孕了!!!");
    }
}

为了解决此问题,就要用强制类型转换

Person p2 = new Woman();
p2.run();
  //p2.pregnancy();//会报错,无法调用子类独有的方法
Woman woman = (Woman) p2;//强制类型转换之后,就可以正常调用了
woman.pregnancy();

为了使强制类型转换不出现问题,使用instanceof关键字,下面为介绍

p2 instanceof Woman

判断p2的真实类型是否是Woman或是Woman的子类

所以严格的写法应该是这样的

Person p2 = new Woman();
p2.run();
  //p2.pregnancy();//会报错,无法调用子类独有的方法
if(p2 instanceof Woman) {
    Woman woman = (Woman) p2;//强制类型转换之后,就可以正常调用了
    woman.pregnancy();
}

4.全部代码

public class Test {
    public static void main(String[] args) {
        System.out.println("lllllllllhello");
        Person p1 = new Man();//只需改变这一行代码
        p1.run();
        Person p2 = new Woman();
        p2.run();
//        p2.pregnancy();//会报错,无法调用子类独有的方法


        if(p2 instanceof Woman) {
            Woman woman = (Woman) p2;//强制类型转换之后,就可以正常调用了
            woman.pregnancy();
        }




        Man man = new Man();
        die(man);
        Woman woman = new Woman();
        die(woman);
//        die1(woman);



    }
    public static void die(Person p){
        System.out.println("啊!我死了");
    }
    public static void die1(Man p){
        System.out.println("啊!我又死了了,但可能死不了,因为我形参变了,欸嘿嘿,没想到吧,年轻人人!!!");
    }
}

class Person {
    public void run(){
        System.out.println("人跑");
    }
}
class Man extends Person {
    @Override
    public void run() {
        System.out.println("男生跑");
    }
}
class Woman extends Person {
    @Override
    public void run() {
        System.out.println("女生跑");
    }
    public void pregnancy() {
        System.out.println("我怀孕了!!!");
    }
}

运行结果

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值