2010-11-01 51 views
3

超一流的價值我有2類:獲得的Java

public class A 
{  
    int n = 10;  

    public int getN() 
    { 
     return n; 
    }  
} 

public class B extends A 
{  
    int n = 20; 

    public int getN() 
    { 
     return n; 
    } 
} 

public class Test 
{  
    public static void main(String[] args) 
    {   
     B b = new B(); 
     System.out.println(b.getN()); //--> return 20 
     System.out.println(((A)b).getN()); //--> still return 20. 
              //How can I make it return 10? 
    } 
} 

回答

0

你看到的是多態的行動。由於bB,因此總是調用該方法(返回20)(無論您是否將其轉換爲A)。

5

Java中的所有方法都是虛擬的。也就是說,沒有辦法從外部調用方法的「超級」版本。投射到A將無濟於事,因爲它不會更改對象的運行時類型。

這可能是你最好的選擇/解決方法:

class A { 

    int n = 10; 

    public int getN() { 
     return n; 
    } 

    public final int getSuperN() { // "final" to make sure it's not overridden 
     return n; 
    } 
} 


class B extends A { 

    int n = 20; 

    public int getN() { 
     return n; 
    } 
} 

public class Main { 

    public static void main(String[] args) { 
     B b = new B(); 
     System.out.println(b.getN());  // --> return 20 
     System.out.println(((A)b).getN()); // --> still return 20. 
     System.out.println(b.getSuperN()); // --> prints 10 
    } 
} 
1

這件事不會因多態性工作。即使您將其投入超類,B類仍然是B類。

我認爲你需要像這樣:

public class B extends A 
{ 

    int n = 20; 

    /** 
    * @return the super n 
    */ 
    public int getSuperN() 
    { 
     return super.n; 
    } 
} 
1

你不能讓值是「10」,因爲對象的實例是爲B級,當你這樣做的投只有你正在做的是改變定義類而不是設置對象B的值,換句話說,如果你需要得到它的'這樣的東西'

b = new A();