1.在多态代码中访问成员变量
1. 访问成员变量
看等号左边是谁就先用谁的变量
public class Demo01Multi {
public static void main(String[] args) {
Fu zi = new Zi();
zi.num//优先使用父类的 如果不存在的话 继续往上找
}
}
2.访问成员方法
看是谁new的,就优先用谁,没有则向上找。
口诀:
成员变量: 编译看左边,运行还是看左边
成员方法: 编译看左边,运行还是看右边
2.对象的向上转型
对象的向上转型其实就是多态的写法:
父类名称 变量名 = new 子类名称();
例:
Animal animal = new Cat();
含义:
右边创建一个子类对象,相当于父类来看
注意事项:
由下往上很安全:类似与 基本数据类型之间的强制转换
这个是动物类
package com.tjs.day10.demo09;
/**
* @data 16:12
*/
public abstract class Animal {
public abstract void eat();
}
这个是猫-继承动物类
package com.tjs.day10.demo09;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃肉");
}
}
实例对象
package com.tjs.day10.demo09;
/**
* @data 16:14
*/
public class Demo09Mult {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
}
}
输出的是:
猫吃肉
3.对象的向下转型
对象向下转型,其实是一个还原的动作;
格式:
(子类名称) 对象名 = (子类名称) 需要转换的对象名;
例: Cat cat = (Cat) animal;
含义:
将父类对象,还原成本来的子类对象
注意事项:
a. 必须保证对象还原的是创建时候的类,如:猫 , 才能转换为猫 而不是狗,等等
b. 如果对象创建的时候不是猫,还原时还原成猫–编译的时候不报错 运行的时候报错
ClassCastException
4.使用instanceof判断向下转型
在向下转型时需要判断原本是什么类
实现代码如下:
package com.tjs.day10.demo09;
/**
* @data 16:14
*/
public class Demo09Mult {
public static void main(String[] args) {
Animal animal = new Cat();//定义一只猫
//向下转型
if(animal instanceof Cat){
Cat cat = (Cat) animal;
cat.sleep();
}
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.cathHome();
}
giveMeAPet(new Dog());
}
public static void giveMeAPet(Animal animal){
//用处
if(animal instanceof Cat){
Cat cat = (Cat) animal;
cat.sleep();
}
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.cathHome();
}
}
}
当中演示了多态的用法,比如女朋友需要一只动物不管是什么动物都可以,
然后传入一只狗进去用instanceof,判断是否原本子类是否是狗。