2010-11-01 2 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

То, что вы видите полиморфизм в действии. Так как b - это B, этот метод (который возвращает 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, другими словами, если вам нужно получить 10 его «что-то вроде этого

b = new A(); 
Смежные вопросы