Java默认构造函数的一些发现
2015-09-28 18:48
393 查看
程序1:
程序2:
上面的是两个很简单的程序说明了:如果继承父类的子类没有显示的调用super();子类的构造函数中仍然会自动先调用父类的无参构造函数。当然也可以自己添加有参的,如:super( int a);
如果在主函数中通过有参构造函数实例化,也会默认的先执行父类的无参构造函数。这在以后的继承是需要注意。另外补充一点,Java中不支持多继承。
程序3:
下面这段程序逻辑上或许看起来比上面的稍微复杂一点,其实本质上还是默认构造器的调用(子类总是会调用父类的构造器,不管程序员是否显示的使用super();)。在这个程序中,就涉及到构造器的递归调用,总是先调用基类的构造器。对于ConstructorDemo这个类,它的父类往上依次是Lunch、Meal,其中Meal是基类,因此肯定是先默认调用基类的构造器,再调用Lunch构造器,最后再依次执行ConstructorDemo的构造器中的代码。
有一种特殊情况就是当一个类没有显示的使用extends继承任何类的时候,此时该类的默认父类是Object这个超类(当然任何类的基类都是超类),此时会自动调用Object的构造器。如果有显示继承的话,就像上面的例子,并不会去调用Object的构造器。
最后想再补充一点,class A中定义了一个有参的构造器,如果class B想继承class A,则在class A这个父类中必须重新定义一个无参的构造器(任何定义了构造器的类,系统是不会再提供默认的无参构造器),否则会编译出错。原因很简单,还是上面说的这些,任何子类中的构造器都会默认的调用父类中的无参构造器。
如有误,请拍砖,相互学习!
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统