Что значит сказать "переменные экземпляра не перегружены" в 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
,