当前位置: 首页 > 面试题库 >

声明的类型和实际的类型

贾沛
2023-03-14
问题内容

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

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是对象的实例,因此可以通过,但事实并非如此。你能解释一下吗?


问题答案:

由于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类中定义的那样运行,所有其他方法,字段甚至html" target="_blank">变量本身会表现为Object。在以下情况下Integer类,这些方法是equalshashCodetoString
  • 上面提供的链接: “编程到接口”是什么意思? 解释了使用接口(或抽象类或泛型类)通过泛型接口/类而不是直接实现来泛化工作的好处。请注意,在某些情况下,这种方法 将不适用, 例如您当前的示例使用Object何时应使用Integer。请注意,Object 通用了(至少在这种情况下如此),因此,我不建议Object直接使用至少您了解自己真正在做什么。


 类似资料:
  • 问题内容: Xcode 8 beta 4不再识别Foundation类。 我在一个简单的操场示例中复制了它: 由于在较早的Xcode 8 Swift 3 Beta中可用,我想这是一个需要修复的错误,而不是Playground中的某些源代码错误? 问题答案: 尽管未在Xcode发行说明中记录,但Swift Foundation中对Swift进化建议SE-0086 Drop NS Prefix 的第2

  • 我试图实现的是从声明类型数组。 使用enum,我可以这样做: 输出将是 我想通过这种方式实现类似的目标: 输出类似: 有什么想法吗?我尝试了和。不幸的是,它不起作用。

  • 关于我的问题 我有一个模板类,如下所示: 所以简而言之,我想要的是:1。在类外部的容器类型上编写泛型函数模板。2.类中函数的原型是什么? 请建议

  • 问题是如何使用对象类型发送Header,而不是HTTPClient声明中提供的HttpHeaders。 我在VS代码中得到的错误信息如下所示 “{headers:GetLoggedInUserHeaderRequestParam;}”类型的[ts]参数不可分配给“{headers?:HttpHeaders{[Header:string]:string string[];};};”类型“的参数;”观

  • 9. 不完全类型和复杂声明 在第 1 节 “复合类型与结构体”讲过算术类型、标量类型的概念,现在又学习了几种类型,我们完整地总结一下C语言的类型。下图出自[Standard C]。 图 23.5. C语言类型总结 C语言的类型分为函数类型、对象类型和不完全类型三大类。对象类型又分为标量类型和非标量类型。指针类型属于标量类型,因此也可以做逻辑与、或、非运算的操作数和if、for、while的控制表达

  • cc.Class 是一个很常用的 API,用于声明 Cocos Creator 中的类,为了方便区分,我们把使用 cc.Class 声明的类叫做 CCClass。 定义 CCClass 调用 cc.Class,传入一个原型对象,在原型对象中以键值对的形式设定所需的类型参数,就能创建出所需要的类。 var Sprite = cc.Class({ name: "sprite" }); 以上代