0

我知道有很多关于 Java 继承的话题(我已经读过),但它们都代表“它是怎样的”,我需要“如何改变它”的知识。因此,我们有 2 个类:

class t1{
 public int a=5;

 public void get(){
    System.out.println(a);
 }
}

class t2 extends t1{
 public int a = 1;
}

现在 :

 t2 z = new t2();
 z.get();

我们得到5

当然,这只是示例,但我想做的是在超类中创建一些常用方法,这些方法将使用继承类中的字段,例如。用户消息

有没有办法做到这一点?如果不是那么为什么我会使用超类,我可以使用其他东西吗?

提前致谢

4

4 回答 4

6

您应该使用构造函数和可能的 getter

class t1{
 public final int a;

 public t1() {
    this(5);
 }
 protected t1(int a) {
    this.a = a;
 }

 public void get(){
    System.out.println(a);
 }
}

class t2 extends t1{
  public t2() {
     super(1);
  }
}

现在

t2 z = new t2();
z.get();

印刷1

于 2013-09-18T14:19:12.660 回答
0

你正在隐藏/隐藏变量t1

t1可以在 get 方法中看到变量t2并打印它自己的值。a

你不需要再次声明 a 因为 t1 的 a 随处可见

a如果您想要in 类型的对象的另一个默认值t2覆盖默认构造函数。

public t2() {
    this.a = 1;
}
于 2013-09-18T14:20:55.073 回答
0

是的,有办法做到这一点。您可以应用称为“模板方法”的模式。这是一个例子

class Base {

     void someMethod() {
         int value = getValue();

         // calculate something
     }

     protected abstract int getValue();
}

class Derived extends Base {

    int getValue() {
         return 5;
    }
}

您的模板方法在哪里getValue(),您可以在继承的类实现中插入任何逻辑。

于 2013-09-18T14:36:13.957 回答
0

多态性仅适用于方法,不适用于字段,并且您无法更改此 Java 机制。这意味着后期绑定将根据对象的类找到正确的方法体

class X{
    void sayHello(){
         System.out.println("Hello from X");
    }
}

class Y extends X{
    void sayHello(){
         System.out.println("Hello from X");
    }
}

//...
X obj = new Y();
obj.sayHello();// even if you are using X reference body of method will 
               // come from Y class

但是字段不是多态的,因此如果方法使用某个字段,它将一直使用该字段(再一次,后期绑定不会搜索在当前对象的类中声明的最新字段)。这就是为什么你看到5的结果。

如果您想模拟“方法主体中使用的字段的多态行为,您最好的选择是让派生类在基类中设置该字段的新值,就像彼得劳里的回答(对他来说是大 +1)。

于 2013-09-18T16:13:53.553 回答