java之构造器(构造方法)
1.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
2.构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
3.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。
在这里我们来一段代码看看:
class Father{
public Father(String f){
System.out.println("I'm father");
}
}
class Son extends Father{
public Son(String f){
//这里有一个默认的调用父类的构造 super()
System.out.println("I'm son");
}
public static void main(String[] args){
Son son=new Son("son");
}
}
来看看这段代码有什么问题。
有没有看出来?
首先,在main方法里面Son son=new Son(“son”);
使用new关键字来创建对象,在创建对象时要调用son的构造方法。
看Son类的构造方法,有一个显示的传参的构造方法,因为子类是继承自父类,在调用自身构造方法时,又需要调用父类的构造方法。由于子类没有说明调用父类的哪个构造方法,那就会默认调用父类的无参构造方法(在子类的有参构造的第一行有个隐藏的调用父类的构造方法super())。
在看Father类的构造方法,只有一个显示的传参的构造方法(在java中有条规定,既然提供了显示的构造方法,那么就不在提供默认的构造方法),那么子类显然在父类中找不到相应的构造方法,就会报错:
Implicit super constructor Father() is undefined. Must explicitly invoke another constructor
那么,可以有两种改法,
A:
class Father{
public Father(){}//提供一个显示的无参构造
public Father(String f){
System.out.println("I'm father");
}
}
class Son extends Father{
public Son(String f){
System.out.println("I'm son");
}
public static void main(String[] args){
Son son=new Son("son");
}
}
A修改后最后的结果是:I’m son
B
class Father{
public Father(String f){
System.out.println("I'm father");
}
}
class Son extends Father{
public Son(String s){
super(s)//明确调用父类的有参构造
System.out.println("I'm son");
}
public static void main(String[] args){
Son son=new Son("son");
}
}
B修改后,最终的结果是:
I’m Father
I’m son