問題背景
? ? ? ?最近這2天準(zhǔn)備重新看一遍《effective java》,發(fā)現(xiàn)這些經(jīng)典的書籍真的是看一遍又有一遍的感受创泄。也越來越覺的學(xué)習(xí)的過程是一個重復(fù)的過程。這次遇到的問題是在第17條中看到的观挎,看了蠻久都沒有看懂視例代碼垛耳。第17條的內(nèi)容是要么為繼承而設(shè)計,并提供文檔說明洒闸,要么就禁止繼承耳舅。在其中有一段示例構(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("時間"+date);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? ? ? ? ? ? Sub sub=newSub();
? ? ? ? ? ? ? ? ? ? ? ? sub.overrideMe();
? ? ? ? ? ? ? }
}
? ? ? ?你可能會期待這個程序會打印出日期兩次碌上,但是它第一次打印的是null,因為overrideMe方法被super構(gòu)造器調(diào)用的時候挽放,構(gòu)造器Sub還沒有機會初始化date域绍赛。注意,這個程序觀察到的final域處于2種不同的狀態(tài)辑畦。還要注意吗蚌,如果overrideMe已經(jīng)調(diào)用了date中的任何方法,當(dāng)Super改造器調(diào)用overrideMe的時候纯出,調(diào)用就會拋出NullPointerException異常(原文)蚯妇。
問題提出
? ? ? ? ?看到很多的人看到上面的代碼都會知道結(jié)果,但是我當(dāng)時卻卡在了為啥父類構(gòu)造方法調(diào)用overrideMe是子類的暂筝?瞬間懵了箩言,當(dāng)時沒有理解過來。腦子轉(zhuǎn)不過來了焕襟,只能查查資料了陨收,但是不知道怎么搜索。于是只能自己瞎折騰一下。于是先把代碼加上打游皲觥:
問題解決
? ? ? ? 確實是調(diào)用的子類的overrideMe方法拄衰,還是不太懂。只能debug了饵骨,在debug之前我又在overrideMe方法加上了一個this翘悉,我想看看this代表的是誰。
? ? ? ? 終于搞清楚了居触,main里面就是實例化了子類妖混,this代表的就是子類,所以父類中構(gòu)造方法中調(diào)用overrideMe的就是子類的overrideMe轮洋。完美
問題總結(jié)與分享
? ? ? ? 人有時候容易思維定勢制市,導(dǎo)致有時候別人很容易看出的問題自己一直懵在里面出不來,這個問題對于我來說就是這樣的額砖瞧,自己當(dāng)時怎么都搞不懂息堂,固定在一個地方了,問了朋友問了導(dǎo)師块促,瞬間就想清楚了在經(jīng)過自己的驗證,問題就是找到答案了床未。雖然固定在那是痛苦的竭翠,不過找到問題答案就是開心的。
? ? ? ? 最近一直看資料看書薇搁,看到一段個人覺的非常不錯的代碼的分享給所有人斋扰。我們經(jīng)常會看到字符串倒轉(zhuǎn)的面試題,有很多實現(xiàn)方式啃洋,我就把自己看到的比較好的方式分享出來传货,這個方式也感覺跟我上面那個思維問題有點類似的感覺,個人感覺遇到字符串的倒轉(zhuǎn)的問題的時候宏娄,很多會想到循環(huán)什么的问裕。這個方法卻出乎意料。代碼如下:
? ? ? ? public static String reverse(String originStr) {
? ? ? ? ? ? ? ? ? ? ? if(originStr ==null|| originStr.length() <= 1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?returnoriginStr;
? ? ? ? ? ? ? ? ? ? ?returnreverse(originStr.substring(1)) + originStr.charAt(0);//截取前面的補到后面去
? ? ? ?}