Java 基础【04】

本文详细介绍了Java中的多态性概念,包括向上转型和向下转型的语法及安全性。通过实例展示了如何使用父类引用指向子类对象,以及如何进行方法的调用和成员变量的访问。同时,解释了编译时和运行时的方法选择规则,并提供了具体的代码示例以加深理解。
摘要由CSDN通过智能技术生成

本文代码仓库地址: gitee码云CSDN笔记仓库地址



补充内容:

向上转型:

  • 解释:把狗狗当成动物,这种就是向上转型
  • 语法:父类名称 对象名 = new 子类名称();
  • 向上转型是绝对安全的,就比如 int 类型 强转为 double 一样,不会出现精度缺失等问题

向下转型:

  • 解释:把原本是动物的狗狗对象还原成狗狗对象本身
  • 语法:子类名称 对象名 = (子类名称) 是动物的狗狗对象【MxyDog dog = (MxyDog) zoo】
  • 向下转型不一定安全,这里我们就需要用到 instanceof 来判断
  • instanceof 使用: if(zoo instanceof dog)
  • 向下转型就比如本来是double类型的强转成为int类型,这样就可能会出现精度的丢失,所以向下转型前最好先判断一下

多态【Main.java】

package cn.xiaoyin98.Demo13;

/**
 * @author 小印丶
 * @date 2021-01-22 20:31
 *
 * 多态
 *
 * 代码当中体现多态性,其实就是:父类引用指向子类对象
 * 语法:
 * 父类名称 对象名 = new 子类名称();
 * 或者:
 * 接口名称 对象名 = new 实现类名称();
 *
 * 小提示:
 * 1、只有成员方法可以覆盖重写,成员变量不能覆盖重写
 * 2、直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找
 * 3、间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找
 * 4、成员方法的访问规则是:看new的是谁,就优先用谁,没有则向上找【前提是等号左边也存在这个方法,右边子类重写这个方法】
 * 5、成员方法:编译看左边,运行看右边【这里的左右是指等号左边的类或者接口里面是否存在这个成员方法】
 * 6、成员变量:编译看左边,运行还是看左边【道理同上】
 */
public class Main {
    public static void main(String[] args) {
        // 左侧父类的引用,指向了右侧子类的对象
        MxyZoo obj01 = new MxyDog();
        // 这一句在编译前,使用Ctrl+鼠标左键跳转的父类中的mFun01方法,但是在编译运行后实际调用的子类中的mFun01方法
        obj01.mFun01();
        // 在编译前,看父类中是否存在这个方法,存在编译通过,运行的时候,是先看new的对象中是否存在这个方法,有就用这个对象的没有就向上查找
        obj01.mFunZoo();
        // 这样写会报错,提示找不到方法mFunZi,等号左边是父类,所以向上查找是不能找到子类中的方法的
        // obj01.mFunDog();
        // 我们在使用成员变量的时候,编译的时候这个name是优先使用等号左边的也就是父类中的,运行后也是优先使用等号左边的
        System.out.println("我们家的狗狗是:" + obj01.name);
        // 这里我们给name重新赋值,下面打印的肯定是我们修改的名字,并且name这个字段还是属于父类中的
        obj01.name = "小灰灰~";
        System.out.println("我家狗狗的名字:" + obj01.name);

        System.out.println("------------------分割线------------------");
        // 上面的注释对下面的也是同样适用的
        MxyZoo obj02 = new MxyCat();
        obj02.mFun01();
        obj02.mFunZoo();
        // obj02.mFunCat();
        System.out.println("朋友家的猫咪是:" + obj02.name);
        obj02.name = "九月~";
        System.out.println("朋友的猫咪的名字:" + obj02.name);

        System.out.println("------------------分割线------------------");
        // 这个下面的我们就适用正常的进行调用,子类调用子类的,父类调用父类中的
        MxyZoo zoo = new MxyZoo();
        MxyDog dog = new MxyDog();
        MxyCat cat = new MxyCat();
        zoo.mFun01();
        zoo.mFunZoo();
        zoo.mFunZoo();
        System.out.println("动物的的名字:" + zoo.name);
        System.out.println("-----------------------------------------");
        dog.mFun01();
        dog.mFunDog();
        dog.mFunZoo();
        System.out.println("我家狗狗的名字:" + dog.name);
        System.out.println("-----------------------------------------");
        cat.mFun01();
        cat.mFunCat();
        cat.mFunZoo();
        System.out.println("朋友猫咪的名字:" + cat.name);
    }
}

父类:动物类【MxyZoo.java】

package cn.xiaoyin98.Demo13;

/**
 * @author 小印丶
 * @date 2021-01-22 21:14
 *
 * 父类:动物类 有两个子类,一个是狗狗类一个是猫咪类
 */
public class MxyZoo {

    String name = "动物";

    public void mFun01(){
        System.out.println("父类中的 mFun01 方法");
    }

    public void mFunZoo(){
        System.out.println("父类中特有的 mFunFu 方法");
    }
}

子类:狗狗类 继承动物类【MxyDog.java】

package cn.xiaoyin98.Demo13;

/**
 * @author 小印丶
 * @date 2021-01-22 21:14
 *
 * 子类:狗狗类 继承动物类
 */
public class MxyDog extends MxyZoo {

    String name = "小灰灰";

    @Override
    public void mFun01() {
        System.out.println("狗狗类中的 mFun01 方法");
    }

    public void mFunDog(){
        System.out.println("狗狗类中特有的 mFunDog 方法");
    }
}

子类:猫咪类 继承动物类【MxyCat.java】

package cn.xiaoyin98.Demo13;

/**
 * @author 小印丶
 * @date 2021-01-23 18:40
 *
 * 子类:猫咪类 继承动物类
 */
public class MxyCat extends MxyZoo {

    String name = "九月";

    @Override
    public void mFun01() {
        System.out.println("猫咪类中的 mFun01 方法");
    }

    public void mFunCat(){
        System.out.println("猫咪类中特有的 mFunCat 方法");
    }
}

运行结果

在这里插入图片描述


一点点笔记,以便以后翻阅。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小印丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值