所谓对象的实例化可以理解为对象的创建过程!对象的创建是通过调用构造器来完成的!例如
public class People{
private String name;
private int age;
public People() {
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
People person = new People("张三", 18);
System.out.println("姓名:" + person.name + "\t" + "年龄:" + person.age);
}
}
我定义了一个People类,里面有name,age两个属性!又写了两个构造器(注意:如果你在类中不写构造器,JVM会默认提供一个无参构造器,如第一个!如果你在类中指明了构造器,JVM不在提供无参构造器,一般都会自己写上)!此处调用第二个有参构造器创建了一个对象,内存图为:
person这个引用指向所创建的People类的对象!
再来看一个复杂点的例子:
public class InstanceDemo {
public static void main(String[] args) {
// 调用类SuperDe中的SuperDe()构造器创建对象
SuperDe superDe = new SuperDe();
// 调用类SubDe中的SubDe()构造器创建对象
SubDe subDe = new SubDe();
System.out.println("superDe.a:" + superDe.a);
System.out.println(subDe.a + "," + subDe.b);
}
}
class SuperDe {
int a = 10;
public SuperDe() {
System.out.println("SuperDe():a=" + a);
a = 20;
System.out.println("SuperDe():a=" + a);
}
}
class SubDe extends SuperDe {
int b = 1;
public SubDe() {
// 此处隐含 super();调用父类的无参构造器
System.out.println("SubDe():b=" + b);
a = 30;
b = 2;
}
}
代码执行过程:
①加载SuperDe类,为属性(a)分配空间,属性初始化,执行无参构造器SuperDe(),输出a,给a赋值,再次输出a!创建引用superDe,使其指向所创建出的对象!
②加载SubDe类,执行相应的构造器SubDe(),子类构造器隐含调用父类构造器,所以再次执行SuperDe()构造器!执行完之后输出b,给SubDe类中的属性a,b赋值
如图:
总结:对象的实例化过程:
main方法中用类构造器创建对象,去类中查找相应的构造器,若此类为子类,则查看构造器中有没有指定父类构造器,若没有指定父类构造器,就默认调用父类的无参构造器,如父类无默认构造器,子类中的每个构造器必须指明调用父类哪个构造器!加载父类,按父类属性分配父类空间,父类属性初始化,执行相应的父类构造器,然后为子类分配属性空间,属性初始化,再执行子类的构造器!