Что значит сказать "переменные экземпляра не перегружены" в Java?

Я в курсе концепции под названием field hiding в Яве. Но, тем не менее, у меня возникает путаница в том, что переменная экземпляра не перегружена.

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

И я прочитал похожую вещь для field hiding по ссылке:- Сокрытие полей

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

Я в замешательстве, пожалуйста, помогите.


Я использую следующий суперкласс:-

public class Animal{
File picture;
String food;
int hunger;
int width, height;
int xcoord, ycoord;

public void makeNoise(){
.........
}

public void eat(){
.............
}

public void sleep(){
..........
}

public void roam(){
.............
}

}

У него есть подклассы, такие как тигр, кошка, собака, бегемот и т. Д. Подклассы переопределяют метод makeNoise(), eat и roam().

Но каждый подкласс также использует различный набор значений для переменных экземпляра.

Так что из-за моей путаницы я как бы переопределяю все переменные экземпляра и 3 метода суперкласса Animal; и у меня все еще есть переменные экземпляра суперкласса, доступные для подкласса с использованием super ключевое слово.

3 ответа

Решение

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

Ну, перегрузка обычно относится к перегрузке функции / метода, которая

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

Видите ли, термин относится к функциям / методам, а не к переменным экземпляра (полям). Последний не может быть перегружен или переопределен. Смотрите, например, этот вопрос.

Что касается вашего примера: на самом деле вы не переопределяете поля предка, а скрываете их.

Пример:

class Human {
    String name;
    int age;

    public Human(String n, int a) {
        this.name = n;
        this.age = a;
    }

    public void tell_age() {
        System.out.println("I am "+this.age);
    }
}

class Female extends Human {
    // We want to HIDE our real age ^^
    String age = 'not too old';

    public Female(String n, int a) {
        this.name = n;
        super.age = a;
    }

    // We override the parent's method to cloak our real age,
    // without this, we would have to tell our true age
    public void tell_age() {
        System.out.println("I am "+this.age);
    }

    // Ok, we give in, if you really need to know
    public void tell_true_age() {
        System.out.println("I am "+super.age);
    }
}
public static void main(String[] args) {
    Female Jenna = new Female('Jenna', 39);

    Jenna.tell_age(); // => I am not too old
    Jenna.tell_true_age(); // I am 39
}

В общем, мы используем override описать методы, но не поля. Но вы бы сказали, что у них похожее поведение.

  • когда они имеют одинаковое имя поля / подпись метода
  • подкласс один всегда будет переопределять суперкласс, если вы не используете super,
Другие вопросы по тегам