一. 构造方法不用加返回类型,首字母大写
这与类的一般方法有所区别:必须要有返回类型,方法名推荐使用小驼峰法。
二. 默认构造方法的访问修饰符继承自类的访问修饰符
但是一旦你重载了,就是你写的那个权限,当然地,如果上面都没加,就是default,包权限。注意,如果类的访问修饰符是public,那么四种访问修饰符构造方法都可以使用(只能缩小权限)。
这里另注意一个问题:
修饰类的访问符就两个:public和default。
都会报错:Modifier ‘xxx’ not allowed here
并且,default是隐式使用的,不能加default关键字修饰,这和方法/变量的修饰符是一样的。
三. 如果重载了构造方法,则一定要重写一下默认的构造方法
不然使用这个默认构造方法时(无论是显式调用——new Xxx()或者super(),还是隐式调用——子类创建对象时)就会报找不到这个方法的错误,即Java设计者的逻辑是:如果你不写我就帮你实现一个默认的即无参空方法体的构造方法,但是一旦你自己实现了构造方法--------无论重载(即写其他有参的构造方法),还是覆写,原来那个空我就不提供了,如果你要用,那么你自己重新写一个,这也是及其推荐的做法:都加一个无参方法——特别是考虑到子类在自己构造方法的第一行会默认调用父类的无参构造方法。
四.构造方法不能继承,对于子类的可见性满足一般方法的访问修饰符原则
构造方法不能被继承,故也无从谈起覆写,只能重载,并且不要忘记加默认的无参构造方法。
一般方法/变量在其他类(包括子类)的可见性满足四种访问修饰符的作用域原则,构造方法同样如此、一般而言,构造方法的使用有两处:
① 子类的构造方法第一行。
② new对象时使用。
这两处均满足四种访问修饰符原则,看下面实验:
结构:
father:
这里将构造方法设置为private
Son:
Daughter:
从结果来看,这符合private不能被其他类方法的访问的原则。
可以看到,虽然我们在子类Son和Daughter类体中没有写构造方法,但是系统还是报错了,这是因为子类有个默认的构造方法,而且在构造方法的第一行默认调用父类无参构造方法,类似于这样:
换成default:
可以看到报错情况:
满足default为包可访问的原则。
protected:
满足protected为包内及其他包子类可访问的原则
public就不写了。
了解了子类构造方法的默认调用规则和构造方法也满足四种访问修饰符原则后,看下面的小实验,有助于我们更深刻理解:
结构照旧:
Father:
Son:
Daughter:
可以看到有趣的是,同包下的Son报错,另外一个包下的Daughter却没有报错。
原因在于,Father中两个构造方法,一个是private,一个是protected。Son虽然与Father同包,但是默认调用的访问是Father的无参构造方法(系统实现),类似这样:
private不能被任何外类访问,故报错。
而Daughter虽然在外包,但是由于自己写的构造方法显式调用了Father的有参构造方法:
而protected是本包及外包子类可用的,故不会报错。这里有个背景知识:不写子类构造方法或者写了子类构造方法却没有显式调用哪一个父类构造方法,则默认调用父类无参构造方法,但是如果显式调用了某一个构造方法(如本例中Daughter调用super(100)),则系统不再自动调用任何其他构造方法。