疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

类继承时构造方法的使用


 

       第一 所有的类都有构造方法

  1如果程序员没有给类显式的定义构造方法,则系统默认为该类定义一个默认的无参构造方法。

  2如果程序员定义的类中有若干有参构造方法,则系统不再为该类定义无参构造方法。

  第二 子类不能继承父类的构造方法

  第三 子类在创建时,必须默认、直接或间接的调用父类的构造方法,以使父类内容先于子类创建和初始化

  1如果父类未定义任何构造方法(系统会定义一个默认的无参构造方法)或者定义的构造方法中有一个是无参构造方法,则对子类构造方法没有影响。因为创建子类时会默认调用父类的无参构造方法。

  例如:

  Java代码

  public class ExtendsTest {

  public static void main(String[] args) {

  new Child1();

  new Child2();

  }

  }

  //父类中没有构造方法

  class Parent{

  String name;

  public void setName(String name){

  this.name = name;

  }

  public void print(){

  System.out.println("name=="+name);

  }

  }

  class Child1 extends Parent{

  Child1(){

  //子类默认调用父类的无参构造方法

  }

  }

  class Child2 extends Parent{

  Child2(){

  super();//子类显示调用父类的构造方法

  }

  }

  2如果父类定义有若干有参构造方法,但没有定义无参构造方法则,子类构造方法中必须使用“super(参数)”的形式,直接调用父类构造方法;或者,在子类构造方法中调用“this(参数)”的形式间接调用父类构造方法。

  例如:

  Java代码

  public class ExtendsTest {

  public static void main(String[] args) {

  new Child();

  new Child("李四");

  }

  }

  //父类中没有无参构造方法,只有若干有参构造方法

  class Parent{

  Parent(String name){

  }

  Parent(String name,int age){

  }

  String name;

  public void setName(String name){

  this.name = name;

  }

  public void print(){

  System.out.println("name=="+name);

  }

  }

  class Child extends Parent{

  //构造方法1

  Child(String name){

  // super();这是错误的,因为父类没有无参构造方法

  super(name,30);//直接调用父类的有参构造方法

  }

  //构造方法2

  Child(){

  this("张三");//间接调用父类的构造方法,因为“构造方法1”中有对父类构造方法的调用

  }

  }

  注意:this(参数)或者super(参数),这两个对构造方法的调用语句必须放在构造方法中,而且是第一句。