2012-07-31 54 views
3

我有兩個類和一個如下所示的接口。 快速概要:界面Winterface,Class Big,Class Little擴展並實現Winterface。我不明白'這個'與超類一起使用

public interface Winterface {} 


public class Big { 

    public int hello = 88; 

    public Big() {} 

    public void theMethod() { 
     System.out.println ("Big was here: " + (this instanceof Winterface) + ", " + this.hello); 
    } 
} 

public class Little extends Big implements Winterface{ 

    private boolean hello = true; 
    public Little(){} 

    public void theMethod() { 
     super.theMethod(); 
     System.out.println("Little was here: " + hello); 
    } 

    public static void main(String [] args) { 
     Little l = new Little(); 
     l.theMethod(); 
    } 
} 

當我在小執行主,我得到下面的輸出

大在這裏:真的,88 很少有人在這裏:真正

我的問題是,如何才能

1)(Winterface的這個例子)返回true,但是

2)this.hello be 88? 如果this.hello = 88,那麼this = Big,這不是Winterface的一個實例。

我不明白這是怎麼可能的,在此先感謝

編輯:謝謝大家對我現在明白了,「這」指的是小,這是一個很大並實現Winterface。由於該方法被稱爲super.theMethod(),所以可用的變量'hello'是Big中的變量,即使'this'指的是很少。

+0

相關閱讀@ http://www.techrepublic.com/article/avoid-these-java-inheritance-gotchas/5031837 – 2012-07-31 15:52:17

回答

2

this只能是一個類。但this.hello是該類可訪問的字段。

由於this只能是一個類這是一個Little具有父Big和你打電話時在其父的方法只能看到hello這是它認爲實現Winterface

即Java支持方法的多態性,但不支持字段。

+0

雖然這並沒有回答關於'Winterface'的問題。 – 2012-07-31 15:38:09

+0

那麼Summerface呢? – Almo 2012-07-31 15:39:15

+1

@ S.L.Barth好的,澄清。 – 2012-07-31 15:46:26

2

lLittleLittleBig也實現了Winterface行爲。
super是對父類的調用,因此使用父類的hello成員(即Big)。
您不是在做this.hello,而是super.theMethod(),它使用父級的類成員變量hello

UPDATE:
super.theMethod()調用在父類中的相應方法。在父類中,您訪問父級的字段(它們也屬於派生類,因爲Little也是Big)。所以this.hello就是訪問父類的代碼的一部分。
你可以想像的Little的打印內存中,如下所示:

++++++++ 
+ Big + 
-------- 
+Little+ 
++++++++ 

所以Little有父母的所有成員變量即Big,並在代碼中它的Big「編碼區」內運行super.theMethod()運行。
正如彼得指出在他的回答,polymorhism不支持的方法,我希望這個過於簡單化的描述有助於理解這個

+0

呵呵?我在super.theMethod()中做了這個。 'this'怎麼能用同一個方法引用兩個不同的東西呢? – 2012-07-31 15:52:43

+0

@ColeCanning:查看更新 – Cratylus 2012-07-31 16:02:23

1

這是因爲this instanceof ...檢查不使用靜態(即編譯時)類型(這是Big),但對象的(this「)動態運行時類型(即this.getClass()),這是Little在你的例子中。如果將使用靜態類型,運營商將是非常沒有意義的,因爲我們將有:

Object obj = "foo"; 

if (obj instanceof Object) { /* always entered */ } 
/* but */ if (obj instanceof String) { /* never entered */ } 

靜態,在編譯時。所述instanceof操作者的目的是使運行時類型的測試,例如:

Object obj = /* whatever */; 

if (obj instanceof String) { 

    String str = (String)obj; // Cast cannot fail 
    ... 

} else if (obj instanceof Long) { 

    Long val = (Long)obj;  // Cast cannot fail 
    ... 
} 

注意,這種技術只應謹慎使用。

0

您的變量是Big和Little的一個實例。它是Little的直接實例,但由於Little從Big繼承,instanceof運算符也將爲Big返回true。

Little l = new Little(); 
System.out.println(l instanceof Little); // true, l is an instance Little 
System.out.println(l instanceof Big); // true, l is an instance of Little which inherits from Big 

你的其他誤解(我假設)是'方法查找'是如何工作的。當你調用方法時,它會選擇Little的方法實現。當你調用super.theMethod時,你明確地說過「調用Big的這個方法的版本」,然後在這個方法中使用Big的hello變量而不是Little的hello變量。

+0

我明白,但在這種方法中,'這'似乎是指向我和大小。我現在明白,這是一個小和一個大,並實現winterface – 2012-07-31 15:55:56

+0

'這'的類型取決於你稱之爲'這'。該對象本身當然是一個小的,但是那個時候運行的代碼在Big中。因此,'this'在此時被假定爲Big,因爲您正在運行Big的代碼。 Big沒有Little的內置知識,所以不能把'this'當作一個小小的對象。 – Chris 2012-07-31 16:05:05

0

這裏發生的事情是,當你定義在Little您的變量hello不會覆蓋變量hello就是裏面要定義一個新的變量helloLittle是躲在內Big變量helloBig。因此,在Big的範圍內,hello將指的是整數值88,並且在Little的範圍內,hello將指的是真。這些都是包含在您的對象中的不同變量,唯一的區別是您引用它們的範圍。

像這裏的其他人所說的那樣,instanceof是比較對象的運行時類型(由this.getClass()返回的內容)的運算符。當在Big中,即使對象中的變量範圍將引用Big,this仍爲運行時類型Little,這就是爲什麼它是Winterface的實例。