在继承的超级方法中返回 `this` class
Returning `this` in a super method of inherited class
假设我有 class A
和 class B
扩展 A
,
这是 classes:
答:
public class A {
public int x;
public static int y;
public A(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public static int getY() { return y; }
public A get1() { return this; }
public A get2() { return new B(x, y); }
}
乙:
public class B extends A {
public int x;
public B(int x, int y) {
super(x, y);
this.x = x*2;
this.y = y*2;
}
public int getX() { return x; }
public static int getY() { return y*3; }
public A get1() {
x++;
return super.get1();
}
public A get2() { return get1(); }
}
这是主要功能:
public static void main(String[] args) {
A a1 = new A(5, 10);
A a2 = a1.get2();
A a3 = a2.get2();
System.out.println("a1.x=" + a1.x);
System.out.println("a1.y=" + a1.y);
System.out.println("a2.x=" + a2.x);
System.out.println("a2.getX()=" + a2.getX());
System.out.println("a2.getY()=" + a2.getY());
System.out.println("((B)a2).getY()=" + ((B)a2).getY());
System.out.println("((B)a2).x=" + ((B)a2).x);
System.out.println("a3 is A: " + (a3.getClass() == A.class));
System.out.println("a3 is B: " + (a3 instanceof B));
System.out.println("a3==a2: " + (a3 == a2));
}
我的问题是 a2
和 a3
对象,
a3
基本上就是a2.get2()
,按照这个方法会达到A
get1()
的方法returns this
.
由于在 class A
中找到了该方法,我确信它只会 return 对对象 a2
的 A
部分的引用,而不是对整个对象的引用,
所以当我尝试这条线时:
a3.getClass() == A.class
我会得到 True
.
当我调试时 a3.getClass()
是 "class B"。
有人可以向我解释 return this
线在父亲 class 体内时的实际作用吗?
谢谢!
让我们一步一步地追踪语句:
a1
是对类型 A
. 的实例的引用
a1.get2()
调用 A
中的 get2()
方法,其中 return 是对类型 B
的实例的引用,因此 a2
指的是B
类型的实例。
a2.get2()
调用了B
中的get2()
方法。请记住,a2
是类型 B
的实例,因此 this
指的是 B
。
get2()
B
中的方法调用 B
中的 get1()
方法。 this
仍然指的是 B
.
get1()
B
中的方法调用 super.get1()
。这是它可能会有点混乱的地方。即使您从父 class 调用 get1
方法,this
仍然在运行时引用 B
。
- 因此,
super.get1()
returns B
。 get1()
在 B
return 中 B
。 get2()
在 B
return 中 B
。因此,a3
指的是类型 B
. 的实例
来自 java 文档 Object#getClass
public final Class getClass()
Returns the runtime class of this Object
getClass
方法 return 是一个对象的运行时 class 所以当你调用 getClass
对类型实例的引用时你会得到B
。如果 getClass
未设计为 return 实际实例类型,它将始终 returned Object
这将使该方法毫无意义。
关键字this
引用了当前对象实例。没有 "A part of the B object",即子类中没有对超类的引用。被继承的对象并没有被分成不同的部分;您实例化了一个对象,它被 this
从实例方法中引用,而不管这些实例方法在哪里声明。
所以你有一个 B 对象,并且 this
在 A 中声明的方法中。如果直接或间接地从 B 调用该方法,那么它将引用该 B 对象。
假设我有 class A
和 class B
扩展 A
,
这是 classes:
答:
public class A {
public int x;
public static int y;
public A(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public static int getY() { return y; }
public A get1() { return this; }
public A get2() { return new B(x, y); }
}
乙:
public class B extends A {
public int x;
public B(int x, int y) {
super(x, y);
this.x = x*2;
this.y = y*2;
}
public int getX() { return x; }
public static int getY() { return y*3; }
public A get1() {
x++;
return super.get1();
}
public A get2() { return get1(); }
}
这是主要功能:
public static void main(String[] args) {
A a1 = new A(5, 10);
A a2 = a1.get2();
A a3 = a2.get2();
System.out.println("a1.x=" + a1.x);
System.out.println("a1.y=" + a1.y);
System.out.println("a2.x=" + a2.x);
System.out.println("a2.getX()=" + a2.getX());
System.out.println("a2.getY()=" + a2.getY());
System.out.println("((B)a2).getY()=" + ((B)a2).getY());
System.out.println("((B)a2).x=" + ((B)a2).x);
System.out.println("a3 is A: " + (a3.getClass() == A.class));
System.out.println("a3 is B: " + (a3 instanceof B));
System.out.println("a3==a2: " + (a3 == a2));
}
我的问题是 a2
和 a3
对象,
a3
基本上就是a2.get2()
,按照这个方法会达到A
get1()
的方法returns this
.
由于在 class A
中找到了该方法,我确信它只会 return 对对象 a2
的 A
部分的引用,而不是对整个对象的引用,
所以当我尝试这条线时:
a3.getClass() == A.class
我会得到 True
.
当我调试时 a3.getClass()
是 "class B"。
有人可以向我解释 return this
线在父亲 class 体内时的实际作用吗?
谢谢!
让我们一步一步地追踪语句:
a1
是对类型A
. 的实例的引用
a1.get2()
调用A
中的get2()
方法,其中 return 是对类型B
的实例的引用,因此a2
指的是B
类型的实例。a2.get2()
调用了B
中的get2()
方法。请记住,a2
是类型B
的实例,因此this
指的是B
。get2()
B
中的方法调用B
中的get1()
方法。this
仍然指的是B
.get1()
B
中的方法调用super.get1()
。这是它可能会有点混乱的地方。即使您从父 class 调用get1
方法,this
仍然在运行时引用B
。- 因此,
super.get1()
returnsB
。get1()
在B
return 中B
。get2()
在B
return 中B
。因此,a3
指的是类型B
. 的实例
来自 java 文档 Object#getClass
public final Class getClass()
Returns the runtime class of this Object
getClass
方法 return 是一个对象的运行时 class 所以当你调用 getClass
对类型实例的引用时你会得到B
。如果 getClass
未设计为 return 实际实例类型,它将始终 returned Object
这将使该方法毫无意义。
关键字this
引用了当前对象实例。没有 "A part of the B object",即子类中没有对超类的引用。被继承的对象并没有被分成不同的部分;您实例化了一个对象,它被 this
从实例方法中引用,而不管这些实例方法在哪里声明。
所以你有一个 B 对象,并且 this
在 A 中声明的方法中。如果直接或间接地从 B 调用该方法,那么它将引用该 B 对象。