父类不含无参构造方法子类构造方法必须显式调用
2015-08-03 23:29
405 查看
一直不知道怎么取这个标题。。。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/33c29e3268d66ef5c09858efe40a3635.gif)
前两天发现我父类中定义了一个带参构造方法,然后子类继承后构造方法必须先调用父类方法带参构造方法,方法调用为super(参数,...)。
然后我就上网查,可能关键字没搞对。。哈哈。。。一直没明白,后来发现,如果父类含有不带参构造方法,那么子类就不需要上述操作。
那么为什么呢?
先说下类实例化的过程,也就是new一个对象的时候
首先默认运行的是类中无参的构造方法(这个可能在实例化过程java会为每一个类自动创建的),这是java默认首先运行的;
当然如果你重写无参的了构造方法那么默认运行的就是你重写的无参构造方法;
还有一种情况就是你只写了带参的构造方法,那么此时,实例化对象的时候,需要手动指定参数来运行含有对应参数的构造方法来构造对象。
例1:
知道了类实例化过程之后讨论下在继承关系下,实例化子类又是怎么样的吧。。。。
在继承关系下实例化子类的时候会先实例化其父类,然后再实例化子类。
也就是说在new一个子类的时候,其实是需要先把父类new出来的,如果父类中还有父类,那么就会逐层进行,从最顶层的父类先实例化,最后才到当前的子类。
例2:
例2运行结果:
由例2可以得出结论父类不含无参构造方法时子类构造方法必须显式调用父类带参构造方法,因为子类实例化的时候先需要实例化父类
当然上面说在new子类的时候需要先new父类,在例2中super(i)其实就是调用父类的public Father (int i)构造方法,即这里就相当于new了Father对象了
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/33c29e3268d66ef5c09858efe40a3635.gif)
前两天发现我父类中定义了一个带参构造方法,然后子类继承后构造方法必须先调用父类方法带参构造方法,方法调用为super(参数,...)。
然后我就上网查,可能关键字没搞对。。哈哈。。。一直没明白,后来发现,如果父类含有不带参构造方法,那么子类就不需要上述操作。
那么为什么呢?
先说下类实例化的过程,也就是new一个对象的时候
首先默认运行的是类中无参的构造方法(这个可能在实例化过程java会为每一个类自动创建的),这是java默认首先运行的;
当然如果你重写无参的了构造方法那么默认运行的就是你重写的无参构造方法;
还有一种情况就是你只写了带参的构造方法,那么此时,实例化对象的时候,需要手动指定参数来运行含有对应参数的构造方法来构造对象。
例1:
package com.zero; public class Father { //年龄 private int age; //仅有一个带参数的构造方法 public Father (int i){ this.age = i; System.out.println("实例化父类 ag = " + age); } //main方法 public static void main (String [] args) { //实例化对象时必须指定参数以运行对应的构造方法实例(构造)对象 Father fa = new Father(40); Father fa1 = new Father(50); } }例1运行结果
实例化父类 ag = 40 实例化父类 ag = 50
知道了类实例化过程之后讨论下在继承关系下,实例化子类又是怎么样的吧。。。。
在继承关系下实例化子类的时候会先实例化其父类,然后再实例化子类。
也就是说在new一个子类的时候,其实是需要先把父类new出来的,如果父类中还有父类,那么就会逐层进行,从最顶层的父类先实例化,最后才到当前的子类。
例2:
package com.zero; public class Son extends Father{ private int age; //子类构造方法——必须先显式调用父类构造方法 public Son(int i) { super(i);//必须先调用父类的构造方法,然后才能写子类构造方法的其他逻辑 this.age = i - 20; System.out.println("实例化子类 age = " + age); } //main方法 public static void main (String [] args) { //实例化子类Son Son so = new Son(40); Son so1 = new Son(50); } }
例2运行结果:
实例化父类 ag = 40 实例化子类 age = 20 实例化父类 ag = 50 实例化子类 age = 30
由例2可以得出结论父类不含无参构造方法时子类构造方法必须显式调用父类带参构造方法,因为子类实例化的时候先需要实例化父类
当然上面说在new子类的时候需要先new父类,在例2中super(i)其实就是调用父类的public Father (int i)构造方法,即这里就相当于new了Father对象了
public Father (int i){ this.age = i; System.out.println("实例化父类 ag = " + age); }
相关文章推荐
- Delphi二维码中文支持、分组、批量打印经验小结
- 递归
- 【LeetCode】198 - House Robber
- 失败的面试经历
- linux学习笔记 - 文档权限与目录配置
- c++运算符重载,输出符 4000 号重载
- Android之——获取进程总数、内存、任务列表
- H.264码流的RTP打包格式[FU-A]
- android studio imageview src Failed convert xxxx into drawable xxxx
- 将工程在Xcode6中打包成测试的ipa包
- 3D图形渲染管线
- Sort List
- hd4883 TIANKENG’s restaurant
- Android中异步任务的操作
- 优先队列C语言实现
- CL——Windows下命令行运行C/C++
- permgen space问题
- 使用iframe从网页调起移动端应用
- LeetCode 160 - Intersection of Two Linked Lists
- 20150803 SEO搜索引擎优化