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

hqt*_*hqt 2 java reference object

虽然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

    }

}
Run Code Online (Sandbox Code Playgroud)

kun*_*ora 5

你想知道为什么我们使用显式类型转换.这都是关于继承 -

让我明白这一点 - 假设我们有两个A B类.和B类是子类的类A.这意味着B类具有A 类的所有功能,这意味着B 可以执行A 可以执行的任何操作.因此,如果

 A a = new B();
Run Code Online (Sandbox Code Playgroud)

是完全没有问题,因为B类可以做什么A类可以做.这里引用变量a是类A类,从类A的所有方法都是invokable.Now对象B(new B();)具有A类的所有功能(作为继承)所以A类的所有方法将是可以调用的.

如果我们改变这样的条件 - >

      B b =new A();
Run Code Online (Sandbox Code Playgroud)

不可能,因为可能是B类实现其自身的功能(方法和变量),这些功能不属于A类.但是这里引用变量是B 类,B类的所有功能都是可调用的,但实际的对象是A类,所以会出现Error.

同样的情况是使用Class Object.因为所有其他类都自动继承Object Class.

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