阅读《effective java-第17条》遇到的问题解决与分享
问题背景
最近这2天准备重新看一遍《effective java》,发现这些经典的书籍真的是看一遍又有一遍的感受。也越来越觉的学习的过程是一个重复的过程。这次遇到的问题是在第17条中看到的,看了蛮久都没有看懂视例代码。第17条的内容是要么为继承而设计,并提供文档说明,要么就禁止继承。在其中有一段示例构造器决不能调用可被覆盖的方法代码如下:
父类代码
package com.sitech.test;
/**
* effect of java
* @author liaowp
*
*/
public class Super { public Super(){
overrideMe();
} public void overrideMe(){ }
}
子类代码
package com.sitech.test; import java.util.Date; /**
* effect of java
* @author liaowp
*
*/
public class Sub extends Super{
private final Date date; Sub(){
date =new Date();
} @Override
public void overrideMe(){
System.out.println("时间"+date);
} public static void main(String[] args) {
Sub sub = new Sub();
sub.overrideMe();
}
}
输出结果:
你可能会期待这个程序会打印出日期两次,但是它第一次打印的是null,因为overrideMe方法被super构造器调用的时候,构造器Sub还没有机会初始化date域。注意,这个程序观察到的final域处于2种不同的状态。还要注意,如果overrideMe已经调用了date中的任何方法,当Super改造器调用overrideMe的时候,调用就会抛出NullPointerException异常(原文)。
问题提出
看到很多的人看到上面的代码都会知道结果,但是我当时却卡在了为啥父类构造方法调用overrideMe是子类的?瞬间懵了,当时没有理解过来。脑子转不过来了,只能查查资料了,但是不知道怎么搜索。于是只能自己瞎折腾一下。于是先把代码加上打印:
问题解决
确实是调用的子类的overrideMe方法,还是不太懂。只能debug了,在debug之前我又在overrideMe方法加上了一个this,我想看看this代表的是谁。
debug之后可以看到this指的是Sub,date是空的,这样知道就知道父类的构造方法中调用的overrideMe是那里的,所以也就明白了父类为啥调用的是子类的方法了。main里面就是实例化了子类,this代表的就是子类,所以父类中构造方法中调用overrideMe的就是子类的overrideMe。完美
问题总结与分享
人有时候容易思维定势,导致有时候别人很容易看出的问题自己一直懵在里面出不来,这个问题对于我来说就是这样的额,自己当时怎么都搞不懂,固定在一个地方了,问了朋友问了导师,瞬间就想清楚了在经过自己的验证,问题就是找到答案了。虽然固定在那是痛苦的,不过找到问题答案就是开心的。
最近一直看资料看书,看到一段个人觉的非常不错的代码的分享给所有人。我们经常会看到字符串倒转的面试题,有很多实现方式,我就把自己看到的比较好的方式分享出来,这个方式也感觉跟我上面那个思维问题有点类似的感觉,个人感觉遇到字符串的倒转的问题的时候,很多会想到循环什么的。这个方法却出乎意料。代码如下:
public static String reverse(String originStr) {
if(originStr == null || originStr.length() <= 1)
return originStr;
return reverse(originStr.substring(1)) + originStr.charAt(0);//截取前面的补到后面去
}
最新文章
- 2、项目标准的制定 - PMO项目管理办公室
- C# GDI+ 处理文本的两个小技巧
- Android 笔记 day1
- Oracle Grid Infrastructure安装部署文档
- C指针的大小
- Using the rJava package on Win7 64 bit with R
- C#导入Exel
- InnoDB引擎的索引和存储结构
- 蒟蒻修养之cf橙名计划
- 算法优化:rgb向yuv的转化最优算法,快得让你吃惊!
- Problem 1010 - 素数环问题
- IE的有条件注释详解
- UML建模工具-火龙果软件
- 九度 题目1044:Pre-Post
- web前端利用HSTS(新的Web安全协议HTTP Strict Transport Security)漏洞的超级Cookie(HSTS Super Cookie)
- jboss规则引擎KIE Drools 6.3.0 Final 教程(2)
- jQuery-01:on live bind delegate
- CodeBlocks中我遇到的无法调试问题及解决方案
- 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug
- 【Wannafly挑战赛22A计数器】【裴蜀定理】
热门文章
- 两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错
- wpf:DataGrid使用
- WCF Rest Json
- POJ 2635 The Embarrassed Cryptographer 大数模
- a href=";#";与a href=";####";的区别是什么
- HTTP状态码——对照表
- 使用 .NET 平台,如何玩转 Universal Windows 应用?
- iOS,object-c传参c语言的二维数组
- OA学习笔记-003-Hibernate3.6配置
- USB otg 学习笔记