2013-10-13 66 views
-1

,如果我有一個類myClass1和第二類myClass1Extended這是第一類的擴展,我有這樣的代碼:的instanceof,子類和鑄造

myClass1 c1 = something(); // line 1 
myClass1Extended c1ex = somethingElse(); // line 2 
if (c1ex instanceof myClass1) { // line 3 
    (myClass1)c1ex.doSomething(); // line 4 
} 

我有幾個問題:

  1. 第3行,運營商instanceof會返回true嗎?
  2. 第4行,假設第一個答案是肯定的,如果doSomething()在myClass1Extended中沒有被覆蓋會發生什麼?
  3. 而如果doSomething()被覆蓋會發生什麼?
  4. 第4行是(myClass1)必要的嗎?

非常感謝您

+0

此問題未顯示任何研究工作。請先嚐試,然後再問。 –

+0

我認爲這是一個有趣的問題,人們給了我很好的答案,不幸的是我會刪除它,因爲還有其他人認爲我應該減去它。 –

回答

3

你爲什麼不去嘗試的代碼看?

  1. 它會調用一個父類
  2. 它會調用子類
  3. 沒有一個。

考慮:

class Parent 
{ 
    public void foo() 
    { 
     System.out.ptintln("parent::foo"); 
     bar(); 
    } 

    public void bar() 
    { 
     System.out.println("parent::bar"); 
    } 
} 

class Child 
    extends Parent 
{ 
    public void foo() 
    { 
     super.foo(); 
     System.out.ptintln("child::foo"); 
    } 
} 

您可以使用子類的任何地方使用父類,因爲所有的孩子都是家長的類型的。

當編譯器看起來這段代碼:

Parent p = new Child(); 

它確認該兒童伸出或實現了父。

當編譯器着眼於這樣的代碼:

p.foo(); 

它驗證該p被聲明爲,Parent類型,具有foo方法。

在運行時執行p.foo()線的時候,虛擬機着眼於p實際上指向,Child類型,並查找那裏爲foo方法。假設foo方法在Child中找到,它會運行它,否則它將查找Parent類。

在父類時foo方法調用bar編譯器將再度向確保該Parent類有一個bar方法。在運行時,VM再次查找Child類,查找bar方法,並且由於它不調用Parent中的那個。

如果該方法不存在於Parent那麼它們必須存在於父類Parent中,一直到java.lang.Object

+1

因爲我認爲這是知識缺失的一部分,因爲我實際上已經測試過,但我想確保我沒有犯過一些錯誤。最後,因爲這是深入理解語言的好方法。非常感謝你。 –

+0

真的很清楚,謝謝。 –

1

要回答你的問題採取這種例子在這裏:

package test; 

public class Parent 
{ 
    public void printFoo() 
    { 
     System.out.println("foo"); 
    } 

    public void printBar() 
    { 
     System.out.println("bar"); 
    } 
} 

package test; 

public class Child extends Parent 
{ 
    @Override 
    public void printFoo() 
    { 
     System.out.println("myFoo"); 
    } 
} 

package test; 

public class Main 
{ 
    public static void main(String ... args) 
    { 
     Parent test = new Child(); 
     Parent test2 = new Parent(); 

     print(test); 
     print(test2); 
    } 

    public static void print(Parent parent) 
    { 
     if (parent instanceof Parent) 
     { 
      System.out.println(parent.getClass().getName()+" is Parent"); 
      parent.printFoo(); 
      parent.printBar(); 
     } 
    } 
} 

正如你可以看到兒童從父繼承並重寫printFoo()方法。在打印這些父對象,你會得到下面的輸出:

test.Child is Parent 
myFoo 
bar 
test.Parent is Parent 
foo 
bar 

因此,要回答你的問題:
1)是
2),它會調用父類的方法
3)它會調用重寫方法 - 如果此方法包含超級調用,則父級的方法也將執行
4)否 - 如果指定了fe Parent o = new Child()並且在Parent中不存在的Child中實現一個方法,並且您想要調用該子對象的方法,則必須將其轉回Child ((Child)o).invokeYourMethod()