Что-то странное происходит с человеком - PullRequest
2 голосов
/ 17 июня 2011

В следующем коде Java

public class Person {
    int age = 18;
}

class Student extends Person {
    public Student() {
        this.age = 22;
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.doSomthing();
    }

    void doSomthing() {
        System.out.println(this.age);
        System.out.println(super.age);// Here is something weird, at least for me till rightNow()
    }
}  

Почему значение super.age равно 22, то же значение, что и возрастное значение подкласса, не должно ли оно быть 18;
Любая помощь приветствуется.
Заранее спасибо.

Ответы [ 8 ]

7 голосов
/ 17 июня 2011

Возраст - это поле в суперклассе. В конструкторе подкласса, когда вы говорите this.age = 22, вы обновляете переменную экземпляра в суперклассе.

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

public class Person {
    int age = 18;
}

class Student extends Person {

    int age; // Hides the super variable

    public Student() {
        this.age = 22;
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.doSomthing();
    }

    void doSomthing() {
        System.out.println(this.age);
        System.out.println(super.age);
    }
}  
4 голосов
/ 17 июня 2011

это ведет себя так, как вы ожидаете. Вы не объявили возрастного элемента Student, поэтому this.age, естественно, ссылается на age, определенный в суперклассе.

Приведенный ниже код обеспечит ожидаемое поведение (хотя такие переменные часто являются очень плохой идеей).

public static class Person {
    int age = 18;
}

public static class Student extends Person {
    int age = 18;

    public Student() {
        this.age = 22;
    }

    void doSomthing() {
        System.out.println(this.age);
        System.out.println(super.age);
    }
}
2 голосов
/ 17 июня 2011

Нет, это правильно.В конструкторе вы переопределяете возраст суперкласса.Вместо этого вы можете сделать что-то вроде этого:

public class Person {
    public int getAge() {
        return 18;
    }
}

class Student extends Person {
    public Student() {
    }

    @Override
    public int getAge() {
        return 22;
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.doSomthing();
    }

    void doSomthing() {
        System.out.println(this.getAge()); //22
        System.out.println(super.getAge()); //18
    }
}  
1 голос
/ 17 июня 2011

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

1 голос
/ 17 июня 2011

В этом источнике this и super - это одна и та же переменная экземпляра, поскольку вы определяете ее в суперклассе, унаследованном в подклассе.

При создании ученика вы инициализируете его до 22 ивот и все.

1 голос
/ 17 июня 2011

Нет, все происходит правильно. Когда вы создаете подкласс (Student является подклассом Person), этот подкласс наследует все поля (переменные) из суперкласса. Однако существует только один набор переменных: существует только одно значение для возраста, даже если оно наследуется. Другими словами, когда класс наследует поле, он не создает его новую копию - на одного учащегося приходится только одна копия.

1 голос
/ 17 июня 2011

Ученик наследует возраст от родителя, поэтому нет разницы между возрастом и возрастом. 1001 *

0 голосов
/ 17 июня 2011

Вы устанавливаете age в своем классе Student, но родительский объект, который объявляет age, имеет общую переменную, поэтому имеет смысл изменить значение.Однако переопределенные методы будут другими.

...