声明的类型和实际类型

我知道在创建一个新对象时,例如:

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是一个对象的实例,所以它是可以通过的,但事实并非如此。 你能解释一下吗?

由于TriangleGeomObject的子类,因此还不是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 

声明的类型如何影响编译?

它不会影响任何问题,如果你需要使用另一个不是TriangleGeomObject实现,只会使你的代码不灵活

更多信息:

  • “编程到界面”是什么意思?

我认为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类的情况下,这些方法是equalshashCodetoString
  • 上面提供的链接: “编程到界面”是什么意思? 解释了使用接口(或抽象类或generics类)通过通用接口/类而不是直接实现来概括工作的好处。 请注意,在某些情况下,此方法将不适用,例如当您使用Integer时使用Object的当前示例。 请注意, Object通用了(至少在这种情况下),所以我不建议直接使用Object ,至少你明白你在做什么。