对象的内存图: 类在哪里存放?
左侧程序的运行方式解释:首先是有一个Car类和 Test类, Car类中存放的是该类的属性和方法,当Test.class加载到方法区之后开始加载main方法,此时Car.class也加载到方法区中 随之的还有成员变量name和price,还有成员方法,在主方法中,当创建car1对象时,他会现在栈中开辟一个c1的对象,然后当new这个对象的时候,会在堆内存中再开辟一块空间,这个空间里存放的就是该类的属性和方法成员的引用地址,而引用地址就是成员方法在方法区中的地址,最后会将堆内存中的对象空间的地址赋值给栈内存中的c1。
那如果是两个变量指向同一对象的情况呢?
当执行完 Student s2 = s1这个语句的时候,栈内存中会开辟一个s2空间指向s1空间中记录地址的堆内存中的对象空间,因此此时当用s2来修改内容的时候s1中的内容也会被修改因为这两个对象指向的是同一片空间。
P.s: Java存在自动垃圾回收器,当s1和s2为null的时候,此时堆内存中的对象就没有值也就没有用了,此时java会自动将其清理掉。
构造器
构造器的作用:
细节:当你定义一个类时,java会默认自带无参构造器,但是当你写了有参构造器但是没写无参构造器时会报错,因为 有参构造器会覆盖无参构造器,这个时候就要自己手动去写一个无参构造了。
this关键字
this可以出现在构造器和成员方法中
this的作用:代表当前对象的地址,谁调用的方法用的就是谁的地址。
例如:
public Car(String name,double price) { price = price; name = name; }
此时你如果想通过构造器来给对象属性赋值的话 就会出现下面这种情况
Car c = new Car("奔驰",45);
因为在这个构造方法中,因为就近原则因此传递进来的price不会赋值给类中属性的price,他只会自己访问自己一边,因此test中打印类中属性为默认值。因此我们如果想得到传进来的值应该这样修改代码。
public Car(String name,double price) { this.price = price; this.name = name; }