我正在学习java并对对象类型有疑问。
以下面的例子为例:
class A { }
class B extends A { }
class C {A myObject = new B();}
描述myObject类型的可接受方式是什么?
你会说它是A型,B型,还是A型和B型?
感谢。
答案 0 :(得分:6)
myObject
是A
类型的引用(您的变量声明为A
类型。)
myObject
引用的对象本身属于B
类型。该实例的类型为B
。
这是一个背景和焦点问题。
在其他地方使用myObject
时,您可能不知道它是类B
的实例,只是它是A
类型。
答案 1 :(得分:1)
它是A类型,因为type表示你可以用它做的操作,但它是B的一个实例,所以你所做的所有操作都是B方式。
答案 2 :(得分:1)
myObject
是具有声明的编译时类型A的字段。在运行时,它将引用类型B的对象。
声明(或编译时)类型的变量和对象的运行时类型之间的区别对于理解多态如何在像Java这样的静态类型语言中工作至关重要。有些东西(比如重写方法的调用)是由运行时类型确定的,其他的(比如重载或静态方法的调用)由编译时类型确定。
通常:声明的类型确定您可以对对象执行的操作,而运行时类型确定它的行为方式。
答案 3 :(得分:0)
继承意味着“是一种”关系 - 子类的实例是超类的实例。在您的示例中,由于B扩展了A,B的实例也是A的实例 - 这就是为什么您可以将新B分配给A类型的变量而不进行强制转换。
变量myObject
是A类型,但它引用的是一个真正属于B类的对象。