声明的类型和实际类型

时间:2013-09-12 22:01:52

标签: java

我理解在创建一个新对象时:

GeomObject tri = new Triangle();

更通用,允许更多的可恢复性,但是当像这样创建tri时会发生什么:

Triangle tri = new Triangle();

由于Triangle是GeomObject的子类,因此还不是GeomObject吗?声明的类型如何影响编译?感谢

* add:另一个问题:说我有

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

1 个答案:

答案 0 :(得分:9)

  

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

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

它不会影响任何问题,只是在您需要使用GeomObject的另一个Triangle实现时,才会使您的代码不灵活。< / p>

更多信息:


  

我认为n2.compareTo(n1)会起作用,因为它会调用Object#compareTo方法

这是不正确的,因为Object类没有compareTo方法。

另一方面,n1.compareTo(n2)无效,因为当Integer#compareTo收到另一个Object类时,您将compareTo传递给Integer方法类型。

请注意,在声明时:

Object n2 = new Integer(4);
  • 变量类型将为 Object ,无论您将其初始化为Integer还是其他类,例如String
  • 只有被覆盖的方法才会按照对象引用运行时类型中的定义运行,这意味着如果您的n2变量包含Integer,则只有类Integer中覆盖的方法来自类Object将按照Integer类中的定义行事,所有其他方法,字段,甚至变量本身都将表现为Object。如果是Integer类,则这些方法为equalshashCodetoString
  • 上面提供的链接:“编程到接口”是什么意思?解释了使用接口(或抽象类或泛型类)通过通用接口推广工作的好处/ classes而不是直接实现。请注意,在某些情况下,此方法将不适用,例如当您使用Object时,使用Integer的当前示例。请注意Object方式泛型(至少在这种情况下),所以我不建议直接使用Object,至少你明白你真的是什么做。