分享

Java学习——35、子类的构造方法

 pythonjava学习 2021-04-06

本文接上篇——34、类的继承。

子类可以继承父类的除了构造方法以外的所有成员,在子类创建对象时,必须对父类的变量进行初始化。但构造方法是不被继承的,故要在子类当中调用父类的构造方法。

如果子类中没有显式调用父类的构造方法,Java默认调用父类无参数的构造方法。若父类没有不带参的构造方法,将出错。

1、        使用super()调用父类的构造方法

在子类中,可以使用“super引用”调用父类的构造方法。

其语法格式如下:

super([参数列表])

例如:在Student类中,其继承自Person类,其构造方法可声明如下:

    public Student(){

       super();//此处可省,调用父类无参数构造方法

       number=123;

    }

    public Student(String name,int number){

       super(name);//调用父类带参数构造方法

       this.number=number;

}

2、        默认执行super()

有两种情况,Java会默认执行super

(1)    当一个类没有声明构造方法时,Java为该类提供默认的构造方法,可默认调用父类super()

例:

class A{

    int i;

    public A(){

        i=1;

    }

    public int getI(){

        return i;

    }

}

public class Add extends A{

    public static void main(String args[]){

        Add a=new Add();

        System.out.print(a.getI());

    }

}

此运行结果为:1

本例是,Add类继承自A类,在A类中有构造方法A()不带参。在子类Add中,并没有构造方法,此时在创建Add的对象时,会自动调用super()不带参的构造方法,使i的值初始化为1,故输出为1

(2)    如果子类的构造方法没有调用super()this()Java将默认执行super()

例:

class A{

    int i;

    public A(){

        i=1;

    }

    public int getI(){

        return i;

    }

}

//类Add,继承类A

public class Add extends A{

    int j;

    public Add(){

        j=3;

    }

    public static void main(String args[]){

        Add a=new Add();

        System.out.print(a.getI()+""+a.j);

    }

}

其运行结果为:1 3

本例中,Add继承自A类,在A类中有构造方法A(),在Add类中有构造方法Add()。但在子类Add中并没有显式调用父类的构造方法,其默认调用了父类不带参的构造方法,将i赋值为1,而在Add构造方法中将j赋值为3,故输出为1 3

在使用类的继承时,一定要注意是先创建父类对象再创建子类对象,因此在写子类的构造方法时,要分清它到底应该调用父类的哪一个构造方法,以免出错。

例:

class Person{

    private String name;

    public Person(){

        this("张熹熹");

    }

    public Person(String name){

        this.name=name;

    }

    publicvoid show(){

        System.out.println("姓名:"+name);

    }

}

public class Student extends Person{

    private String number;

    public Student(){

        number="123";//默认调用父类的Person()

    }

    public Student(Stringnumber){

        super();//调用父类的不带参构造方法

        this.number=number;

    }

    public Student(Stringname,String number){

        super(name);//调用父类带参的构造方法

        this.number=number;

    }

    public void show(){//覆盖父类的方法

        super.show();//调用父类的方法

        System.out.println("学号:"+number);

    }

    public static void main(String args[]){

        Student s1=new Student();

        s1.show();

        Student s2=new Student("645");

        s2.show();

        Student s=new Student("Lay","107");

        s.show();

    }  

}

其运行结果为:

姓名:张熹熹

学号:123

姓名:张熹熹

学号:645

姓名:Lay

学号:107 

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多