调用超级方法时,我指的是什么?

When invoking the super method, what is i referring to?

我正在尝试学习 super 的概念。有人可以告诉我 super(i) 中的 i 指的是什么吗?

NaturalNumberclass中的私有int变量i吗? NaturalNumber?里面的参数是指别的东西吗?我对语法很困惑。

 class NaturalNumber {

    private int i;

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

class EvenNumber extends NaturalNumber {

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

在你的例子中,它是 EvenNumber 的构造函数参数。调用 super(i) 将构造函数参数传递给超类构造函数(按值,因为它是原始类型)。然后超类构造函数将该值存储在私有字段中。

当你调用super(i)时,它会调用superclass的构造函数。 super关键字指的是superclass(父class)。在这种情况下,您的 EvenNumber 的 superclass 是 NaturalNumber,因为 Even number extends NaturalNumber。所以基本上,说 super(i) 你就是说 NaturalNumber(i).

super(arguemnts) 是对传递 arguments.
的超级class 构造函数的调用 在 class EvenNumber extends NaturalNumber 的情况下,它是确保您的 class 的 NaturalNumberness 的机制。

在这种情况下发生的情况是,您传递给 superclass 构造函数的值与您通过 public EvenNumber(int i) 传递给 EvenNumber class 的值相同。因此它将初始化 private int i 字段(您无法从 EvenNumber 直接访问它,因为它是私有的)。

如果我们稍微重命名变量,也许您会更好地看到它:

class NaturalNumber {

    private int value;

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

class EvenNumber extends NaturalNumber {

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

因此,当您通过 new EvenNumber(2) 创建 EvenNumber 的实例时, EvenNumber(int oddValue) 构造函数中发生的第一件事是 super(2) ,它将调用 NaturalNumber(int naturalValue) 构造函数并通过2 到它,最终将 int value 设置为 2

class NaturalNumber {

private int i;

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

class EvenNumber extends NaturalNumber {

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

考虑上面的代码。此代码与您的代码执行完全相同的操作。我更改了变量名以使其清楚。所以,当你调用 super(y) 时,它所做的就是调用它的父 class 的构造函数,即 NaturalNumber(i),y 的值被传递给这个构造函数,在这个构造函数中你是将变量 i 的值设置为传递给构造函数的值。

所以当我们调用 super(int) 时,它所做的是将一个整数值传递给父 class 的构造函数。 此外,要设置父级 class 的一些变量,我们可以执行 super.i=10 ,这会将父级 class 中的变量 'i' 设置为 10。

super() 应该使用与 super-class 的构造函数相同的参数调用,因为它做的事情完全相同。例如:

    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*/
        }
    }

希望对您有所帮助。

super 表达式中的 i 排他地 引用 NaturalNumber 中的局部变量 i class。它不会进一步扩大其范围。