在子类中使用 "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
也不例外。
- 表示'this object'。这里只有一个对象:Dog 类型的对象。没有 'a Dog object',里面包含一个单独的 'Animal super object'。它不是这样工作的。只有 Dog 对象,它包含所有字段 - 您在 Dog 中定义的任何字段,以及您在 Animal 中定义的任何字段。
因此,this.someFieldDefinedInYourSuperClass = foo;
可以,也有道理。
- 它也意味着: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
参数的值”。
我想了解 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
也不例外。
- 表示'this object'。这里只有一个对象:Dog 类型的对象。没有 'a Dog object',里面包含一个单独的 'Animal super object'。它不是这样工作的。只有 Dog 对象,它包含所有字段 - 您在 Dog 中定义的任何字段,以及您在 Animal 中定义的任何字段。
因此,this.someFieldDefinedInYourSuperClass = foo;
可以,也有道理。
- 它也意味着: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
参数的值”。