小编典典

声明的类型和实际的类型

java

我了解在创建这样的新对象时:

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上进行了尝试,即使我将n1与n2颠倒了也遇到了错误。我以为n2.compareTo(n1)会起作用,因为它将调用Object
compareTo方法,并且由于Integer是对象的实例,因此可以通过,但事实并非如此。你能解释一下吗?


阅读 271

收藏
2020-11-26

共1个答案

小编典典

由于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

更多信息:


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

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

另一方面,n1.compareTo(n2)由于您在接收到另一个类类型时将传递Object给该compareTo方法,因此将不起作用。Integer#compareToInteger

请注意,在声明时:

Object n2 = new Integer(4);
  • 变量类型将是 Object ,无论您将其初始化为Integer还是另一个类,例如String
  • 只有被覆盖的方法才能像对象引用运行时类型中定义的那样运行,这意味着,如果您的n2变量持有一个Integer,则只有Integer从class中被类覆盖的方法Object才能像在Integer类中定义的那样运行,所有其他方法,字段甚至变量本身会表现为Object。在以下情况下Integer类,这些方法是equalshashCodetoString
  • 上面提供的链接: “编程到接口”是什么意思? 解释了使用接口(或抽象类或泛型类)通过泛型接口/类而不是直接实现来泛化工作的好处。请注意,在某些情况下,这种方法 将不适用, 例如您当前的示例使用Object何时应使用Integer。请注意,Object 通用了(至少在这种情况下如此),因此,我不建议Object直接使用至少您了解自己真正在做什么。
2020-11-26