关于Java继承中父类和子类构造函数的问题
Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数,

可以参考这篇Java子类实例化总是默认调用父类的无参构造操作
1、当父类没有显式定义构造方法时,
编辑器会默认为此类添加一个隐式无参构造函数。此时子类可以有自己的无参和有参构造方法。不论实例化时调用的是子类的有参还是无参构造函数,默认调用的是父类的无参构造函数。
2、当父类有显式定义无参构造方法时,
此时子类也可以有自己的无参和有参构造方法。类似于1,同样默认隐式调用父类的无参构造方法。
3、当父类只有显式定义有参构造方法时,
(1)子类定义无参方法会出错:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隐式父类构造函数Father()未定义, 必须显式调用另一个构造函数,当此时调用父类的有参构造函数时,使用super(i),这里i是参数,会提示i没有定义,因为此时是无参构造函数,此时要使子类也有无参构造函数,只能在子类的无参构造函数中调用父类的有参构造函数,并给父类的有参构造函数赋一个实参;
(2)在子类的有参构造函数中使用super(i)调用父类的有参构造函数不会出错,因此若父类只有有参的构造方法,子类也只能有有参的构造方法,且子类的有参构造方法必须显示调用父类的有参构造方法。
分析:默认都是调用父类的无参构造函数,当父类有有参构造函数时,编辑器不会为父类添加无参的构造函数,在子类继承父类时,本来是默认在构造函数第一行都是默认有使用super()调用父类无参构造函数的,现在父类没有无参构造函数,因此提示显示调用另一个构造函数(即有参构造函数)。
提醒一点,当没有子类继承父类时,父类只定义有参构造函数是没有问题的。
4、当父类和子类都有无参和有参构造方法时,默认是子类构造方法都是调用父类的无参构造方法的,但当子类的有参构造方法使用super(i)调用父类的有参构造方法时,带参数实例化时就不再调用父类的无参构造方法,而是调用父类的有参构造方法,因为是显示调用(人为强制的)。
总结:
父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数;当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类无参构造函数也必须显式调用父类的有参构造函数,但需给父类有参构造函数赋实参。
1中的示例:
package classTest;
class Father1{
}
class Son1 extends Father1{
public Son1() {
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
}
}
运行结果:
子类的无参构造方法
2中的示例:
package classTest;
class Father1{
public Father1() {
}
}
class Son1 extends Father1{
public Son1() {
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
}
}
运行结果:
子类的无参构造方法
3中的示例(1):
package classTest;
class Father1{
public Father1(int i) {
System.out.println("父类中的有参构造方法"+i);
}
}
class Son1 extends Father1{
public Son1() {
//下两行需注释掉一行
super(i);//此时会报错
super(1);//此时不会报错,调用父类构造函数,但参数值是固定的,不能在调用时传入其他值。
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
super(i);
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
}
}
结果:显示参数没有定义
Exception in thread "main" java.lang.Error: Unresolved compilation problem: i cannot be resolved to a variable
3中的示例(2):
package classTest;
class Father1{
public Father1(int i) {
System.out.println("父类中的有参构造方法"+i);
}
}
class Son1 extends Father1{
public Son1(int i) {
super(i);
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
System.out.println("-----");
Son1 a = new Son1(5);
}
}
结果:
-----
父类中的有参构造方法5
子类中有参构造方法5
4中的示例:
package classTest;
class Father1{
public Father1() {
System.out.println("父类的无参构造方法");
}
public Father1(int i) {
System.out.println("父类中的有参构造方法"+i);
}
}
class Son1 extends Father1{
public Son1() {
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
super(i);
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
System.out.println("-----");
Son1 a = new Son1(5);
}
}
结果:
父类的无参构造方法
子类的无参构造方法
-----
父类中的有参构造方法5
子类中有参构造方法5
以上这篇关于Java继承中父类和子类构造函数的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
代码知识SEO上一篇 : vue中解决微信html5原生ios虚拟键返回不刷新问题
下一篇 : java 取模与取余的区别说明
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!