Java:构造函数

Java构造函数

目录

Java构造函数

一.构造函数引入

二.构造函数的概念与特点

1.概念:

2.构造函数的特点:

三.默认构造函数

四.继承中的构造方法

1.继承中构造函数的执行顺序

2.继承中构造函数的注意事项


一.构造函数引入

当我们创建一个对象后,可以通过自定义的setter函数来给属性赋值。例如:

public class Student {        //利用关键字class定义一个类,类名首字母大写
    //1.属性
    private String name;
    private int id;
    private int grade;
    //2.方法
    // (1)构造函数
    public Student() {      //无参构造函数
    }
    public Student(String name) {       //一个参数的构造函数
        this.name = name;
    }
    public Student(String name, int id, int grade) {    //三个参数的构造函数
        this.name = name;
        this.id = id;
        this.grade = grade;
    }
    //(2)定义set方法来给属性赋值
    public void setName(String name) {

        this.name = name;
    }
    //(3)定义get方法来获取属性
    public String getName() {

        return name;
    }
    //(4)定义一个study方法
    public void study() {
        System.out.println(name + "在学习数学!");
    }
    // (5)定义一个Computer方法
    public void Computer() {
        System.out.println(name + "在使用电脑!");
    }
}


public class Manage {
    public static void main() {
        Student stu_1 = new Student();      //调用无参构造函数
        stu_1.setName("Jordan");
        System.out.println("stu_1的名字是: " + stu_1.getName());
     
    }
}

输出:

stu_1的名字是: Jordan

那么我们如何在创建一个对象的同时进行初始化呢?

二.构造函数的概念与特点

我们可以使用构造函数来达成创建并同时初始化对象的目的:

public class Manage {
    public static void main() {
        Student stu_1 = new Student();      //调用无参构造函数
        stu_1.setName("Jordan");
        System.out.println("stu_1的名字是: " + stu_1.getName());
        Student stu_2 = new Student("Chamberlain");     //调用一个参数的构造函数
        System.out.println("stu_2的名字是: " + stu_2.getName());
        Student stu_3 = new Student("Nick", 8888, 9);   //调用三个参数的构造函数
    }
}

输出:

stu_1的名字是: Jordan
stu_2的名字是: Chamberlain

注:因为Student类的属性的访问类型为private,在类外不能通过 "对象名.属性" 的方法访问,应单独设置getter函数获取属性,如getName函数。


1.概念:

Java构造函数,也叫构造方法。可以在创建对象的同时进行初始化。

例如Student类中的如下几个函数:

// 构造函数
    //(1)无参构造函数
    public Student() {     
    }
    //(2)一个参数的构造函数
    public Student(String name) {       
        this.name = name;
    }
    //(3)三个参数的构造函数
    public Student(String name, int id, int grade) {    
        this.name = name;
        this.id = id;
        this.grade = grade;
    }

看到这里你或许对于构造函数的使用方法及规则还有些许疑惑,别急,继续往下看。

2.构造函数的特点:

  • 构造函数的函数名与类名相同;
  • 构造函数可以有多个参数(无参或者多个);
  • 构造函数没有返回值类型(注:void也是一种返回值类型);
  • 构造函数只能通过new操作来调用,并且一个对象只能使用一次构造函数;
  • 一个类可以有多个构造函数,但每个构造函数的参数不同(即构造函数的重载);

三.默认构造函数

  • 在java中,一个类里如果没有写明任何构造函数,那么会存在一个默认的无参构造函数,相当于:
public Student() {
}
  • 需要注意的是,如果类中自定义了构造函数,这时默认无参构造函数就没有了,需要手动添加无参构造函数;(良好习惯:手动添加无参构造函数)

四.继承中的构造方法

1.继承中构造函数的执行顺序

  • 创建对象时,会先自动调用父类的构造函数,再自动调用子类的构造函数。
  • 解释:super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。因此子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。
  • 总的来说,初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法

2.继承中构造函数的注意事项

  • 情况1.父类有空参:没有有参构造时系统默认给出了,或者有有参构造并且也给出了空参构造

,此时子类自动调用父类构造函数即可。

  • 情况2.父类没有空参:有有参构造但未给出空参构造函数;若父类没有空参构造,而子类在构造函数的第一句又会默认调用父类的空参构造即隐身的super(),则此时编译不能通过。

解决办法:
     1)指定显示调用父类的有参构造super(a,b) ,此时就不会再隐式调用super();

     2)若子类构造函数中用this来指定调用子类自己的有参构造函数this(a,b),那么被调用的构造函数也一样会访问父类中的有参构造函数。

    3)注意:构造函数的第一句,一定是super或者this,只能选择一种。
 

你可能感兴趣的:(Java基础,java)