向上转型——查看方法
先创建两个类:
一个动物类,有属性/方法
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(){//Cat 特有方法
System.out.println("猫抓老鼠");
}
}
在创建一个测试类:
public class PolyDetail {
public static void main(String[] args) {
//向上转型: 父类的引用指向了子类的对象
//语法:父类类型引用名 = new 子类类型();
Animal animal = new Cat();
Object obj = new Cat();//可以吗? 可以 Object 也是 Cat 的父类
//向上转型调用方法的规则如下:
//(1)可以调用父类中的所有成员(需遵守访问权限)
//(2)但是不能调用子类的特有的成员
//(#)因为在编译阶段,能调用哪些成员,是由编译类型来决定的
//animal.catchMouse();错误
//(4)最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法
//,然后调用,规则我前面我们讲的方法调用规则一致。
animal.eat();//猫吃鱼..
animal.run();//跑
animal.show();//hello,你好
animal.sleep();//睡
}
}
错误原因,该方法是在子类里面有,但是先编译的是父类,可以理解为会先去父类里面查找 catchMouse方法,父类里面没有,就在编译这关过不了,所以不行。
//animal.catchMouse();错误
没有运行父类的eat()是因为,到了运行阶段,是Cat(),所以会先从子类开始依次向父类开始,查找有无此方法。如果有,就用该类方法,如果在子类直接找到,则直接使用。
animal.eat();//猫吃鱼..
向上转型——查看属性
假使创建一个随机类
public class Mian {
public static void main(String[] args) {
One one = new Two();
System.out.println(one.count); //此时打印的是10
}
}
public class One{
int count = 10;
}
public class Two {
int count = 20;
}
根据上面的问题,为什么不是打印20,而是10,因为属性是没有重写这说的。
所以当编译类型是上面,那么这时候的向上转型就会打印编译类型的属性