文章目录
一、构造方法
1.1 构造方法是什么
- 构造方法(构造器) 是类中非常特殊的一类方法,使用关键字new来实例化对象的时候实际上就是调用该类的构造方法(构造器)。
- 虽然它叫构造方法(构造器),但是要和我们的普通方法区分开,二者不是一个东西。
- 在使用关键字new产生一个对象时,大致分为以下两步:
- 为对象在堆中分配空间。
- 调用对象的构造方法(构造器)
1.2构造方法的语法规则
- 方法名称与类名称完全相同。
- 构造方法没有返回值声明,也不用void。
- 一个类中至少存在一个构造方法,如果没有显示定义,编译器会自动生成一个默认的无参构造。
- 当类中定义了构造方法,默认的构造方法就不再产生。
- 无参构造:
代码如下:
public class Test{
public static void main(String[] args){
Person per = new Person();
}
}
class Person {
private String name;
private int age;
public Person() {
System.out.println("Person的无参构造");
}
}
运行结果如下:
我们可以发现,我们只是产生了一个对象,什么都没有干,但是还是打印输出了一句话。
- 有参构造:
代码如下:
我们会发现,此时编译报错,因为我们此时定义了一个有参构造,此时默认的无参构造就不再生成,所以我们需要在产生Person类的对象时传参。构造方法中的参数列表是形参。
代码如下:
public class Test{
public static void main(String[] args){
Person per = new Person("张三");
}
}
class Person {
private String name;
private int age;
public Person(String n) {
name = n;
System.out.println("Person的无参构造");
System.out.println(name);
}
}
运行结果如下:
1.3内存分析
- 当我们Person per = new Person产生一个Person的对象时,先在堆上开辟一个块空间 大小由该类中的成员变量的属性决定。
- 调用对象的构造方法为所有成员变量赋值。
- 成员变量的默认值就是在构造方法中赋值的,也可以在定义时就为成员变量进行赋值,它也是在构造方法中进行的。
- 构造方法由jvm去调用,当构造方法调用结束,该对象就初始化完成,我们无法在程序中手动再次调用构造方法。
- 成员变量只有在产生对象时,才会在堆中分配空间。
1.4 构造方法的重载
构造方法可以重载,构造方法就是为了类中的成员变量赋值的,此时的重载只可能参数个数的不同(为不同的成员变量赋值)。
成员变量的类型在类定义时就指定好了,只是初始化的变量个数不同。
public class Test{
public static void main(String[] args){
Person per = new Person("张三");
Person per1 = new Person("张三",16);
}
}
class Person {
private String name;
private int age;
public Person(String n) {
name = n;
System.out.println("Person的一个参数的有参构造" );
System.out.println(name);
}
public Person(String n,int a) {
name = n;
age = a;
System.out.println("Person的两个参数的有参构造" );
System.out.println(name);
System.out.println(age);
}
}
运行结果如下:
当然我们也可以在类定义时就为成员变量进行赋值,而后再通过构造方法区修改成员变量的值
代码如下:
public class Test {
public static void main(String[] args) {
Person per = new Person();
Person per1 = new Person("张三");
Person per2 = new Person("王五", 20);
}
}
class Person {
private String name = "李四";
private int age = 18;
public Person() {
System.out.println(name);
System.out.println(age);
System.out.println("Person的无参构造");