代码如下
class Employee{
private String name ;
private String sex;
private int age;
Employee(String nm) {
name = nm;
}
Employee(String nm,String s){
this(nm);
sex = s;
}
Employee(String nm,String s,int a){ A
//Employee(nm,s);
this(nm,s); //在调用本来中拥有2个字符串参数的构造方法
System.out.println("this="+this);
age = a;
name = "xxxx";
}
void say() {
System.out.println("name="+name+",sex="+sex+",age="+age);
}
}
class PersonDemo2 {
public static void main(String[] args) {
Employee e = new Employee("zhangsan","nv",23); A
e.say();
}
}
分析如下:
1, 加载PersonDemo文件,加载主方法,new一个class文件, 如果有就不创建,没有创建,
然后在方法区的class文件区域加载成员变量,
2,然后再堆中创建对象
1、开辟内存空间,划分内存地址
2、成员变量默认初始化
3、调用对应的构造方法
在这里name简写成nm,sex 简写成s, age简写成a
就是含三个参数的构造方法, C---------Employee(String nm,String s,int a)
把,zhangsan,nv ,23三个实际参数赋值给形式参数nm ,s ,a
C方法中 nm=zhangsan;
S = nv;
a=23;
然后执行 this(nm,s) 去寻找本类中的含有两个参数的构造函数
然后调用含 两 个参数的构造方法,B -----------Employee(String nm,String s)
然后此函数得到了两个实际参数,mn,s
然后执行 this(nm) 去寻找本类中的含有一个参数的构造函数
再调用含有 一 个的构造方法, -A--------Employee(String nm,)
把zhagnsan,给两个实际参数赋值给形式参数nm ,
name=zhangsan,
但是此时此句应该是this.name=zhangsan 前面的this是省略掉了
(注意:因为本方法中没有自定义name变量,所以根据就近原则,它会去在类中找到堆中的变量name,)
然后开始改变堆里的对象的名字 name=null------------zhangsan, name= zhangsan
然后此方法(第一个构造方法)从栈中出去,
然后到第二个方法赋值 sex=null--------nv, sex=nv
第二个构造方法从栈出去
然后到第三个构造下面的
a=null------------23;
a=23;
然后是:name=zhangsan---------------xxxxxxx
Name=zhangsan
4、最后打印的结果是:
Name=zhangsan
sex=nv
age=23
|
|