疯狂JAVA16课——读书笔记(第一课、第二课)

1、Java数组是静态的,一旦数组的初始化完成,数组元素的内存空间分配即结束,程序只能改变数组元素的值,而不能重新改变数组对象在内存中的位置和大小。

2、数组有两种初始化方式,即静态初始化和动态初始化。

3、Java内存管理分为两个方面:内存分配和内存回收。这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间。内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制自动清理该对象,并回收该对象所占用的内存。虽然JVM内置了垃圾回收机制回收失去引用的Java对象所占用的内存,但是Java程序依然会有内存泄露。

4、JVM的垃圾回收机制由一条后台线程完成(我记得JVM默认的GC是串行的,貌似不是一条后台线程?),本身也是非常耗性能的,因此如果肆无忌惮地创建对象,让系统分配内存,那这些分配的内存都将由垃圾回收机制进行回收。这样做有两个坏处:①不断分配内存使得系统可用内存减少,从而降低程序运行性能 ②大量已分配内存的回收使得垃圾回收的负担加重,降低程序运行性能。

5、从另一个角度来看,类也是对象,所有类都是Class的实例,每个类初始化完成之后,系统都会为该类创建一个对象的Class实例,程序可以通过反射来获取某个类所对应的Class实例。例如,要获取Person类对应的Class实例,通过Person.class;或Class.forName("Person");任意一条代码即可。

6、对于实例变量而言,它属于Java对象本身,每次程序创建Java对象时都需要为实例变量分配内存空间,并执行初始化。从程序运行角度来看,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。从语法角度来看,程序可以在3个地方对实例变量执行初始化:①定义实例变量时指定初始值②非静态初始化块中对实例变量指定初始值③构造器中对实例变量指定初始值。其中第①②种方式比第③种方式更早执行,但第①②种方式的执行顺序与他们在源程序中的排列顺序相同。实际上,经过编译器处理之后,它们三者对应的赋值语句都被合并到构造器中。

7、类变量的初始化时机大致与实例变量相同。

8、以Java对象而言,程序开始对Java对象初始化,初始化分为2个阶段:①为实例变量分配内存空间并指定默认值②按初始化代码排列顺序对实例变量进行初始化。

9、当创建任何Java对象时,程序总会先依次调用每个父类非静态初始化块、父类构造器(总是从Object开始)执行初始化,最后才调用本类的非静态初始化块、构造器执行初始化。

10、如果在父类的构造器中调用子类中覆盖的方法,那么此时子类中的实例变量还未完成初始化,则会出现数据错误的问题。

11、当一个父类引用变量指向一个子类的时候,调用该变量引用的对象的实例变量时表现出的是编译时的类型,而调用方法的时候表现出的是运行时类型。

你可能感兴趣的:(疯狂JAVA16课——读书笔记(第一课、第二课))