java基础篇 之 构造器内部的多态行为

简介: java基础篇 之 构造器内部的多态行为

java基础篇 之 构造器内部的多态行为

我们来看下下面这段代码:

public class Main {
    public static void main(String[] args) {
        new Son(5);
    }
}
class Person{
    void draw(){
        System.out.println("person draw");
    }
    Person (){
        System.out.println("before person draw");
        draw();
        System.out.println("after person draw");
    }
}
class Son extends Person{
    private int radius = 1;
    Son(int radius){
        this.radius = radius;
        System.out.println("son'radius="+radius);
    }
    @Override
    void draw(){
        System.out.println("son draw,radius="+radius);
    }
}

我们可以来猜下,运行结果是什么呢?

before person draw
son draw,radius=0
after person draw
son'radius=5

看到这个结果有迷惑的同学吗?为什么中间会输出son draw,radius=0呢?

下面我来解释下,首先,我们知道,在创建一个子类对象时,子类构造函数执行的时候,会默认调用父类的空参构造(如果有的话,如果没有空参构造,必须显示调用)。我们将其补全就成了这样

    Son(int radius){
      super();
        this.radius = radius;
        System.out.println("son'radius="+radius);
    }

我们又知道Person的构造函数执行的时候,调用了draw();方法,其实前面也省略了默认的this,我们也将其补全

class Person{
    void draw(){
        System.out.println("person draw");
    }
    Person (){
        System.out.println("before person draw");
        this.draw();
        System.out.println("after person draw");
    }
}

看到这里不知道大家有没有明白一点?


在执行Son的构造方法时,会先调用Person类的构造函数,此时这个构造函数中,又调用了draw方法,并且是通过this调用的。这里this指向的是一个还未完全完成初始化的Son对象(因为构造Son的构造函数还未执行,此时还在执行父类的初始化),此时的radius被赋了一个默认初始值0。到这里大家应该明白了吧


相关文章
|
20天前
|
Java
Java中的继承和多态是什么?请举例说明。
Java中,继承让子类继承父类属性和方法,如`class Child extends Parent`,子类可重写父类方法。多态允许父类引用指向子类对象,如`Animal a = new Dog()`,调用`a.makeSound()`会根据实际对象类型动态绑定相应实现,增强了代码灵活性和可扩展性。
13 0
|
21天前
|
设计模式 Java
Java基础—笔记—多态、final、抽象类、接口篇
该文介绍了编程中的多态、final和抽象类、接口相关概念。多态允许子类重写父类方法,通过父类引用调用子类方法,实现解耦和提高代码灵活性,但也可能导致无法使用子类特有功能,需通过强制类型转换解决。final用于修饰不可变的类、方法或变量,防止继承、重写和多次赋值。抽象类是一种包含抽象方法的类,用于强制子类重写特定方法,实现多态,适用于模板方法设计模式,解决代码重复问题。
17 0
|
27天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
16 3
|
2月前
|
Java
【Java】一个简单的接口例子(帮助理解接口+多态)
【Java】一个简单的接口例子(帮助理解接口+多态)
19 0
|
2月前
|
Java
java多态详解
java多态详解
26 0
|
2月前
|
Java 程序员 编译器
Java继承与多态知识点详解
本文主要讲解的是Java中继承与多态的知识点
|
2月前
|
安全 Java 编译器
Java多态详解(2)
Java多态详解(2)
|
2月前
|
Java 编译器
Java多态详解(1)
Java多态详解(1)
C4.
|
2月前
|
Java
Java多态
Java多态
C4.
13 0
|
2月前
|
安全 Java 数据库连接
【Java每日一题】——第四十三题:编程用多态实现打印机.。分为黑白打印机和彩色打印机,不同类型的打印机打印效果不同。
【Java每日一题】——第四十三题:编程用多态实现打印机.。分为黑白打印机和彩色打印机,不同类型的打印机打印效果不同。
41 0