本文代码仓库地址: 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 方法");
}
}
运行结果
一点点笔记,以便以后翻阅。