构造方法
Java中如何产生一个对象?
我们使用这句话:类名称 对象名称 = new 类名称();
第一个类名称就是说我们要在哪个类中产生对象;对象名称是一个唯一的标记,引用了一块堆内存;new关键字表示开辟新的堆内存空间;而最后一个类名称()就是构造方法。所谓的构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。
构造方法的特点
1. 方法名称必须与类名称相同
2. 构造方法没有返回值类型声明
3. 每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
4.若类中定义了构造方法,则默认的无参构造将不再生成
构造方法无返回值,为什么没有void声明?
我们可以看现在类中的组成:属性、构造方法、普通方法
1. 属性是在对象开辟堆内存时开辟的空间
2. 构造方法是在使用new后调用的
3. 普通方法是在空间开辟了、构造方法执行之后可以多次调用的
public Person(){//无参构造方法
}
public void Person(){//命名不标准的普通方法
}
这样写的程序是可以编译通过也可以执行,因此,编译器是根据程序结构来区分普通方法与构造方法的,所以在构造方法前没有返回值类型声明。如果写了void声明,会被认为是普通方法。
使用构造方法设置对象属性
构造方法的调用和对象内存分配几乎是同步完成的,因此我们可以利用构造方法来为类中的属性进行初始化操作 ,可以避免多次setter调用。
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
}
public class Test{
public static void main(String[] args) {
Person person1 = new Person("李四",22);
System.out.println("姓名" + person1.getName());
System.out.println("年龄" + person1.getAge());
}
}
如果我先给Person类中的属性一个初值,在通过构造方法产生一个新对象,那么这个属性的值是什么?是我在Person类中给的初值还是通过构造方法传的参数呢?看下面的代码
class Person{
private String name = "test";
private int age;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
public class Test{
public static void main(String[] args) {
Person person1 = new Person("李四");
System.out.println("姓名" + person1.getName());
}
}
这个代码输出为 姓名李四,这是因为程序编译时会把所有的属性打包放进构造方法里面,而且是放在赋值语句(this.name = name;)之前,先赋初值(private String name = "test";),然后再执行构造方法的赋值语句(this.name = name;),所以输出的是通过构造方法传进去的参数的值。
构造方法重载(参数个数不同)
public Person(){
}
public Person(String name){
this.name = name;
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
若干构造方法,建议按照参数个数升序或降序 。