在将子类转换为超类后,仅保留超类变量

时间:2017-03-13 09:17:27

标签: java oop inheritance polymorphism

我有两个班级

BaseClass的

public class BaseClass
{
    public int baseClassVariable = 10;
    //like this 10 to 20 variables
}

子类

public class SubClass extends BaseClass
{
    public int subClassVariable = 20;
    //like this 30 to 40 variables
}

还有一个主要课程:

public class TestMain
{
    public static void main(String[] args)
    {
        Map<String, BaseClass> myData = new HashMap<String, BaseClass>();
        SubClass mydata = new SubClass();
        myData.put("Test", mydata);
        for (Entry<String, BaseClass> data : myData.entrySet())
        {
            System.out.println(data.getKey() + "-" + data.getValue());
        }
    }
}

正如您所看到的,在我的主要课程中,我有Map StringBaseClass。我的期望是保持较少的内存占用,所以我需要在内存中只保留BaseClass个变量,这些变量是应用程序中经常使用的数据,但在应用程序中需要子类来进行某些计算,因此在应用程序中将创建子类

现在我的问题是存档我期望的最佳方式(超类和子类)(现在它没有按照期望工作,因为继承)或者我需要使用不同的机制来实现它。

我的最终目标是仅在地图中保留BaseClass个变量。

2 个答案:

答案 0 :(得分:0)

Casting不会以任何方式修改对象。它是一个编译时操作,它告诉编译器它可以期望一个对象具有特定类型的字段和方法 - 在这种情况下是一个超类。

为了将对象从子类类型“转换”为超类类型,您可以做的是有一个接受超类实例的构造函数,如下所示:

public BaseClass(BaseClass template){
   baseClassVariable=template.baseClassVariable;
   // ... and so forth for all fields
}

请注意,您可以将子类实例传递给构造函数。由于它只会复制其“已知”字段,因此仍会产生仅包含超类字段的超类实例。

另请注意,对于非基本类型,仅复制引用可能很危险,因为原始实例和新创建的实例仍引用相同的字段。对于复杂的数据结构,您可能需要深度复制引用的字段,例如通过Object.clone()

答案 1 :(得分:-1)

施放不能完成你期望完成的工作。

您有几个选择:

  • 将所有要保留的值复制到另一个对象中:

    public PreservedData(WholeBunchOfData data) {
        this.somevar = data.somevar;
        // Copy the values to be preserved manually
    }
    
  • 使用单独的对象将可支配值放入:

    class BaseClass {
        int valueToBePreserved = 29;
        String otherValueToBePreserved = "";
        DisposableObjectContainingDisposableValues someDisposableObj = ...;
    }
    
    class SubClass {
        int disposableValue = 13;
        String someOtherDisposableValue = 47;
    }
    

    完成后,只需将对象设置为null。

    this.someDisposableObj = null;
    

    很快就会收集垃圾。

但是,您应该考虑增益是否大于成本。如果它只是一些原始值或不是很大的对象,那很可能就不会有那么多的内存。