Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声明类型和实际类型_Java - Fatal编程技术网

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请相应地编辑您的问题,并*添加(不要删除任何内容)问题的新部分,然后我将编辑我的答案。