我理解在创建一个新对象时:
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的实例,所以它是可以通过的,但事实并非如此。你能解释一下吗?
答案 0 :(得分:9)
由于
Triangle
是GeomObject
的子类,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
类,则这些方法为equals
,hashCode
和toString
。Object
时,使用Integer
的当前示例。请注意Object
类方式泛型(至少在这种情况下),所以我不建议直接使用Object
,至少你明白你真的是什么做。