当前位置: 首页 > 知识库问答 >
问题:

为什么Java对象类在转换后保持不变?

邹坚壁
2023-03-14

我试图抛出一个目标。但是在运行时,对象类仍然是一个派生类。

Derived drv = new Derived();

Base base = (Base) drv;

System.out.println("Class : " + base.getClass()); 

//prints -> Class : class packagename.Derived

那么为什么类属性没有改变呢?

共有3个答案

洪和风
2023-03-14

上转换不会改变对象的类型。事实上,没有什么能改变Java对象的类型。

这就是OO编程的核心:一个对象有一个定义的行为,不能受到外部的影响。

松涵容
2023-03-14

您无法在 Java 中更改实例的类型。你对演员表所做的只是从不同类型的变量中引用它。

轩辕弘雅
2023-03-14

那么为什么类属性没有改变呢?

因为对象没有改变,只是你对它的引用的类型。转换对对象本身没有任何影响。

在Java中,与其他一些语言不同(谢天谢地),引用的类型在很大程度上不会影响您获得的方法版本。例如,考虑这两个类(由 2rs2ts 提供

class Base {
    public Base() {}
    public void foo() {
        System.out.println("I'm the base!");
    }
}

class Child extends Base {
    public Child() {}
    public void foo() {
        System.out.println("I'm the child!");
    }
}

此代码:

Child x = new Child();
Base y = (Base) x;
y.foo();

…输出

I'm the child!

因为即使y的类型是Base,我们调用foo的对象是儿童,因此儿童#foo被调用。这里(再次由2rs2ts提供)是ideone上的一个示例

尽管经过了Base引用,但我们还是得到了儿童#foo这一事实对于多态性至关重要。

现在,碰巧您正在调用的方法(getclass)只能是Object#getclass,因为它是最终方法(子类不能覆盖它)。但是这个概念至关重要,我想它可能是你要问的核心。

引用类型的主要作用是确定允许您访问对象的哪些方面。例如,假设我们将 bar 添加到 Child

class Child extends Base {
    public Child() {}
    public void foo() {
        System.out.println("I'm the child!");
    }
    public void bar() {
        System.out.println("I'm Child#bar");
    }
}

这段代码无法编译:

Child x = new Child();
Base y = (Base) x;
y.bar(); // <=== Compilation error

…因为Base没有bar方法,所以我们无法通过类型为Base的引用访问对象的bar方法。

 类似资料:
  • 我正在为一个类编写一个单元测试,如下所示: 现在,当我运行这段代码时,它给我一个错误,即我无法将强制转换为Java中的集合。 ps:有一个单独的类,名为,它的setter如下所示: 而我正在尝试使用上面的这种方法。

  • 例如:Date值为:“dateCollected”:fri Jul 07 00:00:00 IST 1989, 但它只服用星期五而不是整个日期。

  • 主要内容:强制对象类型转换将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的 对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,会抛出 Java 强制类型转换(java.lang.ClassCastException)异常。 Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java 中引用类型之间的类型转换(前提是两个类

  • 如何将一个django模型对象转换为一个包含所有字段的判决?所有理想情况下包括外键和字段可编辑=False。 让我详细说明一下。假设我有一个django模型,如下所示: 在终端中,我完成了以下工作: 我想将其转换为以下词典: 回答不满意的问题: Django:将整个模型对象集转换为单个字典 如何将Django模型对象转换为字典,并且仍然保留它们的外键?

  • 问题内容: 我有一类可能需要将对象更改为更远的一行的后代类。这可能吗?我知道一个选择是返回它的副本,但改用子类,但是最好实际修改当前对象……所以: 问题答案: 如其他答案中所述,您可以使用讨厌的 黑魔法 PECL扩展来做到这一点。 虽然,您真的不想要它。您想在OOP中解决的任何问题都有一种符合OOP的方法。 运行时类型层次结构修改不符合OOP(实际上,有意识地避免了这一点)。有些设计模式应该适合您