2014-12-24 2 views
0

Эта концепция противоречит концепции class и ее экземпляра.Запрос на скрытие поля в java

Ниже программа, которая выглядит хорошо для меня и дает NullPointerException, как ожидалось:

class SuperClass{ 
    int x = 2; 
} 

class SubClass extends SuperClass{ 
    int x = 4; 
} 

public class Dummy2 { 

    public static void main(String[] args){ 
     SubClass obj1 = new SubClass(); 
     SuperClass obj2 = null; 
     System.out.println(obj1.x); 
     System.out.println(obj2.x); 
    } 

} 

Но когда я говорю SuperClass obj2 = obj1; странно я вижу значение стоимости члена SuperClass экземпляра 2, несмотря нет ни одного примера class SuperClass, созданный в вышеуказанной программе.

Действительно ли это действующая концепция на Java?

+0

Как вы можете получить доступ к полю того, что не существует ('null')? – August

ответ

7

Во-первых, поскольку obj2 - это null в вашем примере, он, конечно, бросит NPE при попытке доступа к нему x.

Во-вторых, при установке obj2 = obj1, вы бросаете obj1, типа SubClass, чтобы ввести SuperClass. Когда вы затем получаете доступ к x в obj2, вы получаете доступ к x, о котором SuperClass знает, что имеет значение 2. Так оно и должно работать.

Причина в том, что x в SubClass не переписывает x в SuperClass. Он просто скрывает это. Поэтому, когда obj1 отлита до типа SuperClass, x в SuperClass теперь видна x.

Если вы хотите получить значение x, которое, как вы ожидаете, просто используйте getter вместо прямого доступа к x, а затем вы можете переопределить его в SubClass.

SuperClass:

public class SuperClass { 
    public int x = 2; 

    public int getX() { 
     return x; 
    } 
} 

Подкласс:

public class SubClass extends SuperClass { 
    public int x = 4; 

    public int getX() { 
     return x; 
    } 
} 

тестовый код:

SubClass obj1 = new SubClass(); 
SuperClass obj2 = obj1; 

System.out.println(obj2.x);  // outputs 2 
System.out.println(obj2.getX()); // outputs 4 
+2

Да. Для OP акцент делается на ** Это просто скрывает это **, это ответ в двух словах. –

+0

Я понимаю, что поле «SubClass» затеняет поле «SuperClass». Вопрос в том, в чем заключается необходимость предоставления такого языка для «полей», в отличие от «методов». «преодоление» имеет больше смысла как для «методов», так и для «полей» с точки зрения языка. Поскольку вопрос о более сильном всегда остается таким, как получить доступ к значению члена экземпляра, прежде чем создавать экземпляр «SuperClass»? Это то, что я упомянул в первой строке запроса. Количество вскрытий, по-видимому, указывает на то, что люди принимают это как должное, независимо от того, что предоставляет java бесплатно. – overexchange

+0

Но вы создали экземпляр «SuperClass».'SubClass' расширяет' SuperClass', поэтому 'obj1' является экземпляром' SuperClass', а также 'SubClass'. – forgivenson

0

Это справедливо в Java, и многие другие языки сильно типизированных. Когда вы повышаете переменную до суперкласса, вы можете использовать только свойства этого класса. Это делает переменную строго типизированной. Означает, что у вас есть переменная типа, которую вы можете использовать независимо от типа экземпляра. Тип переменной важен, к которому у вас есть доступ.

Смежные вопросы