声明的类型和实际类型
我知道在创建一个新对象时,例如:
GeomObject tri = new Triangle();
更通用,允许更多的可恢复性,但是当tri创建时会发生什么:
Triangle tri = new Triangle();
由于Triangle是GeomObject的子类,因此还不是GeomObject吗? 声明的类型如何影响编译? 谢谢
*补充:另一个问题:说我有
Integer n1 = new Integer(3); Object n2 = new Integer(4); System.out.println(n1.compareTo(n2));
我在Eclipse上尝试了这个,即使我用n2反转n1,我也会遇到错误。 我认为n2.compareTo(n1)会起作用,因为它会调用Object compareTo方法,因为Integer是一个对象的实例,所以它是可以通过的,但事实并非如此。 你能解释一下吗?
由于
Triangle
是GeomObject
的子类,因此还不是GeomObject
吗?
是的。 使用instanceof
运算符来测试:
System.out.println( (tri instanceof Triangl) ); //prints true System.out.println( (tri instanceof GeomObject) ); //prints true System.out.println( (tri instanceof Object) ); //prints true because every class extends from Object
声明的类型如何影响编译?
它不会影响任何问题,如果你需要使用另一个不是Triangle
的GeomObject
实现,只会使你的代码不灵活 。
更多信息:
- “编程到界面”是什么意思?
我认为
n2.compareTo(n1)
会起作用,因为它会调用Object#compareTo
方法
这是不正确的,因为Object
类没有compareTo
方法。
另一方面, n1.compareTo(n2)
将无效,因为当Integer#compareTo
收到另一个Integer
类类型时,您将Object
传递给compareTo
方法。
请注意,在声明时:
Object n2 = new Integer(4);
- 变量类型将是
Object
,无论您将其初始化为Integer
还是其他类(例如String
。 - 只有重写的方法才会按照对象引用运行时类型的定义运行,这意味着如果你的
n2
变量包含一个Integer
,只有在类Integer
重写的方法将从Integer
类中定义,所有其他方法,字段,甚至变量本身也将表现为Object
。 在Integer
类的情况下,这些方法是equals
,hashCode
和toString
。 - 上面提供的链接: “编程到界面”是什么意思? 解释了使用接口(或抽象类或generics类)通过通用接口/类而不是直接实现来概括工作的好处。 请注意,在某些情况下,此方法将不适用,例如当您使用
Integer
时使用Object
的当前示例。 请注意,Object
类太通用了(至少在这种情况下),所以我不建议直接使用Object
,至少你明白你在做什么。