有没有办法将Java对象“减少”为继承的类?

时间:2013-05-04 04:56:33

标签: java class inheritance

所以这就是我在Java中注意到的:

如果我上课:

class IntStorage
{
    public int i;

    public void setInt(int i) { this.i = i; }
    public int getInt() { return i; }
}

继承它,并存储其他数据:

class IntAndStringStorage : IntStorage
{
    public String s;

    public void setString(String s) { this.s = s; }
    public String getString() { return s; }
}

我这样做:

IntAndStringStorage IandSstorage = new IntAndStringStorage();
IandSstorage.setString("Test");
IntStorage Istorage = (IntStorage)IandSstorage;
IntAndStorageStorage test = (IntAndStorageStorage)Istorage;
System.out.println(test.getString());

即使我将它转换为继承的类,它也完全有效。现在我假设信息仍然在对象内部,那么我可以完全将它转换为继承的类而不保留旧信息吗?我不希望在 int 存储类中遗留 String 存储。希望我的问题足够清楚!先谢谢!

2 个答案:

答案 0 :(得分:13)

Casts 更改Java中的对象(与C#不同,Java中的强制转换不能超载)。因此,转换只会更改对象显示的[编译时]类型 - 始终完全有效,无法将对象强制转换回原始类型。

要“减少”对象需要

  1. 创建一个信息较少的 new 对象(可能是基本类型);或者
  2. 有一个可变对象抛出(即指定null /默认值)到各个“剪切”字段。
  3. 此外,接口通常是一种更好的方式来暴露某些“视图”,而不是依赖于基类型。

答案 1 :(得分:2)

在Java中执行此操作的最佳方法是基于IntAndDataStorage实例int值创建新的IntStorage。

IntStorage intStorage = new IntStorage(intAndSstorage.getInt());

假设您将IntStorage(int)构造函数添加到IntStorage。没有字符串剩余。