2016-09-29 2 views
0

У меня возникло сомнение при рассмотрении переопределения функций в java.Как статическое наследование методов и наследование статической переменной различаются?

Рассмотрим следующий код:

class Vehicle { 
    static int speed = 50; 

    public static void display() { 
     System.out.println(speed); 
    } 
} 

class Jeep extends Vehicle { 
    int speed = 100; 

    void display() { //GETTING COMPILE TIME ERROR 
     System.out.println(speed);//will print speed of Bike 
    } 

    public static void main(String args[]) { 
     Jeep b = new Jeep(); 
     System.out.println(b.speed); 

    } 
} 

Я читал, что статические методы не могут быть переопределены.

Но в приведенном выше коде я объявил статическую переменную 'speed' в родительском классе Vehicle. И я создал переменную экземпляра с таким же именем «скорость» в дочернем классе. Я не получил ошибку времени компиляции, так как я изменил значение статической переменной «скорость» в дочернем классе.

Я столкнулся с проблемой времени компиляции при попытке переопределить метод отображения, в то время как я не получаю никаких ошибок при повторном объявлении переменной «скорость», хотя оба они статичны в родительском классе.

Что может быть причиной того, что speed переменной подкласса скрывает статический speed переменного родительского класса, но не делать то же самое с помощью метода display и показывать компиляции ошибки времени?

+0

Что вы спрашиваете о? Поля или методы экземпляра? 'speed' или' display'? (Это важно.) –

+0

вы ничего не меняли статической переменной 'speed' в дочернем классе? – SomeJavaGuy

+0

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

ответ

3

static Функции не являются частью конкретного объекта объекта и полиморфизм на самом деле не имеет особого смысла, если он не применяется к объекту.

Вот почему вы не можете переопределить функцию static.

1

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

Теневое поле указывает, что он не наследуется подклассом, а подкласс объявил поле с тем же именем в своей области.

Скрытие поля не влияет на его значение в суперклассе. Для доступа к скрытому полю просто используйте super.fieldname (Vehicle.speed в вашем случае с момента его статического).

Поля не могут быть скрыты, но только скрыты в java.

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

А почему статические поля не могут быть переопределены Вирсавии предоставил отличный ответ на свой вопрос почте или обратитесь Why doesn't Java allow overriding of static methods?

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