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但我的应用程序需要子类和基类中的全部数据,因此只有我这样使用过,有没有其他方法可以这样做而不是拆分这两个类。?