Java对象(实例)创建涉及到的内存分配及相关事宜

1 成员变量


成员变量和局部变量不一样,首先是作用域不同:成员变量的作用域在整个类里,而成员变量的作用域在定义它的代码块里;其次是局部变量没有显式初始化使用该局部变量,编译器会报错,但是成员变量在没有显式初始化的时候,编译器会为其初始化一个默认值。


2 引用


Java语言中除了基本数据类型(boolean, char, byte, short, int, long, float, double)外的变量类型成为引用类型。


3 对象(实例)创建涉及到的内存分配


Java在创建一个对象时,会分配两块内存,一块内存位于Stack内,而另一块内存位于Heap内。位于Stack内的那块内存的内容记录了Heap的位置信息,也即Stack那块内容指向对应的Heap里面的那块内存。

为什么对象(实例)的内存是位于Heap内?我们知道,内存里的Code区放置代码,Data区域放置静态变量和字符串常量,Stack放置局部变量,Heap放置动态分配的内存。由于new出来的对象实例,在编译的时候并不知道它需要多大的内存,只有在执行的时候才知道对象实例的内存大小,这种就是动态分配。一方面是因为Heap是放置动态分配的内存的,动态分配的对象实例固然是放置在其中,另一方面,也只有Heap才有足够的内存进行动态分配内存。

/* Person.java */

public class Person {
	private int age;
	private int weight;

	Person(int age, int weight) {
		this.age = age;
		this.weight = weight;
	}

	public int getAge() {
		return age;
	}

	public int getWeight() {
		return weight;
	}

	public static void main(String[] args) {
		Person p = new Person(25, 50);
		System.out.println(p.getWeight());
		System.out.println(p.getAge());
	}
}


在上面这段代码里,代码放在内存的code内存区域里面,首先执行main方法,在Stack中申请了一块内存,名为p,此时p的内容为null,然后new触发Person的构造器(或者说调用构造方法),此时在Stack又申请了两块内存,一块名为age,值为25,一块名为weight,值为50。同时在Heap申请了一块内存,内存里面也有age和weight,这时把Stack的age和weight的值复制到对应的Heap中的age和weight,复制完成后,Stack的age和weight这两块内存就会清去(因为构造函数调用完,它们的生存期就结束),同时Stack的p指向Heap的Person实例内存,这样就完成了一个对象的创建。


4 Java的构造函数


在没有显式为Java类定义构造函数时,Java编译其会为Java类加上默认(无参数)的构造函数,但当你显式定义了构造函数时,Java则不会为您添加默认构造器,当您使用默认构造器进行创建对象实例时,编译器将报错。

/* Person.java */

public class Person {
	private int age;
	private int weight;

	Person(int age, int weight) {
		this.age = age;
		this.weight = weight;
	}

	public int getAge() {
		return age;
	}

	public int getWeight() {
		return weight;
	}

	public static void main(String[] args) {
		//显式定义了构造器不能再使用默认构造器
		//除非在自己添加默认构造器
		//Person person = new Person();
		Person p = new Person(25, 50);
		System.out.println(p.getWeight());
		System.out.println(p.getAge());
	}
}

修改后的版本:

/* Person.java */

public class Person {
	private int age;
	private int weight;

	Person() {}
	Person(int age, int weight) {
		this.age = age;
		this.weight = weight;
	}

	public int getAge() {
		return age;
	}

	public int getWeight() {
		return weight;
	}

	public static void main(String[] args) {
		Person person = new Person();
		System.out.println(person.getAge());
		System.out.println(person.getWeight());
		Person p = new Person(25, 50);
		System.out.println(p.getWeight());
		System.out.println(p.getAge());
	}
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值