Java默认构造函数的一些发现
来源:互联网 发布:英语 加油 知乎 编辑:程序博客网 时间:2024/04/29 09:03
程序1:
package com.org.demos;public class Base { public Base(){ System.out.println("this is a Base Class!"); }}
程序2:
package com.org.demos;public class Child extends Base { public Child () { System.out.println("Child Class!"); } public Child (String str) { // super(); System.out.println("this is another constructor!" + str); } public static void main(String[] args) { Child child = new Child (); }}
上面的是两个很简单的程序说明了:如果继承父类的子类没有显示的调用super();子类的构造函数中仍然会自动先调用父类的无参构造函数。当然也可以自己添加有参的,如:super( int a);
如果在主函数中通过有参构造函数实例化,也会默认的先执行父类的无参构造函数。这在以后的继承是需要注意。另外补充一点,Java中不支持多继承。
程序3:
package com._09._30;class Meal{ public Meal(){ System.out.println("Meal constructor!"); }}class Bread{ public Bread(){ System.out.println("Bread constructor!"); }}class Cheese{ public Cheese(){ System.out.println("Cheese constructor!"); }}class Lunch extends Meal{ public Lunch(){ System.out.println("Lunch constructor!"); }}public class ConstructorDemo extends Lunch{ public ConstructorDemo(){ //super(); new Bread(); new Cheese(); new Lunch(); System.out.println("ConstructorDemo constructor!"); } public static void main(String[] args) { new ConstructorDemo(); }}
下面这段程序逻辑上或许看起来比上面的稍微复杂一点,其实本质上还是默认构造器的调用(子类总是会调用父类的构造器,不管程序员是否显示的使用super();)。在这个程序中,就涉及到构造器的递归调用,总是先调用基类的构造器。对于ConstructorDemo这个类,它的父类往上依次是Lunch、Meal,其中Meal是基类,因此肯定是先默认调用基类的构造器,再调用Lunch构造器,最后再依次执行ConstructorDemo的构造器中的代码。
有一种特殊情况就是当一个类没有显示的使用extends继承任何类的时候,此时该类的默认父类是Object这个超类(当然任何类的基类都是超类),此时会自动调用Object的构造器。如果有显示继承的话,就像上面的例子,并不会去调用Object的构造器。
最后想再补充一点,class A中定义了一个有参的构造器,如果class B想继承class A,则在class A这个父类中必须重新定义一个无参的构造器(任何定义了构造器的类,系统是不会再提供默认的无参构造器),否则会编译出错。原因很简单,还是上面说的这些,任何子类中的构造器都会默认的调用父类中的无参构造器。
如有误,请拍砖,相互学习!
- Java默认构造函数的一些发现
- Java默认构造函数的作用
- Java默认构造函数的作用
- Java构造函数的一些理解
- 默认的的构造函数
- C++的默认构造函数
- 默认构造函数的作用
- 类的默认构造函数
- 构造函数的默认调用
- 默认参数的构造函数
- 不存在的默认构造函数
- 类的默认构造函数
- C++的默认构造函数
- 合成的默认构造函数
- 默认构造函数的常见问题
- 默认参数的构造函数
- 默认参数的构造函数
- java 和c++关于默认构造函数的区别
- Java反射机制 和 泛型函数设计
- RDO部署openstack环境
- 4-1 Deque (25分)
- 解决自定义状态栏对软键盘及界面内容遮挡问题
- Winxp虚拟机(含VC++及C++书籍资料)下载说明
- Java默认构造函数的一些发现
- 线性表基础&线性表应用:多项式
- popen()函数执行脚本,要用pclose()函数关闭
- 去掉字符串中连续出现k个0的子串
- How to convert a latex to pdf file
- 软件测试之常识篇 3
- c++模版
- ffmpeg常用命令总结
- 网络编程_get_异步-请求_获取网络数据