java - 是否可以通过其方法更改对象的运行时类型?

标签 java class

我有两个类:

public class Base{

    public Derived becomeDerived(){
         Derived d = new Derived(this);
         //set this pointer pointing to d, 
         //this = d; doesn't work
         return d;
    }
}

public class Derived extends Base{ 
    public Derived(Base b){ }
}

是否可以通过示例中显示的方法更改当前对象的运行时类型?

我想这样做的原因是提供一种连接对象的方法。

我有

public abstract class Table{ 

}

public class ComplexTable extends Table{ }

这实际上是一个 Table 对象的链表。

我想提供一个方法,比如 Table.append(Table t) ,它不仅修改当前的 Table 对象,而且使它成为 ComplexTable 的实例.

最佳答案

没有。

在您的示例中,Base 不会变为 Derived,它会返回一个新的 Derived 对象。

Base foo = new Base();
foo = foo.becomeDerived();

这可能是让您失望的原因,请记住变量不是对象,只是对对象的引用。因此,虽然您可以说 fooBase 更改为 Derived,但是 object 的运行时类型并没有为了不改变,您创建了一个具有不同运行时类型的对象并重新分配了变量。


编辑: 更深入的示例。我给对象“命名”只是为了更容易理解。

Base foo = new Base();

/* After execution:
 *
 * Vars:   | Objects:
 * foo ----+---> a Base object (Name: Joe)
 */

foo = foo.becomeDerived();

/* After execution:
 *
 * Vars:   | Objects:
 * foo ----+---> a Derived object (Name: Phil)
 *         |     a Base object (Name: Joe)(notice nothing references it)
 */

“Joe”的类型没有改变。 Joe 曾经并将永远是一个 Base 对象。这就是您所说的“对象的运行时类型”。但是,变量的运行时类型一直在变化!在这个例子中,fooBase 开始但变为 Derived

关于java - 是否可以通过其方法更改对象的运行时类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30401221/

相关文章:

java - Webdriver:通过html标签查找包含属于某个类的html标签的元素

java - 使用自定义身份验证了解 Spring Security 中的 "Access Denied"

java - 我无法在 Eclipse 上给一个类命名

C++ 实例创建顺序有何影响?

python - 使用用户输入启动类的新对象

class - 当类位于不同的 "namespaces/packages"中时,Perl6类继承

java - 在 java 中使用 Apache Spark 连接器从 Cassandra 检索数据时出错

java - Oracle OJDBC 驱动程序抛出 NoClassDefFoundError : oracle/i18n/util/LocaleMapper

java - 我应该如何在棉花糖中添加权限请求?

python - 解析Python文件以查找具有特定标签的类