java 覆盖继承的变量名

tktrz96b  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(106)

我想知道是否有可能覆盖一个变量的名称(而不是值)时,从它的超类扩展。
想象一下这个场景:

public class Base {
   public  String A;
   public  String doSomething() { print(A) ; }
}

public class Sub1 extends Base {
   public String A1;
   public void setA1(String A1) { this.A1 = A1; }
}

public class Sub2 extends Base {
   public String A2;
}

Sub1 s = new Sub1();
s.setA1("1")
s.doSomething() // print "1"

我很好奇,如果我能让变量A与变量A1和A2相同,只是为了让代码在我的子类中更具可读性。

shyt4zoc

shyt4zoc1#

是的,你可以在Base中“覆盖”字段A。这样Sub1Sub2类将拥有它们自己的A字段名(但是它将是具有不同值的不同字段(与Base))。

public class Base {
   public  String A;
   public  String doSomething() { print(A) ; }
}
public class Sub1 extends Base {
   public String A;
   public void setA(String A) { this.A = A; }
}
public class Sub2 extends Base {
   public String A;
}

Sub1 s = new Sub1();
s.setA("1")
s.doSomething() // print "null", because original field has not been changed

或者您可以在Sub1Sub2类中重用A字段:

public class Base {
   public  String A;
   public  String doSomething() { print(A) ; }
}
public class Sub1 extends Base {
   // removed: public String A1;
   public void setA(String A) { this.A = A; }
}
public class Sub2 extends Base {
   // removed: public String A2;
}

Sub1 s = new Sub1();
s.setA("1")
s.doSomething() // print "1"
mccptt67

mccptt672#

我的天哪,这是5年后,但答案如下:

public class Base {
   public  String A;
   public  String doSomething() { print(A) ; }
}
public class Sub1 extends Base {
   
    public String getA1() {
        return super.getA();
    }
   public void setA1(String A1) { this.setA(A1); }
}

从上面可以看出,我们可以声明A1,而无需创建变量A1,该变量将覆盖A,但仍使用A。您可以这样做,这仅仅是因为java使用封装在java中串行化和反串行化其变量

相关问题