我知道有很多关于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
它只是一个例子,但我想要做的是在超类中创建一些常用方法,这些方法将使用继承类中的字段,例如。用户消息
有没有办法做到这一点?如果不是那么为什么我会使用超类,我可以使用其他任何东西吗?
提前致谢
答案 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>