2017-03-03 64 views
2

當2個類創建爲超類和子類時。如果其中一個對象被聲明爲具有不同的引用,那麼會發生什麼不同的工作?Java,從不同引用初始化對象時會有什麼不同?

class SubClass extends SuperClass 

SubClass s1 = new SubClass(); 
SuperClass s2 = new SubClass(); 

比較下一個

class SubClass extends SuperClass 

SubClass s1 = new SubClass(); 
SubClass s2 = new SubClass(); 
+1

多態性... –

+0

在第一種情況下,你只可以調用's2'上'SuperClass'定義的方法。 –

+0

我不確定多態性是做什麼的。這是方法的超越能力嗎? –

回答

2

類子類來擴展超類

1)子類S1 =新的子類();

2)SuperClass s2 = new SubClass();

第一個解釋: -

S1是子類的refernce並持有子類的對象,是因爲我們有子類方法擴展了超類方法,它會調用子類的方法,以及超一流所以超類方法會自動提供給子類。我們可以藉助s1調用超類和子類方法。

的第二個解釋: -

S2是父類的refernce並持有子類的對象,所以這裏有兩個情況下,我們不得不考慮 我)方法重載: - 方法重載是在編譯時處理所以它總是會調用超類的方法

ii)方法重寫: - 方法重寫是在運行時處理,所以它總是調用子類的方法。這個概念來自多態。

SubClass s1 = new SubClass();

SubClass s2 = new SubClass();

s1和s2都是子類的引用,並且保存了子類的對象,所以在這兩種情況下都會調用子類對象。

-1
SubClass s1 = new SubClass(); 
SuperClass s2 = new SubClass(); 

s2你只能調用在SuperClass聲明的方法。 在s1上,您可以調用SuperClass中聲明的方法以及​​中聲明的方法。

+0

@Downvoter:爲什麼downvote? – Chris311

2

多態性的好處是能夠有多個實現。正如你可以從下面的代碼看到那個函數letsHear接受任何類型的Animal。所以這種方法是不可知的,它不關心你傳遞的是什麼類型的動物。

abstract class Animal { 
    abstract String talk(); 
} 

class Cat extends Animal { 
    String talk() { 
     return "Meow!"; 
    } 
} 

class Dog extends Animal { 
    String talk() { 
     return "Woof!"; 
    } 
} 

void letsHear(final Animal a) { 
    println(a.talk()); 
} 

int main() { 
    letsHear(new Cat()); 
    letsHear(new Dog()); 
} 

具體實現可以分配給它的父項。

Animal cat = new Cat(); 
Animal dog = new Dog(); 

如果來自示例方法letsHear以上只接受Cat那麼你將需要具有它接受Dog另一種方法。

1

請儘量使用最高等級的課程。它給你更多的靈活性,讓你有可能在稍後切換子類。如果你只是在本地使用它,這不是什麼大事,你可能會改變整個定義而沒有任何副作用,但即使使用SuperClass也會更好。這將表明在這種情況下您只需要在SuperClass中定義的功能,這是重要的部分。

它在參數中更重要。想象一下,java標準庫開發人員會定義Collections方法來獲取像ArrayList這樣的子類。不僅需要更多的代碼來處理Collection接口的每個SubClass,一旦創建了一個新的子類,它將不完整。

摘要:總是問你自己你真的需要哪些功能來完成你的操作以及需要哪個超類。是列表嗎?採集?也許Iteratable?採取最抽象的一個。

1
  1. 調用方法的工作方式不同,如果在子類中聲明的方法不存在於超類中,那麼它們對超類的引用變量不可見。但你仍然可以通過向下轉換來調用它們,閱讀關於靜態和動態多態的更多信息,
  2. 調用靜態方法的工作方式不同。檢查示例。

    public class BaseClass { 
    
    public void compileSomeThing(){ 
    System.out.println("Base Method "); 
    } 
    public static void doSomething(){ 
    System.out.println("Base static method"); 
    } 
    } 
    

    基類

    public class SubClass extends BaseClass{ 
    
    public void compileSomeThing(){ 
    System.out.println("Sub Method"); 
    
    } 
    public static void doSomething(){ 
    System.out.println("Sub static method"); 
    } 
    } 
    

    子類。 和主類:

    public static void main(String[]args){ 
    BaseClass bs = new SubClass(); 
    SubClass bs1 = new SubClass(); 
    bs.compileSomeThing(); 
    bs.doSomething(); 
    System.out.println(".........."); 
    bs1.compileSomeThing(); 
    bs1.doSomething(); 
    

    }彙編

結果:

Sub Method 
    Base static method 
     .......... 
    Sub Method 
    Sub static method 
  • 進一步瞭解:方法,重載,方法覆蓋和方法隱藏。 http://www.javatpoint.com/method-overloading-in-javahttp://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/ http://crunchify.com/java-method-hiding-and-overriding-override-static-method-in-java/
  • 相關問題