一:什么是多态?
- 同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的常见形式
- 父类类型 对象名称 = new 子类构造器;
- 接口 对象名称 = new 实现类构造器;
多态中成员访问特点
- 方法调用:编译看左边,运行看右边。
- 变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
多态的前提
- 1有继承/实现关系;2有父类引用指向子类对象;3有方法重写。
代码示例
package com.d12_polymorphic_advantage;
/**
* 定义父类Animal
*/
public abstract class Animal {
//抽象方法
public abstract void run();
//定义常量
public String name = "父类名字";
}
package com.d12_polymorphic_advantage;
//子类Dog
public class Dog extends Animal{
//重写父类抽象方法
@Override
public void run() {
System.out.println("Dog的run方法");
}
//定义常量
public String name = "Dog名字";
}
package com.itheima.d12_polymorphic_advantage;
//子类Cat
public class Cat extends Animal{
//重写父类抽象方法
@Override
public void run() {
System.out.println("Cat的run方法");
}
//定义常量
public String name = "Cat名字";
}
package com.itheima.d12_polymorphic_advantage;
/**
* 测试类Test
*/
public class Test {
public static void main(String[] args) {
//声明多态方式
//父类 对象名 = new 子类构造器
//方法调用:编译看左边,运行看右边。
//变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
Animal a = new Dog(); //此时,a的类型为父类Animal
Animal b = new Cat(); //此时,b的类型为父类Animal
a.run();
b.run();
//变量调用:编译看左边,运行也看左边。
System.out.println(a.name);
System.out.println(b.name);
}
}
输出结果:
Dog的run方法
Cat的run方法
父类名字
父类名字
二:多态的优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
- 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。
代码示例:
重写测试类Test,验证多态的优势。
package com.itheima.d12_poly;
/**
* 测试类Test 多态的优势
*/
public class Test {
//定义一个接收父类Animal类型参数的方法
public static void go(com.itheima.d12_poly.Animal a) {
System.out.println("调用go方法。");
}
public static void main(String[] args) {
com.itheima.d12_poly.Animal a = new com.itheima.d12_poly.Dog();
com.itheima.d12_poly.Animal b = new com.itheima.d12_poly.Cat();
//调用go方法
go(a);
go(b);
}
}
输出结果:
调用go方法。
调用go方法。