(本章看不懂多读几遍,弄懂后再往下章看)
面向对象学习3. 对象的创建分析
Java Memory Structure:
如上图所示:
主要分为Stack和Heap Memory
其中Stack主要放method包括main
程序从main开始所以main最先进入Stack,等所有其他需要调用的程序和variable全部调用结束,main作为收尾最后从stack出来。
而Heap memory又分为Heap Area和Method Area
建立object需要按照模板class的样子来,class模板的结构在Method area里面
实际建立的object放在Heap area,
object实际定义用到的自定义String内容放在Method Area里面的String Pool
参考资料
https://www.guru99.com/java-stack-heap.html
https://www.baeldung.com/java-stack-heap
https://www.geeksforgeeks.org/java-memory-management/?ref=lbp
https://www.javatpoint.com/memory-management-in-java
创建对象object时候内存分析
Application的main()在栈最底下,随着程序执行,一层一层往上跑,之后执行结束Application就到了栈最上面,执行结束。
每次new一个对象object,就套用Heap memory里面的method area方法区class模板,按照class的样子在heap area里面新建一个object(比如新建一个doggy1,新建一个doggy2)。
举例
public class Dog{
String name;
int age;
public void run(){
System.out.println("running");
}
}
编写测试代码
public class Test{
public static void main(String[] args){
Dog doggy1 = new Dog();
doggy1.name = "Ahuang";
doggy1.age = 1;
doggy1.run;
Dog doggy2 = new Dog();
doggy2.name = "AHui";
doggy2.age = 5;
doggy2.run;}
public static int add(int a, int b)
{return a+b;}
}
栈stack:主要用于存储main(),引用自定义的变量名等
堆heap area:存储实际新建的object对象,执行每个object里面的run步骤时候会去调用method area里面的具体run结构
方法区method area:存储class类定义结构的细节信息
静态方法区static area,和class类一起加载,可以被object对象直接使用
举例: new object时候JVM具体分析
- 程序在stack跑,这里也是main的地盘 发现需要new一个object 类型为Dog具体object名叫做doggy1,它会在stack新建一层,准备存放地址(引用变量ref#地址是从下一步送过来的#比如地址为0x0001)
- 需要new一个新的Dog时候,先去class里面找到Dog class的结构,在heap area具体生成一个按照这个class结构构造的Dog,并给出该Dog object的具体地址链接去stack(比如地址为0x0001)
- 或许在heap area内运行自建的object时发现它需要运行一些具体的method,比如run(),而如何run()是包含在Dog class中的,这时候就需要链接method area,因为Dog class的原始具体定义在那存放着,其中当然也包括如何run()。
- 或许在heap area内运行自建的object时发现它需要运行一些具体的名称,比如doggy1的名字叫做Ahuang,而“Ahuang”这个String是存放在String Pool(可以在Method area找到它)
- 特殊的static area静态方法区:比如主程序里的一个method:public static int add()因为加了static,这种是在method area区的static area和其他class结构一起加载的,之后能够被heap area里面的object快速的直接调用。
思考:
什么是Heap space and Permgen (or called Permanent Generation)?
总结
- class类与object对象
- class类是一个模板:比较抽象
- object对象是一个按照class模样,依葫芦画瓢的自建实例
- 方法method
- method定义:一个仅在被召唤时候才动弹的代码块。可以给它喂data或parameters。有专职功能的method,叫做functions。
- 调用:method在程序中被创建,调用分为static和non-static
3 ref引用链接
引用类型:基本类型(8种)
object通过stack存储地址,地址指向heap area 新建的new object
对象是通过引用来操作的:栈stack—>堆heap area
- 属性:class里面的字段Field 成员变量(提示:class里面定义的变量,及其初始数值比如Null)
默认的初始化值(用户写系统会默认给的值)
数字:0 0.0
char:u0000
boolean: false
引用的自定义字符串等:null
赋值的结构:修饰符 属性类型 属性名=属性值(比如int a = 3;) - object对象的创建和使用
- 必须使用new关键字创造对象 和 constrcutor构造器(如果用户没写constructor,系统会偷偷帮你创建一个,在反编译的.class文件中可以清楚地看到) Person x = new Person();
- object对象的field属性写法 x.name
- object对象的method写法 x.run()
- 类class里面只会有下面两个部分
- 静态的属性static field 属性
- 动态的行为non-static method 方法