Java构造函数
目录
一.构造函数引入
当我们创建一个对象后,可以通过自定义的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,只能选择一种。