我理解在创建这样的新对象时:
GeomObject tri = new Triangle();
更通用并且允许更多的可重用性,但是当 tri 像这样创建时会发生什么:
Triangle tri = new Triangle();
既然 Triangle 是 GeomObject 的子类,那么 tri 不还是 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 是对象的一个实例,所以它是可以通过的,但事实并非如此。你能解释一下吗?
最佳答案
Since
Triangle
is a subclass ofGeomObject
, isn'ttri
still aGeomObject
?
是的。使用 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
How does the declared type affect compilation?
它不会有任何影响,只是会让你的代码不灵活,以防你需要使用 GeomObject
的另一个实现。那不是Triangle
.
更多信息:
I thought that
n2.compareTo(n1)
would work because it would callObject#compareTo
method
这是不正确的,因为 Object
类没有 compareTo
方法。
另一方面,n1.compareTo(n2)
将无法工作,因为您传递的是 Object
到 compareTo
Integer#compareTo
时的方法收到另一个 Integer
类类型。
声明时注意:
Object n2 = new Integer(4);
- 变量类型将是
Object
,不管你初始化为Integer
或另一类,例如String
. - 只有被覆盖的方法才会按照对象引用运行时类型中定义的方式运行,这意味着如果您的
n2
变量持有Integer
, 只有类中覆盖的方法Integer
从类Object
将按照Integer
中的定义运行类,所有其他方法,字段,甚至变量本身都将表现为Object
.如果是Integer
类,这些方法是equals
,hashCode
和toString
. - 上面提供的链接:“对接口(interface)编程”是什么意思?解释了使用接口(interface)(或抽象类或泛型类)通过泛型接口(interface)来概括工作的好处/classes 而不是直接实现。请注意,在某些情况下,这种方法不适用,例如您当前使用的示例
Object
什么时候应该使用Integer
.注意Object
类太通用(至少对于这种情况),所以我不建议使用Object
至少让你明白自己真正在做什么。
关于java - 声明类型和实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18775024/