面向对象day1,创建类和对象时,对象内存是在哪
上面我创建了两个类,一个是测试类,在测试包里面,一个是生产类,在src文件里面。可以看到,调用类里面的对象的时候需要先创建一个对象,然后通过对象来调用类里面的属性和方法等,但是这个时候我得先记录一下,这两个类以及类里面的属性,方法内存问题。
由于jvm在运行的时候是将内存放在运行数据区,这里指的不一定是栈和堆内存。内存还包括元空间,本地方法栈(native存放地址),程序计数器。目前讨论的是存放在栈内存,堆内存和元空间的内存,堆内存是用于储存创建好的对象还有常量池,元空间是用于存放类和静态static的空间。
由于jvm是从main进入运行,所以,第一步main对应的类StudenTest在元空间占据内存,并且开始走方法,每个方法调用的时候都会在栈内存占据一个栈帧用来存放方法,此时main入栈,main创建了一个student类的对象stu1,stu1存放在栈内存,但由于是new的一个对象,所以会存放在堆内存,也就是堆内存放了new student(),堆内存不存放方法,存放student类的一些成员变量(属性),并且这个堆内存指向的地址是元空间的student类。如图
当程序开始运行的时候才会分配空间,并且在方法结束之后栈内存的数据会被全部清除,出栈的顺序就是先进后出,后进先出,堆内存是等GC空闲了去回收这些无用的对象,但是不会回收强引用的对象,元空间有静态的成员和class文件,需要等到class文件卸载的时候才会清除,一个class文件就有一个class类的对象来与之对应
==string出现的问题==
Computer computer = new Computer("APPLE",7863,16,256,"Intel-i7");
Computer computer1 = new Computer("APPLE",7863,16,256,"Intel-i7");
System.out.println(computer.brand==computer1.brand);
//这里品牌为APPLE类型但是返回true,因为new的是对象,字符串没有new
// 因为字符串在常量池只会存一份,如果常量池不存在,就会放进常量池,如果常量池存在就共享一份
String str="abc";
String str1="abc";
System.out.println(str==str1);//true