java学习——基础入门(2)

本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正

1. 关于无参构造函数与有参构造函数

我们都知道如果不定义无参构造函数系统会自动调用默认构造函数

当我们定义了一个有参构造函数,就必须手动定义一个无参构造函数

这里来尝试分析下原因,首先要了解下构造函数的调用逻辑

上图中我们可以看出子类的构造函数将会递归优先调用父类方法的

无参构造函数,效果相当于

class GrandFather{
    public GrandFather(){
        super();
        System.out.println("高层构造函数");
    }
}

class Father extends GrandFather{    
    public Father(){
        super();
        System.out.println("中层构造函数");
    }
}

class Son extends Father{    
    public Son(){
        super();
        System.out.println("底层构造函数");
    }
}

只不过这里将super给隐藏了,这是系统默认会执行的语句

我们可以发现,无参构造函数在申明时默认调用的是父类的无参构造函数。

加入我们把中间一层的无参构造函数去掉,并只申明一个有参构造函数。

此时,编译器将提醒我们存在编译错误:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor

强制要求我们申明Father类的无参构造函数,这是因为编译器认为,此时子类并不想走

父类的无参构造函数,但是又没有指明该走哪条路,这里的super()失效了,

所以我们可以给Son指出他的道路

只要显示的申明super(1),告诉子类递归走父类的哪一个构造函数即可。

由此可见,实际上一个类假如不作为父类,不申明无参构造函数并不会造成实际影响。

但我们并无法保证永远不作为子类这一前提,所以我们还是需要遵循规则去显示的申明。

值得注意的是,每个构造函数的首行如果没有显示的super父类构造函数,编译器将默认添加上super(),指向

父类的默认构造函数

在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
不能在构造方法以外的任何方法内调用构造方法。
在一个构造方法内只能调用一个构造方法。

争取早日不再是一只菜鸡
原文地址:https://www.cnblogs.com/jchen104/p/14655940.html