this 是指在子类对象上调用非重写方法时的情况?
this refers to what when a non-overridden method is invoked on a subclass object?
考虑以下代码:
class Person {
String className = "Person";
void printClassName () {
System.out.println("I am " + this.className);
System.out.println("I am " + this.getClass().getSimpleName());
}
}
class Employee extends Person {
// intentionally hiding this field
String className = "Employee";
}
public class App {
public static void main(String[] args) {
Employee raghu = new Employee ();
raghu.printClassName();
}
}
我有几个问题。
创建子类对象时,实际创建了多少个对象?只有一个,通过引入子类中定义的新属性来扩展超类的属性?或者二,我们有权访问的子类对象和超类对象,其存在对我们隐藏?
如果创建两个对象,在子类对象上调用非覆盖方法时,哪个对象负责?换句话说,this
在非重写方法中指的是什么?隐藏超类对象还是子类对象?
如果你对 #2 的回答是超类的隐藏对象,那么为什么上面的代码在 printClassName
.[=17 中打印 "I am Employee"
for System.out.println("I am " + getClass().getSimpleName());
=]
如果你对 #2 的回答是子类的对象,那么为什么 printClassName
中的第一行打印 "I am Person"
?
您将变量声明为 Employee
类型
this.className
指的是那个class中的className
。
this.getClass().getSimpleName()
this.getClass()
returns class Employee
,因为这是你声明变量的方式,这就是为什么 getSimpleName()
returns "Employee"
child class Employee 中的字段 className 是额外的第二个字段,与字段 className in Person 同名;这称为 阴影。 字段没有继承。
(大概知道。)
class Employee extends Person { // Manner to change the super field
Employee() {
className = "Employee";
}
}
new Employee()
创建一个 object 包含两个 className 字段。它调用超级构造函数,进行字段初始化,并执行其余的构造函数代码。
this
总是唯一的 object,可能是某些 child class。所以 Person.this 实际上可能是雇员。
和 4. this.className
Person for an Employee object 只需访问 Person 字段,因为字段没有继承。相比之下,方法 xxx()
将调用 child 大多数方法。
考虑以下代码:
class Person {
String className = "Person";
void printClassName () {
System.out.println("I am " + this.className);
System.out.println("I am " + this.getClass().getSimpleName());
}
}
class Employee extends Person {
// intentionally hiding this field
String className = "Employee";
}
public class App {
public static void main(String[] args) {
Employee raghu = new Employee ();
raghu.printClassName();
}
}
我有几个问题。
创建子类对象时,实际创建了多少个对象?只有一个,通过引入子类中定义的新属性来扩展超类的属性?或者二,我们有权访问的子类对象和超类对象,其存在对我们隐藏?
如果创建两个对象,在子类对象上调用非覆盖方法时,哪个对象负责?换句话说,
this
在非重写方法中指的是什么?隐藏超类对象还是子类对象?如果你对 #2 的回答是超类的隐藏对象,那么为什么上面的代码在
printClassName
.[=17 中打印"I am Employee"
forSystem.out.println("I am " + getClass().getSimpleName());
=]如果你对 #2 的回答是子类的对象,那么为什么
printClassName
中的第一行打印"I am Person"
?
您将变量声明为 Employee
this.className
指的是那个class中的className
。
this.getClass().getSimpleName()
this.getClass()
returns class Employee
,因为这是你声明变量的方式,这就是为什么 getSimpleName()
returns "Employee"
child class Employee 中的字段 className 是额外的第二个字段,与字段 className in Person 同名;这称为 阴影。 字段没有继承。
(大概知道。)
class Employee extends Person { // Manner to change the super field
Employee() {
className = "Employee";
}
}
new Employee()
创建一个 object 包含两个 className 字段。它调用超级构造函数,进行字段初始化,并执行其余的构造函数代码。this
总是唯一的 object,可能是某些 child class。所以 Person.this 实际上可能是雇员。和 4.
this.className
Person for an Employee object 只需访问 Person 字段,因为字段没有继承。相比之下,方法xxx()
将调用 child 大多数方法。