天天看点

构造器(构造方法) constructor使用细节:对象创建流程分析:

在创建对象时直接指定对象的属性

是类的一种特殊方法,主要作用是完成新对象的初始化(不是创建对象)

[修饰符] 方法名(形参列表)(

        方法体;

修饰符可默认,也可public

构造器没有返回值

方法名和类名一样

参数列表和成员方法一样的规则

构造器调用系统完成

构造器(构造方法) constructor使用细节:对象创建流程分析:

使用细节:

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文件反编译成我们写的源代码】

构造器(构造方法) constructor使用细节:对象创建流程分析:

一旦自己定义了构造器,默认的构造器就被覆盖了,除非显式的定义一下

构造器(构造方法) constructor使用细节:对象创建流程分析:

 (这种情况就是人为的更改了构造器,那么创建对象的时候小括号里就不能没东西)

显式的定义一下

class dog{

	public dog(int age){

	}

	dog(){//显示的在定义一下

	}
}
           

对象创建流程分析:

构造器(构造方法) constructor使用细节:对象创建流程分析:

 执行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不是对象,是对象的引用【对象名】)