----------- 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指定的有參的構造函數嗎?
對於這個問題的解答,如果理解了爲什麼父類的構造函數先於子類執行,可以採用已有的知識推導出相應的結論是不難的。可見考慮問題時,如果你真正的理解了問題的關鍵,那麼與之相關的問題就都容易想明白了。
問題三:
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學習型技術博客、期待與您交流! ------------