java多态

一、多态的理解

在java中多态是面向对象编程的一种重要特性,它允许不同的对象对同一个消息做出不同的响应。简单来说,多态就是同一种行为在不同对象上的表现方式不同。Java中的多态实现主要依靠两个机制:继承和接口。在继承中,子类可以继承父类的属性和方法,也可以重写父类的方法来实现自己的特定行为。当父类的弓|用指向子类的对象时,可以通过父类的引用调用子类重写的方法,实现多态。在接口中,类可以实现接口中定义的方法,这样可以实现不同的类拥有相同的行为,也可以通过接口的引|用调用这些方法,实现多态。

二、多态的实现

多态前提:继承关系,方法重写,父类引用指向子类对象
成员变量:运行看左边,编译看左边
成员方法:编译看左边,运行看右边
静态成员方法:运行父类

例如下代码:

public class Demo5_polymorphic {
    public static void main(String[] args){
        //猫是一只动物,父类引用指向子类对象
        Animal2 a = new Cat2();
        a.eat();
        System.out.println(a.num);
        //=======================
        a.print();
    }
}

class Animal2{
    int num = 10;
    public void eat(){
        System.out.println("动物吃饭");
    }
    public void print(){
        System.out.println("父类");
    }
}
class Cat2 extends Animal2{
    int num = 20;
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void print(){
        System.out.println("子类");
    }
}

输出:
在这里插入图片描述

  • 上面代码定义了一个动物类和一个猫类,我们让猫去继承动物类,猫就拥有了动物类的多有方法,接着猫类重写了父类的eat()和print()方法。
  • 在主程序main中,我们用Animal2 a = new Cat2()创建了一个a对象,这个代码的含义就是父类引用指向子类对象,Animal2就是父类,Cat2就是子类。
  • 当对象a调用eat方法的时候执行的是子类的eat方法,因为在调用成员方法时,遵守的是编译看左边,运行看右边,也就是编译的是a,运行的时候执行的是子类的eat()。
  • 在调用成员变量num的时候,遵循的是编译看左边,运行看左边,所有打印的是父类的num值10,而不是子类的20。最后一个print()方法和eat()方法的执行时一样的。

三、向上转型和向下转型

向上转型:就是把子类强转成父类,把低的往高的转。
向下转型:就是把父类强转成子类,把高的向低的转。
代码如下:

public class Demo6_polymorphic2 {
    public static void main(String[] args){
        /**
         多态中向上转型和向下转型
         * */
        Person p = new SuperMan();
        System.out.println(p.name);
        SuperMan sm = (SuperMan)p; //向下转型
        sm.fly();
        method(new SuperMan()); //提高扩展性
    }
    public static void method(Person p2){
        //instanceof判断前面引用类型是否和后面相同
        if (p2 instanceof SuperMan){
            SuperMan s = (SuperMan) p2;
            s.fly();
            s.eat();
        }

    }
}
class Person{
    String name = "普通人";
    public void eat(){
        System.out.println("普通人吃饭");
    }

}
class SuperMan extends Person{
    String name = "超人";
    public void eat(){
        System.out.println("超人吃饭");
    }
    public void fly(){
        System.out.println("飞去救人");
    }
}

输出:
在这里插入图片描述
上面代码中先是通过父类引用指向子类对象创建了一个p对象,然后又创建了一个SuperMan引用类型的对象sm,把p强转成SuperMan对象赋值给sm。现在的p就是一个SuperMan类型的对象,而不再是Person类型的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝朽

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值