从子类更改超类实例变量
Change superclass instance variables from subclass
我接到了这个任务,但我不太明白如何解决它:
"Change all three of the x-variables related to the C-class."
class A {
public int x;
}
class B extends A {
public int x;
}
class C extends B {
public int x;
public void test() {
//There are two ways to put x in C from the method test():
x = 10;
this.x = 20;
//There are to ways to put x in B from the method test():
---- //Let's call this Bx1 for good measure.
---- //Bx2
//There is one way to put x in A from the method test();
---- //Ax1
}
}
为了测试,我设置了这个:
public class test {
public static void main(String[] args)
{
C c1=new C();
c1.test();
System.out.println(c1.x);
B b1=new B();
System.out.println(b1.x);
A a1=new A();
System.out.println(a1.x);
}
}
给出 20、0、0。
现在,我发现我可以这样写 Bx1
:
super.x=10;
这会改变 B
中的 x
,但我不知道如何在我的 test.java
中调用它。
如何获得Bx1
、Bx2
、Ax1
以及如何打电话给他们进行测试?
您可以使用超类类型引用访问超类的x
版本:
System.out.println("A's x is " + ((A)this).x);
那会得到A#x
.
但总的来说,隐藏超类的 public 实例成员是一个非常的坏主意。
示例:(live copy on IDEOne)
class Example
{
public static void main (String[] args) throws java.lang.Exception
{
new C().test();
}
}
class A {
public int x = 1;
}
class B extends A {
public int x = 2;
}
class C extends B {
public int x = 3;
public void test() {
//There are two ways to put x in C from the method test():
System.out.println("(Before) A.x = " + ((A)this).x);
System.out.println("(Before) B.x = " + ((B)this).x);
System.out.println("(Before) C.x = " + this.x);
((A)this).x = 4;
System.out.println("(After) A.x = " + ((A)this).x);
System.out.println("(After) B.x = " + ((B)this).x);
System.out.println("(After) C.x = " + this.x);
}
}
输出:
(Before) A.x = 1
(Before) B.x = 2
(Before) C.x = 3
(After) A.x = 4
(After) B.x = 2
(After) C.x = 3
这就是您的测试方法的样子
void test() {
this.x = 30;
A a = this;
a.x = 10;
B b = this;
b.x = 20;
}
请务必注意,您正在访问您定义的 class 类型的变量,因此在这种情况下,您将访问 x
来自 A
,以及 B
中的 x
,方法是根据 this
关键字定义一个变量。
使用 getter 和 setter
class一个{
public int x;
}
class B 扩展 A {
public int x;
public void setAx(int x) {
super.x = x;
}
public int getAx() {
return super.x;
}
}
class C 扩展 B {
public int x;
public void test() {
x = 10;
this.x = 20;
}
public void setBx(int x){
super.x = x;
}
public int getBx() {
return super.x;
}
public static void main(String[] args)
{
C c1= new C();
c1.x = 1;
c1.setAx(2);
c1.setBx(3);
System.out.println(c1.getAx()+"/"+c1.getBx()+"/"+c1.x);
}
}
我接到了这个任务,但我不太明白如何解决它: "Change all three of the x-variables related to the C-class."
class A {
public int x;
}
class B extends A {
public int x;
}
class C extends B {
public int x;
public void test() {
//There are two ways to put x in C from the method test():
x = 10;
this.x = 20;
//There are to ways to put x in B from the method test():
---- //Let's call this Bx1 for good measure.
---- //Bx2
//There is one way to put x in A from the method test();
---- //Ax1
}
}
为了测试,我设置了这个:
public class test {
public static void main(String[] args)
{
C c1=new C();
c1.test();
System.out.println(c1.x);
B b1=new B();
System.out.println(b1.x);
A a1=new A();
System.out.println(a1.x);
}
}
给出 20、0、0。
现在,我发现我可以这样写 Bx1
:
super.x=10;
这会改变 B
中的 x
,但我不知道如何在我的 test.java
中调用它。
如何获得Bx1
、Bx2
、Ax1
以及如何打电话给他们进行测试?
您可以使用超类类型引用访问超类的x
版本:
System.out.println("A's x is " + ((A)this).x);
那会得到A#x
.
但总的来说,隐藏超类的 public 实例成员是一个非常的坏主意。
示例:(live copy on IDEOne)
class Example
{
public static void main (String[] args) throws java.lang.Exception
{
new C().test();
}
}
class A {
public int x = 1;
}
class B extends A {
public int x = 2;
}
class C extends B {
public int x = 3;
public void test() {
//There are two ways to put x in C from the method test():
System.out.println("(Before) A.x = " + ((A)this).x);
System.out.println("(Before) B.x = " + ((B)this).x);
System.out.println("(Before) C.x = " + this.x);
((A)this).x = 4;
System.out.println("(After) A.x = " + ((A)this).x);
System.out.println("(After) B.x = " + ((B)this).x);
System.out.println("(After) C.x = " + this.x);
}
}
输出:
(Before) A.x = 1 (Before) B.x = 2 (Before) C.x = 3 (After) A.x = 4 (After) B.x = 2 (After) C.x = 3
这就是您的测试方法的样子
void test() {
this.x = 30;
A a = this;
a.x = 10;
B b = this;
b.x = 20;
}
请务必注意,您正在访问您定义的 class 类型的变量,因此在这种情况下,您将访问 x
来自 A
,以及 B
中的 x
,方法是根据 this
关键字定义一个变量。
使用 getter 和 setter
class一个{
public int x;
}
class B 扩展 A {
public int x;
public void setAx(int x) {
super.x = x;
}
public int getAx() {
return super.x;
}
}
class C 扩展 B {
public int x;
public void test() {
x = 10;
this.x = 20;
}
public void setBx(int x){
super.x = x;
}
public int getBx() {
return super.x;
}
public static void main(String[] args)
{
C c1= new C();
c1.x = 1;
c1.setAx(2);
c1.setBx(3);
System.out.println(c1.getAx()+"/"+c1.getBx()+"/"+c1.x);
}
}