Java之构造器<constructor>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值