《疯狂java--突破程序员基本功的16课》读书笔记

该书讲述了大部分程序员容易忽视的细节性问题,如果有条件建议详细阅读。

 

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

 

2.2.2 访问子类对象的实例变量(32)
如下情况可以出现父类访问子类的情况。

 

这个程序的输出结果是多少?
答案如下:
如果子类与父类有同样的成员变量,则子类的隐藏掉父类的,内存中还是会有这2个变量的。
构造器负责对java对象实例变量执行初始化也就是赋值,在此之前该对象所占内存已经被分配下来,但都是默认的空值。(0、false、null)
Derived类,可以重写成

 

 

由此可以更清楚地看到Derived的对象是如何被创建出来的了!
super里调用了子类的display()方法,该方法执行的时候i的值还未被赋值,也就是说还是0,所以打印结果是0;

 


 

2.3.1 继承成员变量和继承成员方法的区别(36)
如下情况的输出个是多少呢?

 

 

由上可以看出即便是引用到的子类对象,但成员变量依然同引用的类型。
如果在子类重写了父类的方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中。对于实例变量则不存在这样的现象,即使子类中定义了与父类完全同名的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量。
因为继承成员变量和继承方法之间存在这样的差别,所以对于一个引用类型的变量而言,当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于声明该变量时类型;当通过该变量来调用它所引用的对象的方法时,该方法行为取决于它所实际引用的对象的类型。

 


 

2.4.2 执行“宏替换”的变量(49)

 

由于编译器可以在编译阶段就确定s2的值为 "疯狂JAVA" ,所以系统会让s2直接指向字符串池中缓存中的 "疯狂JAVA" 字符串,所以 s1 == s2 为 true ;
str1 ,str2为2个String变量,编译器在编译阶段不能确定s3的值,所以s3不会指向字符串池中缓存中的  "疯狂JAVA" 。所以 s1 == s3 为 false ;
fs1,fs2,被 final 修饰,编译器可以在编译阶段确定s4的值,所以 s1 == s4 为 true ;

 


 

4.4.3 尽早释放无用对象的引用(124)

 


 

4.4.4. 尽量少用静态变量(124)
某个对象被 static 变量所引用,那么垃圾回收机制通常是不会回收这个对象所占的内存。直到程序运行结束。

 


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值