黑馬程序員_編程新手遇到問題怎麼辦?

----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------

在黑馬論壇中遇到一些比較有趣的題目,涉及到各種知識點。現在進行一下簡要的歸納,加深自己對相關知識點的認識。更重要的是通過解決這些問題,總結出類似問題的解決經驗。

問題1:

第一個問題:private Temp temp ;這個要怎麼理解呢?
第二個問題:具體解釋下實現過程。
觀察如下程序的輸出結果—— 本程序沒有任何實際意義,只是爲了加強this的理解。

class Demo
{
        private Temp temp ;
        public Demo()
        {
                this.temp = new Temp(this) ;
                this.temp.fun() ;
        }
        public void print()
        {
                System.out.println("Hello World!!!") ;
        }

}
        
class Temp 
{
        private Demo demo ;

        public Temp(Demo demo)
        {
                this.demo = demo ;
        }
        public void fun()
        {
        
        this.demo.print() ;

        }
}

public class ThisDemo
{
        public static void main(String args[])
        {
                Demo d = new Demo() ;
        }
}

解答:

1.在demo中定義temp對象,方便與調用temp中的方法,並且在demo的構造方法中實例temp對象,就是爲了保證在demo中會有temp對象,以免忘記初始化temp對象,這是一個小技巧,在開發中會用到。

2.兩個類中互相持有對方對象的引用,Demo d = new Demo();創建demo對象,temp先入棧,demo的引用後入棧,然後demo構造方法開始執行,在demo的構造方法中先執行temp的構造方法開始執行,然後在回到demo中的構造方法

package quiz;

public class ThisDemo {
        public static void main(String[] args) {
                Demo d = new Demo();
                System.out.println(d);//得知和(3)中的對象是同一個
        }
}
class Demo {
        private Temp temp;
        public Demo() {
                System.out.println("demo構造方法");//(1)
                this.temp = new Temp(this);
                System.out.println(this.temp);//(4)demo中的temp
                this.temp.fun();
        }
        public void print() {
                System.out.println("Hello World!!!");//(5)Demo中的temp先調用fun()方法,但是fun()中有調用Demo的print方法。
        }
}
class Temp {
        private Demo demo;
        public Temp(Demo demo) {
                System.out.println("temp構造方法");//(2)
                this.demo = demo;
                System.out.println(this.demo);//(3)temp中的demo
        }
        public void fun() {
                this.demo.print();
        }
}
打印結果爲:
demo構造方法
temp構造方法
quiz.Demo@527c6768
quiz.Temp@65690726
Hello World!!!
quiz.Demo@527c6768

結論:當對程序的執行順序有疑惑時,在程序的關鍵位置打印一下就可以輕易的瞭解代碼的執行順序。

問題二:

son類 繼承father類 ,father類繼承grandfather類son能調用grandfather指定的有參的構造函數嗎?

不可以的,我們在子類中的構造方法使用super()語句來調用父類中的構造方法,是因爲父類中沒有無參構造方法,也就是編譯器要先構造父類在構造子類,同樣的爺爺類是先於父類初始化的,所以編譯器會從爺爺類開始逐步向下進行初始化,你現在要在孫子類中直接調用爺爺類中的構造方法,編譯器先構造出父類,但是父類中不存在爺爺類中的構造函數,所以不可以。

對於這個問題的解答,如果理解了爲什麼父類的構造函數先於子類執行,可以採用已有的知識推導出相應的結論是不難的。可見考慮問題時,如果你真正的理解了問題的關鍵,那麼與之相關的問題就都容易想明白了。


問題三:

awt構建圖形化界面的時候,有講到構件Compent,它分Container容器和其他的,說容器是一特殊組件,可添加其他組件,那繼承它的面板,窗口,對話框等也都算容器?也都可以隨意添加其他組件,包括同級容器?

面板,窗口,對話框等都算容器。JDK中對Cotainer()構造方法的描述,public Container()構造一個新的 Container。可以直接擴展 Container,但在這種情況下是輕量級的,並且它必須被位於本機組件樹中更高處的某一個父容器包含。(比如說 Frame)。 

另外對於Container()的幾個重載的add的()方法都有提示這是一個適用於addImpl(java.awt.Component, java.lang.Object, int) 的便捷方法,addImpl()方法拋出的異常描述爲
IllegalArgumentException - 如果 index 無效;如果 comp 是此容器的子容器,則有效範圍是 [-1, getComponentCount()-1];如果組件不是此容器的子容器,則有效範圍是 [-1, getComponentCount()] 
IllegalArgumentException - 如果 comp 是此容器的祖先容器 
IllegalArgumentException - 如果向容器添加一個窗口 
NullPointerException - 如果 comp 爲 null
也就是說至少向組件中添加窗口是不行,不過可以添加其它滿足要求的組件

雖然回答的不是很好,很有針對性,但是通過查找相應的api,將問題轉換成權威的資料也不失爲解答相關問題的方式之一。

小結:我們在學習編程中遇到的一些問題是在所難免的,可能我們也不知道如何解決這些疑惑,但是許多問題都有相同性,總結一些小規律,相信對你的解惑之路會有較大的幫助的。

----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章