子类无参构造调用父类有参构造方法
2016-09-23 12:54
218 查看
先上问题:
![](https://img-blog.csdn.net/20160923122656469)
可以看到 子类的无参构造调用父类有参构造是出错了。编译器不允许这样做。
其实这是一个历史问题,历史老师是这样说的:
0.构造方法一般是为对象的某些属性作初始化的。
1. 我们先看看一般怎样创建子类。
当new一个Man对象时,是会调用该类的无参构造方法的。
2. java继承中,执行子类的构造方法之前,会先调用父类中没有参数的构造方法。如果没有显式的super调用,那么就是默认调用父类无参。 其目的是为了帮助继承自父类的成员作初始化操作。
目前以上三点能告诉我们以上代码非static构造方法的执行顺序了。
那么这个问题其实是关于类初始化的问题。不禁想:既然无法在超类构造器之前引用name,那么是不是name还没初始化呢?那么有这想法就好办了,在name属性前加一个static试试。
![](https://img-blog.csdn.net/20160923123406479)
确实可以了。那么实际类初始化顺序是怎样的呢?
类的初始化顺序:
1). 父类static(顺序按照代码书写顺序进行)
2). 子类static(顺序按照代码书写顺序进行)
3). 父类非static域、构造器(顺序按照代码书写顺序进行)
4). 子类非static域、构造器(顺序按照代码书写顺序进行)
也就是说,在父类构造器加载时(相当于参数赋值时)检查到name(因为是在子类中)其实并未有name的加载入,所以jvm检测到就报错。那么在name属性前加个static就是让name先加载(赋值)了先,然后再在父类构造器里引用那就没有问题了。
目前对这个问题了解到这么多,如有错误望告知,及时修改。
为什么我的子类无参调用父类有参会出错??
有同学这样问我,上图。class Person{ public Person(String name) { System.out.println("My name is "+name); } } class Man extends Person{ private String name = "Hello"; public Man(){ super(name); //这里调用父类有参出错 } } public class TestDemo { public static void main(String []args) { Man m = new Man(); } }
可以看到 子类的无参构造调用父类有参构造是出错了。编译器不允许这样做。
其实这是一个历史问题,历史老师是这样说的:
0.构造方法一般是为对象的某些属性作初始化的。
1. 我们先看看一般怎样创建子类。
Man m = new Man();
当new一个Man对象时,是会调用该类的无参构造方法的。
2. java继承中,执行子类的构造方法之前,会先调用父类中没有参数的构造方法。如果没有显式的super调用,那么就是默认调用父类无参。 其目的是为了帮助继承自父类的成员作初始化操作。
目前以上三点能告诉我们以上代码非static构造方法的执行顺序了。
那么这个问题其实是关于类初始化的问题。不禁想:既然无法在超类构造器之前引用name,那么是不是name还没初始化呢?那么有这想法就好办了,在name属性前加一个static试试。
确实可以了。那么实际类初始化顺序是怎样的呢?
类的初始化顺序:
1). 父类static(顺序按照代码书写顺序进行)
2). 子类static(顺序按照代码书写顺序进行)
3). 父类非static域、构造器(顺序按照代码书写顺序进行)
4). 子类非static域、构造器(顺序按照代码书写顺序进行)
也就是说,在父类构造器加载时(相当于参数赋值时)检查到name(因为是在子类中)其实并未有name的加载入,所以jvm检测到就报错。那么在name属性前加个static就是让name先加载(赋值)了先,然后再在父类构造器里引用那就没有问题了。
目前对这个问题了解到这么多,如有错误望告知,及时修改。
相关文章推荐
- Java继承,子类实例化时,调用父类的无参构造方法
- java中子类继承父类自动调用父类无参构造方法的问题
- java中关于子类实例化时调用父类无参构造方法的问题
- Java子类调用父类的有参和无参的构造方法
- 父类不含无参构造方法子类构造方法必须显式调用
- [转]Java中子类调用父类构造方法的问题分析
- Java中子类调用父类构造方法的问题分析
- 在子类中调用父类的带参数的构造方法
- new 一个没有定义构造方法的子类对象,会调用父类的默认构造方法
- Java中子类与父类的构造方法的调用关系
- Java多态 实例子类自动调用父类为空的构造方法 成员变量不支持Override 可写,没多态效果
- 错误记录--Java中子类继承父类必须调用父类的构造方法?
- 子类调用父类构造方法问题
- java继承时,实例化子类,是否会默认调用父类构造方法
- 子类继承父类(父类和子类里:块、静态块、构造和方法覆写)之间调用顺序
- 声明一个父类A,它只有一个非默认构造方法;声明A的子类B,B具有默认构造方法及非默认方法,并在B的构造方法中调用基类A的构造方法。
- Java中静态代码块,非静态代码块,以及父类与子类的构造方法的之间调用顺序
- 子类调用父类构造方法示例
- C++和JAVA中一些区别,包括指向子类的引用会调用谁的方法,子类构造函数自动调用父类构造函数时,父构造会调用的谁方法
- 子类继承父类(父类和子类里:块、静态块、构造和方法覆写)之间调用顺序