向上转型和向下转型
public class Application {
public static void main(String[] args) {
//向上转型:父类的引用指向子类的对象
//语法:父类类型引用名=new 子类类型();
//编译类型看等号左边,运行类型看等号右边
Animal animal = new Cat();
//可以调用父类的所有成员(需要蹲守方法权限)
//但是不能调用子类的特有的成员
//因为在编译阶段,能调用哪些成员,由编译类型决定
//animal.catchMouse(); 错误
//最终运行结果看子类(运行类型)的具体实现,即调用方法时按照从子类(运行类型)中查找方法,子类中没有再从父类中查找方法
animal.eat();
animal.run();
animal.show();
animal.sleep();
//向下转型
//语法:子类类型 引用名=(子类类型) 父类引用
//要求父类的引用必须指向的是当前目标类型的对象
//可以调用子类类型中所有的成员
Cat cat = (Cat) animal; //编译类型和运行类型都是Cat
cat.catchMouse();
}
}
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 test {
public static void main(String[] args) {
Base base = new Sub(); //向上转型
Sub sub = new Sub();
System.out.println(base.count); //看编译类型 10
System.out.println(sub.count); //20
}
}
class Base { //父类
int count = 10; //属性
}
class Sub extends Base { //子类
int count = 20; //属性
}
instanceOf 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
//aa编译类型是Animal,运行类型是Cat
Animal aa = new Cat();
System.out.println(aa instanceof Animal); //true
System.out.println(aa instanceof Cat); //true