鉴于扩展类“富”,它实现了接口“DeeDum”Java不继承访问器方法?
public interface DeeDum {
public String getDee();
public String getDum();
}
public class Foo implements DeeDum {
public String dee = "D";
public String dum;
public String getDee() { return dee; }
public String getDum() { return dum; }
}
public class Bar extends Foo {
public String dee = "DEE";
public String dum = "DUM";
}
为什么不这项工作一类“BAR”?
public static Bar mybar = new Bar();
Assert.assertEquals("DEE", mybar.getDee());
Assert.assertEquals("DUM", mybar.getDum());
我得到“D”,而不是null。换句话说,Bar不会从Foo继承访问器,并且不能覆盖属性。以某种方式调用mybar.getDum()调用类Foo的静态实例,并从父类返回静态属性。即使这些属性在子类中被覆盖!这是否意味着您不能继承任何方法或属性?
我无法将头围住它。为什么Java不能继承访问器(为什么他们会选择这样一个奇怪的选择?)
或者我只是做错了什么?
其实,我看到的东西仍然很奇怪,不确定。如果您有另一个扩展Foo的类'Bar'并将继承的访问器设置在初始化块中
虽然您可以在上面的块中设置父属性,但它实际上并不为子类创建副本。
它似乎是多个类的非确定性初始化。
所以如果你有Bar和Baz这两个都扩展foo并且有一个初始化块,它看起来像都继承了Bar设置的值。
public class Bar extends Foo {
{
dee = "dee";
dum = "dum";
}
}
public class Baz extends Foo {
{
dee = "DEE";
dum = "DUM";
}
}
public static Bar bar = new Bar();
public static Baz baz = new Baz();
System.out.println("mybaz: " + mybaz.getDee() + mybaz.getDum()); // DEEDUM
System.out.println("mybar: " + mybar.getDee() + mybar.getDum()); // DEEDUM
但是如果它们以不同的顺序正在被实例化,我得到:
public static Baz baz = new Baz();
public static Bar bar = new Bar();
System.out.println("mybaz: " + mybaz.getDee() + mybaz.getDum()); // deedum
System.out.println("mybar: " + mybar.getDee() + mybar.getDum()); // deedum
而且,如果一个默认基类美孚仍然设置不同的出来。
我想我现在明白Bar和Baz中的初始化块实际上是设置Foo :: dee和Foo :: dum,但是为什么声明中的区别?似乎“未定义”给我。
而且狂热的开始...... – 2009-01-12 19:55:58
请不要喂巨魔 – Draemon 2009-01-12 20:07:43
再一次的经典案例“我不知道* X *究竟如何运作,所以* X *必须完全错误。” – Bombe 2009-01-12 20:29:25