构造函数基础
作用:构建当前类的对象
分类:无参构造函数、有参构造函数
特点:无返回值(注意区分与void的区别)、方法名与类名相同
写法:
模板:
权限修饰符 类名 ([参数列表]) [抛出异常]{
[函数体]
}
[]中为可选项,所以/最简\模板为:
权限修饰符 类名 () {}
要点:
- 若该类没有定义构造函数,系统会默认生成一个无参构造函数
- 其中权限修饰符[privatre、protected、默认修饰符(什么都不写)、private]均可使用
- 构造函数不能用static、final修饰
- 有参构造函数的函数体不是必须
常见问题:可以有与构造函数同名的方法吗?
答:可以
例如:
public class Singleton {
String name;
private volatile static Singleton singleton;
Singleton() {
System.out.println("父类无参构造函数");
}
private void Singleton() {
System.out.println("与构造函数同名的 无 参方法");
}
protected Singleton(String name) {
this.name = name;
System.out.println("父类有参构造函数");
}
public void Singleton(String name) {
System.out.println("与构造函数同名的 有 参方法");
}
}
进阶——继承与构造函数的奇妙反应
要点:调用子类构造函数时会先调用父类的构造函数
如当前有Son和Father两个类
当调用Son的构造函数时,均会隐性的调用Father的无参构造函数,即调用了super( );
现在我们将Father的无参构造函数删除,仅保留有参构造函数,对Son会有什么影响?
将Father的无参构造函数删除后,Son的两个构造函数均爆红,提示信息为There is no default constructor available in ‘f_and_s.Father’,即缺少Father的无参构造函数。
Q:如何在不修改Father类的情况下,使Son的构造函数好使?
A:在Son的每个构造函数的第一行调用父类的有参构造函数即可,如下图(此处将Son的name属性添加了static修饰)
super( )未放置于第一行报错(Call to ‘super()’ must be first statement in constructor body):
结论:Son类的构造函数必须隐性或显性的调用父类的构造函数,且必须在自己构造函数的第一行调用。
\ \ \若有错请在评论区指出,共同学习,共同进步/ / /