什么是构造方法?
构造方法是 Java 中一种特殊的方法,它的核心作用是:在创建对象(使用new关键字)时,初始化该对象的成员变量
构造方法解决什么问题?
构造方法解决给对象初始化的问题
构造方法怎么使用?
一:直接在构造方法中赋值
java
class Person {
// 成员变量(未初始化,默认值:name=null,age=0)
private String name;
private int age;
// 构造方法初始化:给成员变量赋具体值
public Person(String name, int age) {
// this.name 指向对象的成员变量,name 是构造方法的参数
this.name = name; // 初始化姓名
this.age = age; // 初始化年龄
}
public void show() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
public static void main(String[] args) {
// 创建对象时,触发构造方法初始化
Person p = new Person("小明", 18);
p.show(); // 输出:姓名:小明,年龄:18(说明初始化成功)
}
}
二:在继承类中如果父类中没有空参构造方法,只有带参构造方法
子类通过 super,手动调用父类的带参的构造方法, 推荐
java
public class Person {
//成员变量
private String name;
private int age;
//成员方法
public void show() {
System.out.println(name + "-----" + age);
}
//无参构造
// public Person() {
// }
//带参构造
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
------------------------------------------------------------------------
public class Student extends Person{
//成员变量
private int score;
//有参构造
public Student() {
//隐藏代码:super(); //自动调用父类中的无参构造方法,如果父类中没有无参构造,只能手动调用父类中的带参构造
super("梅梅",23);
}
public Student(String name, int age, int score) {
super(name, age);
this.score = score;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
----------------------------------------------------------------------------
public class Text {
public static void main(String[] args) {
//创建Student对象
//Student stu = new Student("张三", 23, 100);
Student stu = new Student();
stu.show();
}
}
---------------------------------------------------------------------------------
运行结果:梅梅-----23
子类通过 this 去调用本类的其他构造方法,本类其他构造方法再通过 super 去手动调用父类的带参的构造方法 , 不推荐
java
public class Father {
public Father() {
System.out.println("Father类 -> 无参构造方法");
}
public Father(String name){
System.out.println("Father类 -> String参数构造方法");
}
}
---------------------------------------------------------------------
public class Son extends Father{
public Son() {
//隐藏代码:super();
this("梅梅");//调用:Son(String name)
System.out.println("Son类 -> 无参构造方法");
}
public Son(String name){
//隐藏代码:super();
//调用父类中的有参构造方法
super(name);
System.out.println("Son类 -> String参数构造方法");
}
}
------------------------------------------------------------------------
public class Text {
public static void main(String[] args) {
//创建子类对象
Son son = new Son();
}
}
----------------------------------------------------------------------
运行结果:
Father类 -> String参数构造方法
Son类 -> String参数构造方法
Son类 -> 无参构造方法
怎么初始化?
如果一个类没有手动定义任何构造方法,Java 会自动提供一个默认的无参构造方法;如果手动定义了有参构造方法,默认(没有手动定义任何构造方法时的无参构造方法)的就会失效
在继承类中构造方法的第一条语句默认都是:super(),被隐藏,
构造方法使用时注意细节?
- 方法名必须和类名完全相同(包括大小写);
- 没有返回值类型(连void都不能写);
- 构造方法只能在创建对象时由new关键字自动调用,不能手动调用
- 子类中所有的构造方法默认都会访问父类中的无参构造(原因:子类在初始化的时候,有可能使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据【子类初始化之前,一定要先完成父类的初始化】)
- super() 必须写在子类构造方法的第一行,否则编译报错;
- 如果父类的无参构造是 private(私有),子类无法访问,会编译报错