package com.hspedu.testpoly_; import org.junit.Test; public class TestPoly_ { /** * 1、编译类型和运行类型: * 例如:Animal dog = new Dog("小白"); * Animal是编译类型(=的左边),Dog是运行类型(=的右边) * * 2、编译类型确定即不能再改变,运行类型可以修改 * 例如:Animal white = new Dog("小白狗"); * white = new Cat("小白猫"); * * 3、程序的执行结果是根据运行类型决定的,但是编译类型决定可以调用的方法有哪些 * 例如:Animal white = new Dog("小白狗"); * white对象可以调用的方法有:eat方法(Animal类里的所有方法),不能调用Dog类里的run方法 * white对象调用的eat方法的执行结果,是Dog类的eat方法执行结果 */ @Test public void testPolymorphism() { Animal white = new Dog("小白狗"); white.eat(); // white.run(); // 错误:没有run方法 white = new Cat("小白猫"); white.eat(); // cat.jump(); // 错误:没有jump方法 } } class Animal { String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println("觅食..."); } } class Dog extends Animal { String name; public Dog(String name) { super(name); this.name = name; } @Override public void eat() { System.out.println(name + "在啃骨头.."); } public void run() { System.out.println("dog run..."); } } class Cat extends Animal { String name; public Cat(String name) { super(name); this.name = name; } @Override public void eat() { System.out.println(name + "在吃鱼.."); } public void jump() { System.out.println("cat jump..."); } }
1、多态是两个类存在继承关系;
2、多态向上转型:父类的引用指向子类的对象;语法:父类 xxx = new 子类();
3、可以调用父类中的所有方法,前提是有访问权限,不能调用子类的独有方法;
程序在编译阶段,已经决定这个对象可以调用的属性、方法
4、程序运行结果是根据运行类型决定。
package com.hspedu.testpoly_; import org.junit.Test; public class TestPoly_ { /** * 父类对象指向子类时,如何调用子类方法? * 例如:Animal white = new Dog("小白狗"); * white不能直接调用run方法,需要进行向下转型 * Dog dog = (Dog) white; * dog则可以调用子类Dog中的所有方法 */ @Test public void testPolymorphism() { Animal white = new Dog("小白狗"); white.eat(); // white.run(); // 错误:没有run方法 Dog dog = (Dog) white; dog.run(); white = new Cat("小白猫"); white.eat(); Cat cat = (Cat) white; cat.jump(); } } class Animal { String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println("觅食..."); } } class Dog extends Animal { String name; public Dog(String name) { super(name); this.name = name; } @Override public void eat() { System.out.println(name + "在啃骨头.."); } public void run() { System.out.println(name + " run..."); } } class Cat extends Animal { String name; public Cat(String name) { super(name); this.name = name; } @Override public void eat() { System.out.println(name + "在吃鱼.."); } public void jump() { System.out.println(name + " jump..."); } }