java——多态

本文详细介绍了Java中的多态性概念,强调了其在继承体系下通过父类引用调用子类重写方法的特点。文章还探讨了多态性的前提条件,并通过代码示例展示了多态的优点。同时,文章警示了在构造方法中调用可能被重写方法的风险,因为这可能导致子类对象未完全构造时就执行特定操作,如示例中D类的func方法在num未初始化时被调用。
摘要由CSDN通过智能技术生成

一.多态的概念

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。

二.多态发生的前提条件

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值