java中的多态
本文主要讲述java中的多态性质:
老韩ppt,讲述多态的概念,如图所示:
- 向上转型:
代码结构如图:
Animal类:
public class Animal { private String name; public Animal(String name) { this.name = name; } public void eat(){ System.out.println("animal在吃..."); } private void sleep(){ System.out.println("animal在睡觉..."); } }
Cat类:
public class Cat extends Animal{ // 调用父类的带参构造器 public Cat(String name) { super(name); } public void eat(){ System.out.println("猫吃鱼..."); } public void CatchMouse(){ System.out.println("猫抓老鼠..."); } }
PloyDetail类:
public class PloyDetail { public static void main(String[] args) { Animal animal = new Cat("大黄"); // animal.CatchMouse(); animal.eat(); animal.sleep(); } }
运行结果如下:
说明,编译阶段a是A的对象,但是在运行时,仍然按照子类的具体实现,即new ...,调用方法,先在具体实现的类中查找,如果没有再去父类中继续查找,例如eat()方法,子类Cat有该方法,直接调用,而sleep()方法,子类Cat中没有该方法,查看父类,父类中有sleep()方法,调用该方法。
向上转型注意细节:
① 向上转型的使用前提是继承,具体细节如下:
向上转型:父类的引用指向了子类的对象,语法:父类类型 引用名 = new 子类类型();
② 可以调用父类的所有成员(遵循访问权限),但是不能调用子类的特有成员,原因如下:
A a = new B(),A是B的父类,在编译阶段,a是A类的对象,能调用哪些成员,是由编译类型决定的。
③ 最终运行效果看子类的具体实现,调用方法时,按照从子类开始查找方法,如果子类没有,就从其父类查找,一层一层查找下去。最后,如果还是没有该方法,就报错。
- 向下转型:
代码结构如图:
Dog类:
public class Dog extends Animal{ public Dog(String name) { super(name); } }
PloyDetail类:
public class PloyDetail { public static void main(String[] args) { Animal animal = new Cat("大黄"); // animal.CatchMouse() animal.eat(); animal.sleep(); Cat cat = (Cat)animal; cat.CatchMouse(); // Dog dog = (Dog)animal; } }
运行结果如下:
Cat cat =(Cat) animal,将Cat类的引用cat指向animal指向的内容。
向下转型注意细节:
① 使用语法:子类类型 引用名 = (子类类型) 父类引用
Animal animal = new Cat("大黄"); Cat cat = (Cat)animal;
② 只能强转父类的引用,不能强转父类的对象
Animal animal = new animal("大黄"); Cat cat = (Cat)animal;
这种方式是错误的,animal已经是Animal类的对象了,无论是编译阶段还是在运行阶段。
③ 要求父类的引用必须指向当前目标类型的对象
Animal animal = new Cat("大黄"); Dog dog = (Dog)animal;
这种方式是错误的,animal在编译阶段是Animal类的对象,但是在运行时,是Cat类对象。
④ 当向下转型时,可以调用子类类型中的所有成员。
cat.CatchMouse();
多态时,属性的值看编译类型。