2013-04-10 2 views
0
public class A 
{ 
    public static int i; 
} 
public class B extends A 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("print i=" + B.i); // referred to A.i 
    } 
} 

Мой вопрос: как B.i относится к A.i?Статические переменные в наследовании

Если статическая переменная i наследуется, почему java позволяет определить другую переменную i в классе B также?

ответ

1

Публичный или защищенный член A показан во всех подклассах A.

Если статическая переменная i наследуется, почему java позволяет также определить другую переменную i в классе B?

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

Обратите внимание, что, если вы определяете другой i в B, он будет теньA.i, что затрудняет доступ к последним. I've seen people expecting this to behave polymorphically, но это не так (ваш случай немного отличается, так как A.i - static).

+0

Интересная цитата «Трудно рассуждать о том, почему. Одна из возможных причин заключается в том, что это позволяет добавлять членов в базовый класс, не нарушая никаких производных классов, которые уже имеют член с тем же именем». , Это то, что я не рассматривал. –

0

есть 2 разных предмета, область видимости и видимость. вы не можете переопределить переменную в том же объеме дважды (хотя вы можете переопределить их во вложенных областях).

Но в случае наследования подкласс выходит за рамки суперкласса, но все же имеет видимость для этой переменной из-за наследования. Таким образом, подкласс позволяет снова определить переменную i, хотя она скроет переменную суперкласса. вы не сможете увидеть его ценность. (если не используется какой-либо геттер из суперкласса)

0

Java позволяет вам изменять значение переменной для расширенного класса.

Это связано с тем, что статические переменные совместно используются всеми объектами того же класса. Это переменная, которая принадлежит классу, а не объекту (экземпляру).

Таким образом, при расширении статических переменных родительского класса фактически не являются частью расширенного класса, но доступны (если они не являются частными).

Кроме того, это может быть использовано, чтобы делать такие вещи, как:

  • , используя различную СТАТИЧЕСКУЮ КОНСТАНТУ для расширенных классов.

Использование для этого состоит в том, чтобы идентифицировать классы, основанные на значении STATIC, как показано на примере использования instanceof. Это может быть дополнительно объединено с переключателем для изменения поведения на основе типа объектов.

Итак, в самом базовом примере представьте, что мы хотим создать переменную, представляющую TYPE.

class A 
{ 
    public static final int NODE_TYPE = NODE_PERSON; 
    public static final int NODE_PERSON = 0; 
    public static final int NODE_CAR = 1; 

} 

class B extends Class A 
{ 
    public static int NODE_TYPE = NODE_CAR; 
} 

Это используется во многих структурах, включая Eclipse, абстрактные синтаксические дерева:

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FASTNode.html

Вы увидите список СТАТИЧЕСКИХ ЦЕЛЫХ ЧИСЕЛ, которые представляют различные типы узлов.

1

Я здесь статическая переменная. Статическая переменная в терминах непрофессионала означает, что к одной копии обращаются все классы. Таким образом, поскольку ваш класс B расширяет A, B имеет доступ к статической переменной A.

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

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