Java强制字段继承

时间:2013-09-18 14:16:18

标签: java inheritance

我知道有很多关于Java继承的帖子(我已经读过它了),但它们都代表“它是怎么回事”,我需要知识“如何改变它”。所以,我们有两个班级:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你正在隐藏/隐藏变量t1

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

你不需要再次申报,因为t1的a可以随处可见

如果你想在a类型的对象中t2的另一个默认值覆盖默认构造函数。

public t2() {
    this.a = 1;
}

答案 2 :(得分:0)

是的,有办法解决这个问题。您可以应用称为“模板方法”的模式。这是一个例子

class Base {

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

         // calculate something
     }

     protected abstract int getValue();
}

class Derived extends Base {

    int getValue() {
         return 5;
    }
}

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

答案 3 :(得分:0)

多态性仅适用于方法,不适用于字段,您无法更改此Java机制。这意味着late binding将根据对象类

找到正确的方法体
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的结果。

如果你想模拟“方法体中使用的字段的多态行为,你最好的选择是让派生类在基类中设置该字段的新值,如Peter Lawrey's answer(对他来说大+1)。< / p>