读书笔记2-《crazy java》

java内存管理:内存分配和内存回收
内存分配:指创建Java对象时JVM为该对象在堆内存中所分配的内存空间
内存回收:指当该java对象失去引用变为垃圾时,JVM的垃圾回收机制自动清理该对象,并回收该对象所占内存

垃圾回收机制:由一条后台进程完成,本身非常消耗性能,若肆无忌惮地创建对象,让系统分配内存,则那些分配的内存都由垃圾回收机制进行回收。会导致:
1.不断分配内存使得系统中可用内存减少,从而降低了程序的运行性能
2.大量已分配内存的回收使得垃圾回收的负担加重,降低程序的运行性能

成员变量:类体内定义的变量
实例变量:没使用static修饰的成员变量
**类变量:**static修饰的成员变量,类变量的初始化时机总处于实例变量的初始化时机之前
总结:类变量属于类本身,而实例变量属于java对象;类变量在类初始化阶段完成初始化,而实例变量则在对象初始化阶段完成初始化。

static关键字的作用:
1.将实例成员变为类成员
2.static只能修饰在类定义中的成员变量、方法、内部类、初始化块和内部枚举类
3.static只能修饰类里的成员,不能修饰外部类、不能修饰外部类、不能修饰局部变量和局部内部类

实例变量初始化:先执行非静态初始化块和变量赋值(和源程序中的排列顺序一致),最后执行构造器
定义实例变量时指定的初始值、初始化块中为实例变量指定的初始值、构造器中的初始值三者作用相同,经过编译器处理之后,它们对应的赋值语句会合并到构造器之中,顺序位于所有构造器的所有语句之前

父类初始化操作:系统先调用最顶层的父类初始化操作,包括初始化块和构造器,然后依次向下调用所有弗雷的初始化操作,最终指向奔雷的初始化操作返回本类的实例。按如下规则调用父类构造器:
1.super显示调用父类构造器,根据实参列表来确定具体使用的父类构造器
2.this显示调用本类中重载的构造器,实参列表来确定本类的另一个构造器
3.没有super和this,会隐式调用无参构造器

this关键字:当this在构造器中时,代表正在初始化的java对象。

编译时类型VS运行时类型
1.当变量的编译时类型和运行时类型不同时,系统在调用它的实例变量和实例方法时存在差异
2.通过该变量访问它引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定
3.通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定

如果父类构造器调用了被子类重写的方法,且通过子类构造器来创建子类对象,调用(不管是隐式还是显式)了这个父类构造器,就会导致子类的重写方法在子类构造器的所有代码之前被执行,从而导致了子类的重写方法访问不到子类的实际变量值的情形。

对于一个引用类型的变量而言,当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于声明该变量时的类型;当通过该变量来调用它所引用的对象的方法时,该方法行为取决于它所实际引用对象的类型。

父、子对象在内存中的存储:当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为其父类中定义的所有实例变量分配内存,即使子类定义了与父类中同名实例变量。

final修饰符的一个重要作用是定义“宏变量”,当定义final变量时九尾该变量指定了初始值,而且初始值可以在编译时就确定下来,那这个final变量本质上就是一个“宏变量”。

java要求所有被内部类访问的局部变量都使用final修饰符的原因:对于普通局部变量,它的作用域就是停留在该方法内,当方法执行结束则该局部变量也随之消失;单在内部类则可能产生隐式的“闭包”,闭包将使得局部变量脱离它所在的方法继续存在。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值