使用Java的子类调用构造方法super()和this()

来源:互联网 发布:数据库模式怎么理解 编辑:程序博客网 时间:2024/05/01 01:22

测试代码:

package Test;abstract class FatherClass{abstract void getn();FatherClass(){System.out.println("无参父类构造方法");getn();}FatherClass(int i){System.out.println("有参父类构造方法");getn();}}class SonClass extends FatherClass{boolean n=true;SonClass(int x){//super();     //与下面的this()发生冲突this();System.out.println("有参子类构造方法");getn();}SonClass(){super(6);System.out.println("无参子类构造方法");getn();}void getn(){System.out.println(n);}}public class TestOfConstruction2 {public static void main(String[] args){new SonClass(6);}}

输出结果:

有参父类构造方法false   //这里变量n还未初始化无参子类构造方法true有参子类构造方法true      

1.构造方法作用:在系统生成对象时,系统会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化,当对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收。

默认构造方法是没有参数的构造方法,可分为两种:隐含的默认构造方法和程序显式定义的默认构造方法。

在Java语言中,每个类都至少需有一个构造方法。因此,如果用户定义的类中没有提供任何构造方法,那么Java语言将自动提供一个隐含的默认构造方法。该构造方法没有参数,用public 修饰,而且方法体为空,格式如下:
public ClassName(){ } //隐含的默认构造方法
在程序中也可以显式的定义默认构造方法,它可以是任意的访问级别。例如:
protected Employee() { //程序显式定义的默认构造方法    this("Hello~"); }
如果类中显式定义了一个或多个构造方法,并且所有的构造方法都带参数,那么这个类就失去了默认构造方法。//所以上面代码中,SonClass(int x)中自带的隐含super()和this()里的super(int i)没有同时被调用,只有super(int i)有效

2.如果一个子类继承自一个父类,则其构造方法的调用次序为:父类构造方法;成员变量初始化;子类构造方法。

父类的构造方法一定会在子类的构造方法中被调用,并且逐渐向上链接,直到使得每个父类使用的构造方法都能被调用到。

3.子类不能继承父类的构造方法,当子类需要在构造方法中调用父类的构造方法时(只有构造方法才能调用一个类的构造方法)不能直接通过父类的方法名来调用其构造方法,必须使用super(), 而且super()必须是构造方法的第一条语句(事实上系统默认在子类的构造方法里添加了一个隐含的super())。同理,this()也必须要作为构造方法里的第一条语句,这导致在同一个构造方法里super()和this()不共存。


0 0
原创粉丝点击