Как переопределяются переменные - PullRequest
1 голос
/ 24 января 2012
package com.mycompany.myproject.mypkg;

interface MyInterface {
    public static final int k = 9;
}

class MyClass implements MyInterface {
    // int k = 89;
}

public class SampleThree extends MyClass {
    static int k = 90;

    public static void main(String args[]) {
        MyClass object = new SampleThree();
        System.out.println(object.k);
    }
}

Почему вышеуказанная программа выводит '9' вместо '90'?

Как статические переменные и переменные-члены переопределяются в Java?

Ответы [ 5 ]

5 голосов
/ 24 января 2012

Потому что поля не поддерживают полиморфизм. MyClass.k равно 9object относится к MyClass). SampleThree.k даст вам 90. Каждый класс имеет свой набор переменных.

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

1 голос
/ 24 января 2012

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

Что вы можете сделать, это перегрузить поле, а не переопределить. Для этого вам нужно определить эту переменную вне интерфейса, чтобы дать им разные значения.

0 голосов
/ 24 января 2012

Вы создаете ссылочную переменную MyClass.Так что если вы используете эту переменную, вы получите доступ к k, тогда она покажет переменную интерфейса.Если вы хотите получить доступ к переменной со значением 90, создайте ссылочную переменную класса SampleThree.

0 голосов
/ 24 января 2012

Концепция переопределения не применима к переменным (следовательно, правила переопределения). Значение всегда основывается на ссылочном типе, но не на объекте времени выполнения.

Вот почему ваша программа печатает 9, потому что ссылочный тип объекта - MyClass, а MyClass наследуется k, значение которого равно 9. Поведение одинаково независимо от модификатора static (k) . Если вы раскомментируете строку в MyClass, то выход всегда будет 89.

0 голосов
/ 24 января 2012

У вас есть статическая переменная k в интерфейсе MyInterface. Вы реализовали этот интерфейс в классе MyClass, тогда MyClass.k должно быть 9.

Объект ссылается на MyClass. SampleThree.k даст вам 90.

Или просто:

Статическая переменная не может быть переопределена.

Правила переопределения статических переменных и переменных и методов:

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