一:内存管理:内存分配和内存回收
内存分配:特指创建java对象JVM为该对象在堆内存中所分配的内存空间。
内存回收:指当该java对象失去引用,变成垃圾时,JVM的垃圾回收机制自动清理该对象,并回收该对象所占用的内存
注:JVM内置了垃圾回收机制回收失去引用的java对象所占用的内存
1、如果肆无忌惮的创建对象的坏处:
不断分配内存使得系统中可用内存减少,从而降低程序运行性能
大量已分配内存的回收使得垃圾回收的负担加重,降低程序的运行性能
二:实例变量和类变量
变量:成员变量、局部变量
局部变量:
形参:在方法签名中定义的局部变量,有方法调用者负责为其赋值,随方法的结束而消亡
方法内的局部变量:在方法内定义的局部变量,必须在方法内对齐进行显示的初始化,这种类型的局部变量从初始化完成后开始生效,随方法的结束而消亡
代码块内的局部变量:在代码块内定义的局部变量,必须在代码块内对其进行显式初始化,这种类型的局部变量从初始化完成后开始生效,随代码的结束而消亡
类体内定义的变量被称为成员变量,如果定义该成员变量时没有使用static修饰,该成员变量又被称为非静态变量或实例变量,如果使用了static修饰,则该成员变量又可称之为静态变量或类变量
如果使用了static修饰,这些成员就属于类本身,从这个意义看,static只能修饰类里的成员,不能修饰外部类,不能修饰局部变量、局部内部类;
三:实例变量的初始化时机
- 定义实例变量时指定初始值
- 非静态初始化块中对实例变量指定初始值
- 构造器中对实例变量指定初始值
- 每当程序调用指构造器来创建java对象时,该构造器避让会获得执行的机会,除此之外,该类包含的非静态初始化块将会获得执行的机会,而且总是在构造器执行之前获得执行
- 定义实例变量时指定的初始值,初始化块中为实例变量指定的初始化值,构造器中为实例变量指定的初始值,三者的左右完全类似;经过编译器处理后,它们对应的赋值语句都被合并到构造器中,在合并过程中,定义变量语句转换得到的赋值语句、初始化块里的语句转换得到的赋值语句,总是位于构造器的所有语句之前;合并后,两种赋值语句的顺序保持它们在源代码中的顺序;
初始化顺序:
对于一个类而言,按照如下顺序执行:
- 执行静态代码块
- 执行构造代码块
- 执行构造函数
- 对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
当涉及到继承时,按照如下顺序执行:
执行父类的静态代码块,并初始化父类静态成员变量
执行子类的静态代码块,并初始化子类静态成员变量
执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次
构造代码块:类中直接用{}定义,每一次创建对象时执行。
执行顺序优先级:静态块,main(),构造块,构造方法。