为什么在尝试打印Derived字段时未编译由Base Reference类引用的Derived类的对象?

时间:2019-07-11 18:30:11

标签: java

我一般都不是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);                                      ^   符号:变量派生的Double   location:变量base类型的someDerive 1个错误

1 个答案:

答案 0 :(得分:2)

  

键入时:

     

Base someDerive = new Derived(2.2);

     

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

你倒退了。它创建一个类型为 . . . class mGui(tk.Tk): def __init__(self, *args, **kargs): tk.Tk.__init__(self, *args, **kargs) container = tk.Frame(self) container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) container.grid() # ADD THIS. . . . 对象,并将对该对象的引用分配给类型为Derived变量

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

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

Derived