【问题标题】:Extending classes, will they inherit parameters if I follow this manner?扩展类,如果我按照这种方式,它们会继承参数吗?
【发布时间】:2013-03-28 02:36:02
【问题描述】:

如果我像这样创建一个基础对象:

public abstract class RIBaseObject{
    static ObjectRegistry sSystemRegistry = new ObjectRegistry();

    public RIBaseObject() {
    }

    public abstract void reset();

}

并在我创建的每个(大多数)类中扩展这个基础对象,考虑到 ObjectRegistry 包含如下参数:

public class ObjectRegistry extends RIBaseObject {

    public BufferLibrary bufferLibrary;
    public CameraSystem cameraSystem;

    public ObjectRegistry() {
        super();
    }

}

会在引导类中以这种方式声明 bufferLibrary:

RIBaseObject.sSystemRegistry.bufferLibrary = new BufferLibrary();

从任何扩展 BaseObject 的类中,我可以访问相同的 bufferLibrary 对象吗?还是会有所不同?

【问题讨论】:

  • 这看起来是一个糟糕的圆形设计。一个父类持有其子类型的静态字段?不,父母不应该依赖他们的孩子。您需要重新考虑您的设计。
  • 这是从复制岛拍摄的。我只是想了解那家伙是如何把他的东西放在一起的。但是,糟糕的设计,我会记住的。

标签: java inheritance extends


【解决方案1】:

所有子类都将访问基类中的同一个静态变量。 静态变量每个类加载一次,它们不依赖于实例化。

所以您的所有子类将共享相同的静态变量,即您的库在您的基类中定义为静态。

静态变量不会被继承,但可以被子类中类似定义的变量隐藏,称为变量隐藏。

所以是的,您将从所有子类访问相同的 bufferLibrary。

【讨论】:

  • 好的,既然 sSystemRegistry 是静态的,那么在第一次构造 RIBaseObject 时只有一个新的 ObjectRegistry。那么“新”不再意味着新,它只是让它指向已经创建的 sSystemRegistry。这就是我需要点击的内容,谢谢。
猜你喜欢
  • 2012-03-03
  • 2012-09-03
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多