首页 > 解决方案 > 为什么在尝试打印 Derived 字段时未编译由类 Base 引用引用的 Derived 类的对象?

问题描述

一般来说,我是 Java 和面向对象编程的新手,遇到了一个我找不到答案的问题:

键入时:

Base someDerive = new Derived(2.2);

java基本上创建了一个实际上是Base类型的对象

我写了 Derived 而不是 Base (对于类类型),并且一切都按预期工作 - 但又一次 - 我假设如果类型 Base 指向 Derived ,那么它应该作为派生工作。

足够的谈话 - 一些代码的时间:

public class test{
public static void main(String args[])
{
    Base someDerive = new Derived(2.2);
    System.out.println(someDerive);
    System.out.println(someDerive.baseField);
    System.out.println(someDerive.baseString);
    System.out.println(someDerive.derivedDouble);
}}


class Base{
 int baseField;
 String baseString;

Base(int field, String str) {
    baseField = field;
    baseString = str;
}
}

class Derived extends Base{
 double derivedDouble;

Derived(double someDouble) {
    super(10, "some_string");
    derivedDouble = someDouble;
}
}

我期待打印输出,例如:“10”“some_string”“2.2”

相反,我得到了一个编译错误:

Test.java:8: 错误:找不到符号 System.out.println(someDerive.derivedDouble); ^ 符号:变量派生双位置:变量 someDerive 类型为 Base 1 错误

标签: java

解决方案


键入时:

Base someDerive = new Derived(2.2);

java基本上创建了一个实际上是Base类型的对象

你有那个倒退。它创建一个类型为的对象Derived,并将对该对象的引用分配给一个类型为的变量Base

你会得到一个编译错误,因为变量是 type Base,并且类中没有derivedDouble字段Base。尽管在运行时引用的对象是 a Derived,但在编译时编译器只知道变量是什么类型。

如果要访问 中定义的字段Derived,则需要将变量强制转换为该类型:

System.out.println(((Derived)someDerive).derivedDouble);

推荐阅读