在创建对象时直接指定对象的属性
是类的一种特殊方法,主要作用是完成新对象的初始化(不是创建对象)
[修饰符] 方法名(形参列表)(
方法体;
)
修饰符可默认,也可public
构造器没有返回值
方法名和类名一样
参数列表和成员方法一样的规则
构造器调用系统完成
使用细节:
1.一个类可定义多个构造器(构造器的重载)【例如可以再创建一个构造器,只指定某一个属性】
public class constructor{
public static void main(String[] args) {
person p = new person(100,"hello");//在创建对象的时候直接赋值(完成对象属性的初始化)
person p2 = new person(100);//调用第二个构造器
System.out.println(p.age);
}
}
class person{
int age;
String name;
//构造器
//构造器没返回值(不用写void)
//构造器名称和类名一样(都是person)
//(int age2,String name2)是形参列表,规则和方法一样
//
//第一个构造器
public person(int age2,String name2){
System.out.println("构造器被使用");
age = age2;
}
//第二个构造器(只指定了age这个属性)
public person(int age2){
System.out.println("构造器被使用");
age = age2;
}
}
如果没有定义构造器,系统会自动给类生成一个默认无参构造器(可以用javap验证)
【javap可以把class文件反编译成我们写的源代码】
一旦自己定义了构造器,默认的构造器就被覆盖了,除非显式的定义一下
(这种情况就是人为的更改了构造器,那么创建对象的时候小括号里就不能没东西)
显式的定义一下
class dog{
public dog(int age){
}
dog(){//显示的在定义一下
}
}
对象创建流程分析:
执行person p = new person("小倩",20);的时候
先在方法区加载person类信息,然后在堆里面开辟一个空间(空间里面一部分存放age,一部分存放name;分别进行默认初始化,0和null),空间有个地址,到了int age = 90;这行,age的0被改成90;到了String name这行,name的值没被改变还是null;到了构造器内行的时候把实参小倩传给n,然后n再传给name,age同理【小倩在常量池里面,也有个地址】
堆里面的工作做完之后,堆里的空间的地址被传到栈里面的p(这个栈里面的p不是对象,是对象的引用【对象名】)