Java学习之路【220421-220424】多态2(对象多态)


一、向上转型

基本语法

父类类型 引用名 = new 子类类型();

特点

  1. 等号”=“ 左边的类型是编译类型,右边的类型是运行类型
  2. 创建之后的对象可以调用父类的所有成员(成员属性和成员方法),调用的方法和属性由编译类型决定,不能调用子类特有的方法
  3. 最后在执行方法时,由运行类型中查找相应的方法
  4. 最终的运行效果看子类的具体实现

代码示例演示

父类

public class Animal {
    String name = "动物";
    int age = 10 ;
    //四种方法
    public void sleep(){
        System.out.println("睡");
    }
    public void run(){
        System.out.println("跑");
    }
    public void eat(){
        System.out.println("吃");
    }
    public void show(){
        System.out.println("Hello 你好");
    }
}

子类

public class Cat extends Animal  {
    public void eat(){
        System.out.println("猫吃鱼");
    }
    //子类特有的方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}

测试类

public class PolyDetail {
    public static void main(String[] args) {
        //向上转型
        Animal animal = new Cat();
        animal.eat();
    }
}

运行结果
在这里插入图片描述


二、向下转型

基本语法

子类类型 引用名 = (子类类型)父类引用;

向下转型的本质与基本数据类型的强转类型有异曲同工之妙

注意点

  1. 向下转型 只能强转父类的引用(上面的animal),不能强转父类的对象(Animal)
  2. 要求父类的引用必须指向的是当前的目标类型,也就是说在进行向下转型的时候,父类的引用必须在之前指向过目标转型的子类类型
    Animal animal = new Cat();//这个是前提
    才能进行下面 Cat cat = (cat) animal;
  3. 当向下转型之后,可以调用子类类型中的所有成员
    子类类型同样可以调用父类的方法,因为子类继承了父类

代码示例演示

public class PolyDetail {
    public static void main(String[] args) {
        //向上转型
        Animal animal = new Cat();
        animal.eat();
        //向下转型
        Cat cat = (Cat) animal;
        cat.catchMouse();
        cat.run();
        cat.show();
    }
}

运行结果
在这里插入图片描述


三、属性重写的问题

属性是没有重写的说法的
属性的取值是看编译类型的

代码示例演示

package com.ylxstudy.ploy_.detail_;//包名

public class PolyDetails02 {
    public static void main(String[] args) {
        //向上转型
        Base base = new Sub();
        System.out.println(base.count);//输出base 的count
        Sub sub = new Sub();
        System.out.println(sub.count);//输出sub 的count
    }
}

class Base{
    int count = 10;
}

class Sub extends Base{
    int count = 20;
}

四、instanceOf

instanceOf比较操作符,用于判断对象的类型,这里的对象指的是运行类型,判断是不是为XX类型或者是XX类型的子类

代码示例演示

package com.ylxstudy.ploy_.detail_;

public class PolyDetails02 {
    public static void main(String[] args) {
        //向上转型
        Base base = new Sub();
        
        //此时 base 的运行类型是 Sub ,Sub 继承了 Base 
        //base 的 运行类型 是否为 Base 或者是 Base的子类 
        System.out.println(base instanceof Base);//true
        //base 的 运行类型 是否为 Sub 或者是 Sub的子类
        System.out.println(base instanceof Sub);//true
    }
}


class Base{
    int count = 10;
}

class Sub extends Base{
    int count = 20;
}

运行结果
在这里插入图片描述


五、总结

以上就是今天要讲的内容,本文介绍了 向上转型向下转型属性的重写问题instanceOf 的使用。
在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云来喜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值