【问题标题】:why an object of class Derived, refered by class Base reference, is not compiled when trying to print Derived field? [duplicate]为什么在尝试打印 Derived 字段时未编译由类 Base 引用引用的 Derived 类的对象? [复制]
【发布时间】:2019-11-21 12:51:38
【问题描述】:

我是 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” “一些字符串” “2.2”

我得到了一个编译错误:

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

【问题讨论】:

  • 感谢 azurefrog 极快的回复。我认为 Base 可以指向 Derived 而不会更改其值。这不是我们扩展课程的重点吗?这样 Base 可以引用 Derived 而 Derived 保留其功能?

标签: java


【解决方案1】:

打字时:

Base someDerive = new Derived(2.2);

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

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

您收到编译错误,因为变量 的类型为Base,并且Base 类中没有derivedDouble 字段。即使在运行时引用的 objectDerived,但在编译时编译器只知道 variable 是什么类型。

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

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

【讨论】:

  • 感谢 azurefrog。有效!不过看起来有点丑。这是使它工作的唯一方法吗?我的意思是,当我想使用一些专属于 Derived 的功能时,我需要失望吗?提前致谢!
  • @guyr79 不,这不是唯一的方法:最好的方法是首先声明Derived someDerive
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2015-08-26
  • 2012-06-29
相关资源
最近更新 更多