Java 声明类型和实际类型
我理解在创建新对象时,如:Java 声明类型和实际类型,java,Java,我理解在创建新对象时,如: GeomObject tri = new Triangle(); 更通用,允许更高的可恢复性,但当tri按如下方式创建时会发生什么: Triangle tri = new Triangle(); 既然三角形是地貌对象的一个子类,tri不也是地貌对象吗?声明的类型如何影响编译?谢谢 *补充:另一个问题:假设我有 Integer n1 = new Integer(3); Object n2 = new Integer(4); System.out.println(n
GeomObject tri = new Triangle();
更通用,允许更高的可恢复性,但当tri按如下方式创建时会发生什么:
Triangle tri = new Triangle();
既然三角形是地貌对象的一个子类,tri不也是地貌对象吗?声明的类型如何影响编译?谢谢
*补充:另一个问题:假设我有
Integer n1 = new Integer(3);
Object n2 = new Integer(4);
System.out.println(n1.compareTo(n2));
我在Eclipse上尝试了这个方法,即使我用n2反转n1,也会出现错误。我认为n2.compareTo(n1)可以工作,因为它将调用对象compareTo方法,并且由于Integer是对象的实例,所以它是可以通过的,但事实并非如此。你能解释一下吗?
既然Triangle
是geomeobject
的一个子类,那么tri
是否仍然是geomeobject
是的。使用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
声明的类型如何影响编译
它不会影响任何事情,只是会使您的代码变得不灵活,以防您需要使用另一个不是三角形的geomeObject
实现
更多信息:
我认为n2.compareTo(n1)
会起作用,因为它会调用Object#compareTo
方法
这是不正确的,因为类没有compareTo
方法
另一方面,n1.compareTo(n2)
将不起作用,因为当接收到另一个Integer
类类型时,您将对象
传递给compareTo
方法
请注意,在声明时:
Object n2 = new Integer(4);
- 变量类型将是
对象
,无论您是将其初始化为整数
还是另一个类,例如字符串
- 只有被重写的方法的行为符合对象引用运行时类型中的定义,这意味着如果
n2
变量包含一个Integer
,则只有在类object
的类Integer
中被重写的方法的行为符合Integer
类、所有其他方法、字段中的定义,甚至变量本身也会表现为对象
。对于Integer
类,这些方法是、和
- 上面提供的链接:“编程到接口”是什么意思?解释使用接口(或抽象类或泛型类)通过泛型接口/类而不是直接实现来概括工作的好处。请注意,在某些情况下,此方法不适用,例如,当您应该使用
整数时,您当前使用对象的示例。请注意,Object
类太通用了(至少在这种情况下是这样),所以我不建议直接使用Object
,至少在您了解自己真正在做什么的情况下
在原始问题中添加了更多内容*@xheyhenry请相应地编辑您的问题,并*添加(不要删除任何内容)问题的新部分,然后我将编辑我的答案。