java的无参构造函数_在Java中声明一个无参构造函数的目的是什么?

在Java中,无参构造函数对于类的继承是必要的,因为子类在初始化时会默认调用父类的无参构造函数。然而,如果父类的构造函数是私有的,那么目的是实现单例模式,防止其他类创建该类的实例,确保类只有一个对象存在。这样做可以控制类的实例化过程,特别是在需要全局唯一对象的情况下。私有构造函数在设计模式中是单例模式的核心特征。
摘要由CSDN通过智能技术生成

我们在定义一个类的时候,如果需要重新写一个构造函数,就必须要写一个无参构造函数,如下代码所示,那这到底是为什么?

public class Fruit {

private String name;

// 必须显式声明一个无参构造函数

public Fruit(){}

public Fruit(String name){

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

要回答这个问题,我们就来把这个无参构造函数去掉试试。

按照如下方式,用起来也没多大的问题:

public static void main(String[] args){

Fruit apple = new Fruit("apple");

// print "apple"

System.out.println(apple.getName());

}

但是,当我们需要派生一个子类的时候,编译就报错了:

public class Apple extends Fruit {

// There is no default constructor available in 'cn.zx.demo.Fruit'

}

这是因为,子类在使用自己的默认无参构造函数初始化的时候,会执行super()来调用父类的默认无参构造函数,但是父类中此时没有这样的构造函数,因此编译器认为出现了异常。

如果我们在父类Fruit中显式地声明一个无参构造函数,就像本文一开始演示的代码一样,那么就不会出现这样的问题了。

再进一步思考,如果子类实例化的时候不使用super()来调用父类的无参构造函数是不是就不会出现这样的问题了呢?

答案是肯定的:

public class Apple extends Fruit {

public Apple(String name){

super(name);

}

}

只要在子类中指定调用父类中存在的构造函数,那么子类就是可以被正确初始化的,程序编译也就没有问题。

然而,我们其实并不能确定将要如何初始化一个子类,而且,我们也不可能为每一个子类都显式地调用其存在的父类构造函数,这样太过繁琐。

比如,我们需要创建一个没有name属性的banana对象,那么此时将没有合适的父类的构造方法供调用:

public class Banana extends Fruit {

public Banana (){

// 没有合适的父类构造函数供调用

}

}

所以,为了可扩展,在类中重新写构造函数的时候,额外声明一个无参构造函数是一个良好的编程习惯。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上都是转载,内容也很好理解,但是今天看业务代码,无参构造函数是私有的,private修饰的。这就很令人费解了,查了一下,应该是基于以下原因:

Java中如果将一个方法声明为私有的,即通过private关键字来修饰,此时也就意味着该方法只能由这个类本身来调用。构造方法,类似于常规的方法,同样可以被public、protected、private这三个关键词修饰,但是构造方法不能有返回值。我们人为地将构造方法声明为private,这样其他的类就不能直接调用该类生成新的对象,也就避免了同一个类被反复创建的情况,这种情况,该类只有一个对象实例。

这种思想也就是单例模式的设计思想。在该种思想模式下,一个类只能是对应于一个对象,没有其他的类可以创建新的对象,这也就保证了单例模式下只有一个对象。私有构造方法已经广泛应用于jdk当中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值