一.多态的概念
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。
二.多态发生的前提条件
1.必须在继承体系下。
2.子类必须对父类中的方法进行重写。
3.通过父类的引用调用重写的方法(向上转型)
(上两篇博客解释了重写和向上转型)
多态体现:当代码运行时,传递不同类对象时,会调用不同类的方法
class Shape{
public void draw(){
System.out.println("画图形");
}
}
class Cycle extends Shape{
@Override
public void draw() {
System.out.println("⭕");
}
}
class Rect extends Shape{
@Override
public void draw(){
System.out.println("长方形");
}
}
class Triangle extends Shape{
@Override
public void draw(){
System.out.println("三角形");
}
}
class Flower extends Shape{
@Override
public void draw() {
System.out.println("❀");
}
}
public class Test {
public static void drawShapes(){//多态的优点体现
Cycle cycle = new Cycle();
Rect rect = new Rect();
Flower flower = new Flower();
Shape[] shapes = {cycle,rect,flower,cycle,rect};
for(Shape shape:shapes){
shape.draw();
}
}
public static void main(String[] args) {
Shape shape1 = new Cycle();
shape1.draw();
drawShapes();
}
}
三.避免在构造方法中调用重写的方法
一段有坑的代码. 我们创建两个类, B 是父类, D 是子类. D 中重写 func 方法. 并且在 B 的构造方法中调用 func
class B {
public B() {
// do nothing
func();
}
public void func() {
System.out.println("B.func()");
}
}
class D extends B {
private int num = 1;
@Override
public void func() {
System.out.println("D.func() " + num);
}
}
public class Test {
public static void main(String[] args) {
D d = new D();
}
}
// 执行结果
D.func() 0
1.构造d对象的同时,会调用B的构造方法。
2.B中的构造方法中调用了 func 方法, 此时会触发动态绑定, 会调用到 D 中的 func
3.此时 D 对象自身还没有构造, 此时 num 处在未初始化的状态, 值为 0.