我一般都不是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个错误
答案 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