1构造函数
- 声明在类的内部
- 方法名与类名一模一样的函数叫构造函数
- 构造函数没有返回值
- 构造函数可以包含参数
- 作用:用来描述对象的创建过程
在mian方法中用Person p = new Person()实例化后,在用“p。xxx”来进行赋值操作,这样做有些不太合理,人的性别在人生下来时就确定了不会再去改变(人妖除外),所以这应该要先实例化的时候(在生的时候)就该确定,而不是在生下来了在去增加性别。
java的构造函数就是这个作用,可在初始化的时候进行赋值操作。
1.1不带参数构造函数
没有写构造函数是,会自动生成一个不带参数的构造函数,并且什么都不做
例:在Person中加入不带参数构造函数
class Person{
String name;
String sex;
int age;
//构造函数
public Person(){
name = "唐僧";
sex = "男";
age = 999;
}
public void sleep(){
System.out.println(name+"在睡觉");
}
}
main方法:
public static void main(String[] args) {
Person p = new Person(); //实例化类,创建对象。所以所对象是类的实例化
//调用Person中的动态属性(函数)
p.sleep(); //输出:唐僧在睡觉
}
在main方法中没有赋值操作,输出结果依然是:唐僧再睡觉。
因为实例化对象的时候就已经进行了赋值。
1.2带参数的构造函数
手动写了一个带参数的构造函数时,JVM就不会再自动生成一个不带参数的构造函数
this关键字,实例化对象时,还有个this指针指向它
声明一个带参数的构造函数,例:
Person类:在构造方法中增加了String类型参数
class Person{
String name;
String sex;
int age;
public void sleep(){
System.out.println(name+"在睡觉");
}
//构造函数
public Person(String name){ //在这里增加了一个参数
name = name;
sex = "男";
age = 999;
}
}
main方法:
public static void main(String[] args) {
Person p = new Person("唐僧"); //这时需要传入参数,否者会报错
p.sleep(); //输出:null在睡觉
}
这时用new实例化的时候一定要传入与构造方法参数类型相同的参数
奇怪的是这里输出的是null在睡觉。
因为在构造函数内这句出了问题
name = name;
这句话jvm不知道name到底是形参name(就是构造函数参数中的name)还是实参(类中的name)。
所以需要加this,如:
this.name = name;
1.3this指针
因为实例化对象时,还有个this指针指向它,看内存图:
1,如图片右边红线处,有个this指向该内存
2,当p中有参数是,会将这个参数压入栈中,如图左边红线
3,所以this.name = name 意思就是:this.name就是堆中的name,name 就是构造方法参数中的name
前面有个问题,如果写了一个带参数的构造函数时,就无法调用不带参数的构造方法,因为JVM没有创建不带参数的构造方法
解决方法:手动一个不带参数的构造函数
在写了一个不带参数的构造函数:
/*person类*/
class Person{
//这些定义的变量就是Person类的静态属性
String name;
String sex;
int age;
//睡觉行为就是Person类的动态属性
public void sleep(){
System.out.println(name+"在睡觉");
}
//第一个构造函数
public Person(String name){
this.name = name;
this.sex = "男";
this.age = 999;
}
//不带参数的构造函数
public Person(){
}
}
main方法:
public static void main(String[] args) {
Person p = new Person(); //现在不传入参数就不会报错了
p.sleep(); //输出:null在睡觉
}
这里输出的是:
null在睡觉,因为不带参数构造方法我没有写写赋值操作