Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在将子类转换为超类之后,仅保留超类变量_Java_Oop_Inheritance_Polymorphism - Fatal编程技术网

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

Java 在将子类转换为超类之后,仅保留超类变量,java,oop,inheritance,polymorphism,Java,Oop,Inheritance,Polymorphism,我有两节课 基类 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 cla

我有两节课

基类

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());
        }
    }
}
公共类TestMain
{
公共静态void main(字符串[]args)
{
Map myData=newhashmap();
子类mydata=新的子类();
myData.put(“测试”,myData);
对于(条目数据:myData.entrySet())
{
System.out.println(data.getKey()+“-”+data.getValue());
}
}
}
如您所见,在我的主类中,我有
字符串的
映射和
基类。我的期望是保持更少的内存占用,因此我只需要在内存中保留
基类
变量,这些变量是应用程序中经常使用的数据,但应用程序中需要子类来进行某些计算,因此在应用程序中会创建子类

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


我的最终目标是在map中只保留
基类
变量。

强制转换不会以任何方式修改对象。它是一个编译时操作,告诉编译器它可以期望一个对象具有特定类型的字段和方法——在本例中是一个超类

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

public BaseClass(BaseClass template){
   baseClassVariable=template.baseClassVariable;
   // ... and so forth for all fields
}
请注意,您可以将子类实例传递给构造函数。由于它将只复制其“已知”字段,因此仍将生成一个仅包含超类字段的超类实例


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

强制转换无法完成预期的工作

您有几个选择:

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

    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;
    
    它很快就会被垃圾收集起来


但是,你应该考虑收益是否大于成本。如果只是一些基本值或不是很大的对象,则很可能不会有那么多内存。

这不会以您认为的方式节省内存。映射中的值仍然是
子类
对象,即使映射中的值类型是
基类
。如果您这样做,
子类
部分不会以某种方式被丢弃。强制转换不会更改对象的类型-如果您只想创建一个
基类
对象,您需要明确地这样做。@Jesper是的,即使将子类转换为基类,该类也不会被转换。这是正确的,但我如何实现这种类型的要求还有其他方法。?如果您想保留
基类
字段并放弃
子类
字段,也许继承不是你想要的模型。如果
子类
数据没有绑定到与
基类
数据相同的对象中,则很容易丢弃它。@khelwood但我的应用程序需要子类和基类中的全部数据,因此只有我这样使用过,有没有其他方法可以这样做而不是拆分这两个类。?