Java中的内存管理机制:
栈:栈是一片内存区域,存储的是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量);for循环内部定义的也是局部变量;只有先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。
堆:存储的是数组和对象(数组也是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的。虽然不会被释放,但是如果没有指针指向某个对象,它会被当成垃圾,由垃圾回收机制不定时的收取。
垃圾回收机制:Java中有独有的垃圾回收机制,可以回收不再被引用的对象。
对象类型形成层次结构:
子父类的继承关系,最大的父类是Object类
Boxed primitives:
将基本数据类型包装成对象数据类型,: Boolean, Integer, Short, Long, Character, Float, Double
通常是在定义容器类型的时候使用它们(容器类型操作的元素要求是对象类型,所以需要对基本数据类型进行包装,转换为对象类型)如List,Map,Set等
一般情况下可以和对应的基本数据类型自动转换,但会降低性能,尽量避免使用
运算符
+,-,*,/,()……
字符串可以通过+相连
基本数据类型直接使用运算符;对象可以通过调用相应方法来使用运算符;某些静态方法也可以执行运算(如Math库中的方法)
4.2静态和动态检查
静态类型语言:所有变量的类型在编译时已知,编译器可以推导表达式类型,可以在编译阶段进行类型检查
动态类型语言:变量类型在编译时未知或不需要知道,在运行阶段进行类型检查
一种语言可以提供3种检查:
静态检查:在编译之前进行检查,包括:语法错误、类名/函数名错误、参数数目错误、参数类型错误、返回值类型错误等。针对动态类型的语言会检查除类型以外的其他语法错误,主要关于“类型”的检查(如a是int,b是int,则得出a/b也是int)
动态检查:在运行过程中进行检查,检查非法的参数值,非法的返回值、越界、空指针等。主要关于“值”的检查(接上例,如a = 1,b = 0,执行时发现除0错误)
无检查:不进行检查
静态检查>动态检查>无检查
有些问题静态检查和动态检查都无法检测出来,如整数除法(截断整数)、整数溢出、浮点数的特殊类型:NaN,POSITIVE_INFINITY,NEGATIVE_INFINITY