工作内容:
1.面向对像_内存分析
2.异常
培训讲解:
Java内存分配与管理是Java的核心技术之一。
一般Java在内存分配时会涉及到以下区域:
寄存器:我们在程序中无法控制
栈stack:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆heap:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
非RAM存储:硬盘等永久存储空间
堆和栈比较1
Java的堆是一个运行时数据区,类的对象从中分配空间,它们不需要程序代码来显式的释放,堆是由垃圾回收来负责的。
堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。
但缺点是,由于要在运行时动态 分配内存,存取速度较慢。
堆和栈比较2
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令 a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响 到b的值。
堆和栈比较3
注意:这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
常量池 (constant pool)
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:
类和接口的全限定名;
字段的名称和描述符;
方法和名称和描述符。
自我分析:
栈:
1.存放常量池(常量池中存放:包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用)
2.存放基本数据类型和引用数据类型的索引(索引指向常量池,或堆)
堆:存放new出来的对象及其值
静态域:存放对象中用static定义的成员变量/方法
3.分析
1.常量池位于栈中,在定义基本数据类型时,变量指向常量池,在栈中存在2个相关区:1.普通区存放数据类型2.指向常量池的索引
2.传递参数过程中有3种情况:
一、常量,传递的是原参数的索引拷贝索引。
二、String变量,String是引用数据类型,单其不变性导致在传递过程中的不变性,以String类型数据做传递参数,传递的是原参数的索引a拷贝索引a1,如果变量值改变,a1指向新的String对象
三、数组,对象,传递的是原参数的索引a拷贝索引a1,在改变数组成员,对象成员时,a1不变
①是表示传递参数是对象,数组,String 数组 ②表示传递的是String变量,当字符串变化时则是在创建一个新的String对象
异常:系统处理流程:
【前提:方法使用throws抛出异常】
1.没有使用try-catch捕获异常,在系统发现异常,直接抛出,并终止程序继续执行
2.使用try-catch捕获异常,未捕获到异常,在异常发现异常时,先看try-catch中是否捕获到该异常,有则正常处理,并往后继续执行,如果catch没有捕获到该异常则会抛给throws,并终止系统继续执行
【前提:方法未用throws】
同上理解,不同的是,try-catch的catch未捕获到已发生的错误则会终止执行,抛出错误。