J'essaie d'apprendre le concept de super. Quelqu'un pourrait-il me dire à quoi se réfère i dans super(i)?

Est-ce la int variable i privée de la classe NaturalNumber? Est-ce le paramètre dans le NaturalNumber? Est-ce qu'il fait référence à autre chose? Je suis très confus par la syntaxe.

 class NaturalNumber {

    private int i;

    public NaturalNumber(int i) { this.i = i; }
    // ...
}

class EvenNumber extends NaturalNumber {

    public EvenNumber(int i) { super(i); }
    // ...
}
0
Thor 30 déc. 2015 à 04:44

6 réponses

Meilleure réponse

super(arguemnts) est un appel au constructeur de superclasse auquel vous passez arguments.
Dans le cas de class EvenNumber extends NaturalNumber, c'est un mécanisme qui garantit le NaturalNumber ness de votre classe.

Ce qui se passe dans ce cas, c'est que vous passez au constructeur de classe super la même valeur que celle que vous avez passée à la classe EvenNumber via public EvenNumber(int i). Il initialisera donc le champ private int i (auquel vous n'avez pas d'accès direct depuis EvenNumber car il est privé).

Peut-être que vous le verrez mieux si nous renommons un peu les variables:

class NaturalNumber {

    private int value;

    public NaturalNumber(int naturalValue) {
        this.value = naturalValue;
    }
    // ...
}

class EvenNumber extends NaturalNumber {

    public EvenNumber(int oddValue) {
        super(oddValue);
    }
    // ...
}

Ainsi, lorsque vous créez une instance de EvenNumber via new EvenNumber(2), la première chose qui se passe dans le constructeur EvenNumber(int oddValue) est super(2) qui invoquera le constructeur NaturalNumber(int naturalValue) et passera 2 à lui, qui définira finalement int value sur 2.

2
Pshemo 30 déc. 2015 à 02:57

Dans votre exemple, il s'agit du paramètre constructeur d'EvenNumber. L'appel super(i) passe le paramètre du constructeur au constructeur de la superclasse (par valeur, car c'est une primitive). Le constructeur de la superclasse stocke ensuite cette valeur dans un champ privé.

3
sisyphus 30 déc. 2015 à 01:47

Le super() est supposé être appelé avec les mêmes paramètres que le constructeur de la super-classe, car il fait exactement la même chose. Par exemple :

    class Person {
        private name;

        public Person(String name) {
            this.name = name;
        }

        public Person() { /* Empty constructors initialize with default values,
                              i.e in this case name is initialized with null*/
        }
    }

    class Employee extends Person {
        private double salary;

        public Employee(double salary) {
            super("Michael");
            this.salary = salary;
            /* That means that the emplyee which is created is a person
               who's name is "Michael"*/
        }

        public Employee(double salary) {
            super();
            this.salary = salary;
            /* That means that the emplyee which is created is a person
               who's name is null as the empty constructor initialized it*/
        }
    }

J'espère que cela vous a aidé.

-1
Khalil Hamani 30 déc. 2015 à 02:02
class NaturalNumber {

private int i;

public NaturalNumber(int x) { this.i = x; }
// ...
}

class EvenNumber extends NaturalNumber {

public EvenNumber(int y) { super(y); }
// ...
}

Considérez le code ci-dessus. Ce code fait exactement la même chose que votre code. J'ai changé les noms des variables pour que ce soit clair. Ainsi, lorsque vous appelez super (y), ce qu'il fait, c'est appeler le constructeur de sa classe parent, qui est NaturalNumber (i), la valeur de y est transmise à ce constructeur, et à l'intérieur de ce constructeur, vous définissez la valeur de la variable i égal à la valeur transmise au constructeur.

Ainsi, lorsque nous appelons super (int), il transmet une valeur entière au constructeur de la classe parent. De plus, pour définir une variable d'une classe parent, nous pouvons faire super.i=10 qui définira la variable 'i' dans la classe parent à 10.

1
Anoop Kanyan 30 déc. 2015 à 02:00

Le i dans l 'super expression se réfère exclusivement à la variable locale i à l'intérieur de votre classe NaturalNumber. Il n'étend pas sa portée au-delà de cela.

1
Makoto 30 déc. 2015 à 02:04

Lorsque vous appelez super(i), il appellera le constructeur de la superclasse. Le mot clé super fait référence à la superclasse (classe parente). Dans ce cas, la superclasse de votre EvenNumber est NaturalNumber car le nombre pair s'étend NaturalNumber. Donc, fondamentalement, en disant super(i) vous dites NaturalNumber(i).

1
Kevin Kang 30 déc. 2015 à 01:52