Java面向对象,对象是怎么创建出来的?在内存中又是怎么个布局呢?

一个对象的创建过程:

 

public class Person {
	
	//成员变量---在堆内存分配空间,构造函数被调用的时候,对其进行初始化
	private int age;
	
	//默认构造函数,如果没有重载其它构造函数,Jave编译器会自动加入一个无参的构造函数,因为要确保至少有一个构造函数存在,如果没有,怎么创建对象呢!
	public Person() {
		//super(); //默认调用父类的无参构造函数,所以创建子类对象会先调用父类构造函数,而调用父类构造函数,就导致父类被加载
		//return;
	}
	
	//带参数的构造函数,此时如果不显示写无参构造函数,Java编译器不加,因为至少已经有一个构造函数存在了
	public Person(int age) {
		//super(); //默认调用父类的无参构造函数,所以创建子类对象会先调用父类构造函数,而调用父类构造函数,就导致父类被加载
		this.age = age;
		//return;
	}
	
	public static void main(String[] args) {
		//new 在堆内存开辟空间   
		//Person() 表示调用Person类的无参构造函数
		//结合起来 new Person()---> 在堆内存开辟空间,并调用Person构造函数对该内存中的变量age进行初始化,age=0
		Person p1 = new Person();
	
		//new 在堆内存开辟空间   
		//Person(20) 表示调用Person类的参数为int类型的构造函数
		//结合起来 new Person(20)---> 在堆内存开辟空间,并调用Person构造函数对该内存中的变量age进行初始化,age=20
		Person p2 = new Person(20);
	}
}

 

 

另一个例子

public class Person {
	
	/**
	 * 对象的成员属性
	 */
	private String name;
	/**
	 * 对象的成员属性
	 */
	private int age;
	
	/**
	 * 构造方法:在对象创建时调用,用来对成员属性进行初始化
	 * 如果没有指定构造函数,则调用默认构造函数,此时对象中的数据都为对应类型的初始值
	 */
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	/**
	 * 对象的一般方法,可以被调用多次,只能在对象创建完成后才能通过对象来调用
	 */
	public void say() {
		System.out.println(this.name+","+this.age);
	}
	
	/**
	 * 获取成员变量的值
	 */
	public String getName() {
		return name;
	}
	
	/**
	 * 对象创建时,可以通过构造函数对成员属性进行初始化
	 * 对象创建后,提供一般方法对成员变量进行修改
	 */
	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	//==================================================
	public static void main(String[] args) {
		//堆内存中开辟内存空间分配给当前创建的对象,name=null,age=0
		//程序自动调用显示定义的构造函数,在构造函数中完成对当前对象的name和age初始化
		//然后,将当前对象的地址赋值给栈内存中的person变量
		Person person = new Person("zhangsan",20);
		//对象调用一般方法
		person.say();
		//栈内存中的person变量根据前面赋值的地址,从堆内存中取出对应的name和age
		System.out.println(person.getName()+","+person.getAge());
	}
	
}