不能使用子类的特有属性和行为
成员变量 编译看左边(父类),运行看左边(父类)成员方法 编译看左边(父类),运行看右边(子类)静态方法 编译看左边(父类),运行看左边(父类); 静态和类相关,算不上重写,因此访问还是左边的
只有非静态的成员方法,编译看左边,运行看右边
class Polymorphic{ public static void main(String[] args){ Cat c = new Cat(); c.eat(); Animal a = new Cat(); //父类引用指向子类对象,就是向上转型 a.eat(); // a.catchMouse(); Cat c1 = (Cat)a; //向下转型 c1.catchMouse(); //多态提高扩展性 animalEat(new Cat()); //一般在实际开发中创建对象时使用父类应用指向子类对象,直接创建子类对象更方便,可以使用子类中的特有属性和行为 animalEat(new Dog()); System.out.PRintln("------------------------"); Father f = new Son(); //父类引用指向子类对象 System.out.println(f.num); f.print(); f.staticPrint(); //相当于使用类名去调用 System.out.println("------------------------"); //基本数据类型自动类型提升和强制类型转换 int i = 10; byte b = 20; // i = b; //自动类型提升 // b = (byte)i; //强制转换 } //如果两子类之间强转,就会出现类型转换异常,ClassCastException public static void animalEat(Animal a){ //当做参数时使用多态最好,因为扩展性好 a.eat(); // a.catchMouse(); //不能使用子类的特有属性和行为 //关键字 instanceof 判断前边的引用是否为后边的数据类型 if (a instanceof Cat) { Cat c = (Cat)a; c.eat(); c.catchMouse(); }else if (a instanceof Dog) { Dog d = (Dog)a; d.eat(); d.lookHome(); }else{ a.eat(); } }}class Animal{ public void eat(){ System.out.println("动物吃饭"); }}class Cat extends Animal{ public void eat(){ System.out.println("猫吃鱼"); } public void catchMouse(){ System.out.println("猫抓老鼠"); }}class Dog extends Animal{ public void eat(){ System.out.println("狗吃肉"); } public void lookHome(){ System.out.println("狗看门"); }}/* 成员变量 编译看左边(父类),运行看左边(父类) 成员方法 编译看左边(父类),运行看右边(子类) 静态方法 编译看左边(父类),运行看左边(父类); 静态和类相关,算不上重写,因此访问还是左边的 只有非静态的成员方法,编译看左边,运行看右边*/class Father{ int num = 10; public void print(){ System.out.println("Father"); } public static void staticPrint(){ System.out.println("static Father"); }}class Son extends Father{ int num = 20; public void print(){ System.out.println("Son"); } public static void staticPrint(){ System.out.println("static Son"); }}成员变量:
成员方法:
![]()
父类不能调用子类的方法,报错:
最终输出:
新闻热点
疑难解答