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

为什么在用作其他对象类型时必须转换类型为object的引用变量

邵逸明
2023-03-14
问题内容

尽管Java中的所有类都是Object类的子类,但是与其他对象类型不同,但是如果没有强制类型转换,则不能将Object类型的引用变量分配给任何其他引用类型。

例如:

public class Inheritance {

    public static class Animal {        
        public void Scream() {
            System.out.println("I'm an animal");
        }       
    }

    public  static class Mammal extends Animal{
        public void Scream(){
            System.out.println("I'm a mammal");
        }       
    }

    public  static class Tiger extends Mammal{
        public void Scream(){
            System.out.println("I'm a tiger");
        }       
    }

    public static void main (String[] args){

        Animal tiger = new Tiger();
        tiger.Scream(); //true

        Object tiger = new Tiger();
        tiger.Scream(); //false

        Object tiger = new Tiger();
        ((Animal) tiger).Scream(); //true

    }

}

问题答案:

您想知道为什么我们使用显式类型转换。这就是关于继承的一切-

让我来清除此-让我们有两个类 A类B类 。和 B类 是子类的 类A 。这意味着 Class B 具有
Class A的 所有功能,这意味着 Class B 可以做 Class A 可以做的任何事情。因此,如果

 A a = new B();

是完全没有问题,因为 B类 可以做什么 A类 可以做。这里的引用变量 a 是Class A类型的,从中可以调用Class
A的所有方法。现在 B的 Object (new B();)具有 Class A的 所有功能(作为继承),因此 Class A的
所有方法将可以调用。

如果我们像这样逆转条件->

      B b =new A();

不可能,因为可能是 B类 实现了自己的功能(方法和变量),而这些功能不在 A类中 。但是这里引用变量是 B 类型的,所以 B
类的 所有功能都是可以调用的,但是实际对象是 A 类型 的, 因此会发生错误。

类Object的 情况与此相同,因为所有其他Class自动继承 Object Class。

因此,当具有引用变量类型为Class Object的任何对象都需要显式Cast时,因为不能确定该对象包含多少功能。



 类似资料:
  • 问题内容: 我正在使用Java上的OOP上的MOOC,它提供了一个我不完全理解的示例。在该示例中,已创建一个类,并且他们正在为该类构造“等于”重写方法。新方法采用任何对象的参数。如果该参数是与该对象具有相同名称和PublishingYear 的对象,则返回true 。因为参数对象可以是Object类的任何对象,所以在调用和方法之前,如果在不在类中的对象上调用该对象,则会抛出错误,因此该方法将检查以

  • 问题内容: 在Java中,从Object转换为其他类型时,为什么第二行会产生与转换相关的警告,而第一行却没有? 问题答案: 这是因为在执行时,由于 类型Erase 不会 真正 检查对象是否为a 。真的只是将其投射到。例如: __ 有关更多信息,请参见Angelika Langer的Java泛型常见问题解答 ,尤其是类型擦除部分。

  • 既然这个对象(在标题中说明)可以调用子类中的重写方法,为什么它不能调用子类的其他方法?我需要尽可能详细的回答,比如内存组织,JVM中的内部逻辑等。 下面的代码会让你清楚地理解我的问题。

  • 我正在学习Apollo和graphQL,并将其集成到我的一个项目中。到目前为止一切正常,但现在我正在尝试一些突变,我正在努力处理输入类型和查询类型。我觉得事情比实际情况要复杂得多,因此我正在寻求如何处理我的情况的建议。我在网上找到的示例都是非常基本的模式,但现实总是更加复杂,因为我的模式非常大,如下所示(我只复制一部分): 然后定义输入和负载,依此类推... 为此,我需要一个变异来保存“计算”,因

  • 问题内容: 当我想在当前范围内引用该方法时,我仍然需要指定类名(对于静态方法)或在 运算符之前。例如,我需要写: 对于来说,这并不是什么大问题,但是对于静态方法而言,有时显得有些拥挤,因为类名可能会很长。如果编译器允许我直接编写代码,那就太好了: 但是Java-8编译器不允许这样做。对我来说,如果用与普通方法调用相同的方式解析类/对象名称,那似乎是非常一致的。这也将支持方法引用的静态导入,这在某些

  • 问题内容: 好吧,如果我有这段代码 一切正常,但是 运行后给出以下错误(Eclipse没有给出任何错误) 虽然,当我这样做 要么 再没有错了。 为什么必须将其首先转换? 问题答案: 声明对象时,可以通过检查对象是否实际上已强制转换为实例来判断。由于取消装箱约定,可以再次将其强制转换为。之后,该值可以转换为。 但是,没有从Double实例转换为的取消装箱约定,因此,如果您尝试这样做,则运行时将发出。