在子类中使用 "this"/"super" 都给出超类的字段,但在子类构造函数中只允许使用 "super"

Using "this"/"super" in the subclass both give superclass's fields but only "super" is allowed in subclass constructor

我想了解 this 和 super 在 subclass 方法和 subclass 构造函数中的用法:

超级class:

public class Animal {
    protected String name;
    protected String age;

    public Animal(String name, String age) {
        this.name = name;
        this.age = age;
    }
}

subclass方法中使用的this和super关键字:

public class Dog extends Animal {

    public Dog(String name, String age) {
        super(name, age);
    }

    public void display() {
        this.name = "Doggy";
        super.age = "20";
        System.out.println(this.name + " is " + super.age + " years old");
    }
}

上述案例中的“this”和“super”有什么区别?为什么在 subclass 构造函数中我们不能使用“this”来初始化从 superclass 继承的字段,如下例所示,但我们可以使用 super() 来初始化 superclass?

中的相同字段
public class Dog extends Animal {

    public Dog(String name, String age) {
        this.name = name;
        this.age = age;
    }
...
}

使用 this -> 您指向当前对象,更准确地说是指向将从当前 class 创建的对象。使用 super,您可以从父 class 访问字段,在这种情况下 Animal。更准确地说,是的,您可以使用 super 访问 age 参数,因为它是在 Animal(父级 class)中定义的,但是所有要访问的字段在 Dog 中定义的应该用 this 指向。另请注意,在 Dog 的构造函数中,您必须调用 super,因为您在 Animal 中定义了构造函数,表示这些字段将在创建对象时设置,并在 Dog 中再次设置你在给他们价值观。

display()中不需要this.super.。仅当子 class 声明的成员变量与超级 class:

同名时才需要它们
public static class Animal {
    protected String name;
    protected String age;

    public Animal(String name, String age) {
        this.name = name;
        this.age = age;
    }
}
public static class Dog extends Animal {

    protected String name;   // These are different from the ones
    protected String age;    // in Animal

    public Dog(String name, String age) {
        super(name, age);
        this.name = "Something else";
        this.age = "123";
    }

    public void display() {
        super.name = "Doggy";  // Need super. to differentiate from Dog class's name
        this.age = "20";
        System.out.println(this.name + " is " + this.age + " years old");
        System.out.println(super.name + " is " + super.age + " years old");
    }
}

public static void main (String[] args) throws java.lang.Exception
{
    Dog dog = new Dog("Sparky", "3");
    dog.display();
}

输出为:

Something else is 20 years old
Doggy is 3 years old

this,关键字有两个独立的作业。

这就像 + 在 java 中表示两个 完全不同的 不同的东西:5 + 2 做整数加法,"foo" + "bar"做字符串连接。相同的符号,2 个不相关的工作。在英语中,bank这个词既有临江之地的意思,也有金融机构的意思。同样的话,2 个不相关的工作。

this也不例外。

  1. 表示'this object'。这里只有一个对象:Dog 类型的对象。没有 'a Dog object',里面包含一个单独的 'Animal super object'。它不是这样工作的。只有 Dog 对象,它包含所有字段 - 您在 Dog 中定义的任何字段,以及您在 Animal 中定义的任何字段。

因此,this.someFieldDefinedInYourSuperClass = foo;可以,也有道理。

  1. 它也意味着:Select一个构造函数。此版本的 this 关键字总是在紧跟关键字之后带有括号。 this(params); 就是它的样子,它允许您从另一个构造函数调用一个构造函数。 super() 是一个类似的结构,可以让你调用你的超级构造函数之一。请注意,所有构造函数都必须使用其中之一;如果你没有这样做,编译器会在你的构造函数中静默地注入 super(); 作为第一行。

示例:

public Student(LocalDate birthDate, String name) {
  this(generateNewStudentId(), birthDate, name);
}

public Student(String id, LocalDate birthDate, String name) {
  this.id = id;
  this.birthDate = birthDate;
  this.name = name;
}

这里的第一个用法很简单:使用提供的值调用另一个构造函数。第二种(以及第三种和第四种)用法是 'it is this object' 变体。

在您的示例中,您使用 super(name, age);。这会从您的超类调用 public Animal(String name, int age) 构造函数。它不会“设置姓名和年龄”——它会调用该构造函数。该构造函数的作用是什么?谁知道 - 你必须检查来源。也许构造函数首先从扬声器中播放 Feliz Navidad。您碰巧知道它 'just' 确实 this.name = name; this.age = age; 但这只是因为那是当前 Animal.java.

中的内容

相反,this.name = name;表示“将此对象的name字段的值设置为name参数的值”。