您的位置:首页 > 编程语言 > Java开发

Java之构造器<constructor>

2016-03-10 14:57 423 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java之构造器