博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阅读《effective java-第17条》遇到的问题解决与分享
阅读量:5274 次
发布时间:2019-06-14

本文共 1878 字,大约阅读时间需要 6 分钟。

问题背景

  最近这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);//截取前面的补到后面去}

转载于:https://www.cnblogs.com/liaoweipeng/p/6262720.html

你可能感兴趣的文章
关于photoswiper展示时图片自适应的问题
查看>>
微信公众开发api接口
查看>>
RPC
查看>>
C#读取Mysql blob字段 分类: .NET ...
查看>>
2018 hncpc 部分题
查看>>
滚动到顶部
查看>>
python flask 学习与实战
查看>>
[luoguP1640] [SCOI2010]连续攻击游戏(二分图最大匹配)
查看>>
差分约束系统总结(转)
查看>>
从mysqldump整库备份文件中恢复单表
查看>>
INT(M)表示什么意思?
查看>>
凉凉夜色为我思念成河
查看>>
数据库连接及线程池
查看>>
解决android应用程序适用新老android系统版本方法
查看>>
Oracle SQL语句执行过程
查看>>
Oracle 中的SID是什么意思?有什么作用?
查看>>
Java面向对象(二、继承)
查看>>
关于http协议
查看>>
jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
查看>>
软件工程个人项目——买书的最低价格
查看>>