問(wèn)題背景
? ? ? ?最近這2天準(zhǔn)備重新看一遍《effective java》,發(fā)現(xiàn)這些經(jīng)典的書籍真的是看一遍又有一遍的感受。也越來(lái)越覺(jué)的學(xué)習(xí)的過(guò)程是一個(gè)重復(fù)的過(guò)程。這次遇到的問(wèn)題是在第17條中看到的,看了蠻久都沒(méi)有看懂視例代碼。第17條的內(nèi)容是要么為繼承而設(shè)計(jì),并提供文檔說(shuō)明,要么就禁止繼承。在其中有一段示例構(gòu)造器決不能調(diào)用可被覆蓋的方法代碼如下:
父類代碼
packagecom.sitech.test;
/**
* effect of java
*@authorliaowp
**/
publicclassSuper {
? ? ? ? ? ?publicSuper(){
? ? ? ? ? ? ? ? ?overrideMe();
? ? ? ? ? }
? ? ? ? ? publicvoidoverrideMe(){
? ? ? ? ? }
}
子類代碼
packagecom.sitech.test;
importjava.util.Date;
/**
* effect of java
*@authorliaowp
**/
public class Sub extends Super{
? ? ? ? ? ? ? ?private final Date date;
? ? ? ? ? ? ? ?Sub(){
? ? ? ? ? ? ? ? ? ? ?date=newDate();
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ?public void overrideMe(){
? ? ? ? ? ? ? ? ? ? ? ?System.out.println("時(shí)間"+date);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? ? ? ? ? ? Sub sub=newSub();
? ? ? ? ? ? ? ? ? ? ? ? sub.overrideMe();
? ? ? ? ? ? ? }
}
? ? ? ?你可能會(huì)期待這個(gè)程序會(huì)打印出日期兩次,但是它第一次打印的是null,因?yàn)閛verrideMe方法被super構(gòu)造器調(diào)用的時(shí)候,構(gòu)造器Sub還沒(méi)有機(jī)會(huì)初始化date域。注意,這個(gè)程序觀察到的final域處于2種不同的狀態(tài)。還要注意,如果overrideMe已經(jīng)調(diào)用了date中的任何方法,當(dāng)Super改造器調(diào)用overrideMe的時(shí)候,調(diào)用就會(huì)拋出NullPointerException異常(原文)。
問(wèn)題提出
? ? ? ? ?看到很多的人看到上面的代碼都會(huì)知道結(jié)果,但是我當(dāng)時(shí)卻卡在了為啥父類構(gòu)造方法調(diào)用overrideMe是子類的?瞬間懵了,當(dāng)時(shí)沒(méi)有理解過(guò)來(lái)。腦子轉(zhuǎn)不過(guò)來(lái)了,只能查查資料了,但是不知道怎么搜索。于是只能自己瞎折騰一下。于是先把代碼加上打印:
問(wèn)題解決
? ? ? ? 確實(shí)是調(diào)用的子類的overrideMe方法,還是不太懂。只能debug了,在debug之前我又在overrideMe方法加上了一個(gè)this,我想看看this代表的是誰(shuí)。
? ? ? ? 終于搞清楚了,main里面就是實(shí)例化了子類,this代表的就是子類,所以父類中構(gòu)造方法中調(diào)用overrideMe的就是子類的overrideMe。完美
問(wèn)題總結(jié)與分享
? ? ? ? 人有時(shí)候容易思維定勢(shì),導(dǎo)致有時(shí)候別人很容易看出的問(wèn)題自己一直懵在里面出不來(lái),這個(gè)問(wèn)題對(duì)于我來(lái)說(shuō)就是這樣的額,自己當(dāng)時(shí)怎么都搞不懂,固定在一個(gè)地方了,問(wèn)了朋友問(wèn)了導(dǎo)師,瞬間就想清楚了在經(jīng)過(guò)自己的驗(yàn)證,問(wèn)題就是找到答案了。雖然固定在那是痛苦的,不過(guò)找到問(wèn)題答案就是開心的。
? ? ? ? 最近一直看資料看書,看到一段個(gè)人覺(jué)的非常不錯(cuò)的代碼的分享給所有人。我們經(jīng)常會(huì)看到字符串倒轉(zhuǎn)的面試題,有很多實(shí)現(xiàn)方式,我就把自己看到的比較好的方式分享出來(lái),這個(gè)方式也感覺(jué)跟我上面那個(gè)思維問(wèn)題有點(diǎn)類似的感覺(jué),個(gè)人感覺(jué)遇到字符串的倒轉(zhuǎn)的問(wèn)題的時(shí)候,很多會(huì)想到循環(huán)什么的。這個(gè)方法卻出乎意料。代碼如下:
? ? ? ? public static String reverse(String originStr) {
? ? ? ? ? ? ? ? ? ? ? if(originStr ==null|| originStr.length() <= 1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?returnoriginStr;
? ? ? ? ? ? ? ? ? ? ?returnreverse(originStr.substring(1)) + originStr.charAt(0);//截取前面的補(bǔ)到后面去
? ? ? ?}