【问题标题】:Class casting in javajava中的类转换
【发布时间】:2013-10-10 08:47:16
【问题描述】:

在我的代码中有两个类,子类扩展了超类。在子类中我覆盖了超类方法。在创建对象时,我创建了对子类对象的超类引用,它工作正常。但是我再次将超类引用转换为完整的超类对象,但它调用子类方法而不是超类方法。我的假设输出是错误的。这是我的代码

public class OverRiding {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //Super class reference to sub class Object
        Dog dog = new Animal();
        dog.eat();
        dog.bow();

        //Completely converted into pure Dog class Object
        Dog d = (Dog) dog;
        d.eat();
        d.bow();
    }
}

狗类

class Dog {
    public void eat() {
        System.out.println("Dog eat Biscuits");
    }

    public void bow() {
        System.out.println("Dog bow");
    }
}

类动物

class Animal extends Dog {
    public void eat() {
        System.out.println("Animal eat Food");
    }
}

我的输出是

Animal eat Food
Dog bow
Animal eat Food
Dog bow

【问题讨论】:

  • 缩进是你最好的朋友。
  • class Animal extends Dog?嗯,我想反之亦然
  • Animal 不应该扩展 Dog,因为每个 Animal 都不是 Dog。它应该是另一种方式:Dog 应该扩展 Animal,因为 Dog is an Animal。
  • 强制转换永远不会改变对象的类型。它只允许获取对对象的更具体类型的引用。动物永远是动物,无论你想把它施放什么。
  • 铸造不是转换!

标签: java casting


【解决方案1】:

你的概念不对啊兄弟……

 class Animal extends Dog

Animal 如何扩展狗? .就像在说 - “每只动物都是狗”。哪个是错的... 所以,应该是反过来的……

这个例子只会让你更加困惑..

不知道为什么没有人提出这个...

【讨论】:

    【解决方案2】:
     Dog d = (Dog) dog;
    

    这里的d 不是纯Dog 对象。它仍然是Animal 类型。纯Dog 对象将通过Dog d = new Dog() 创建。

    【讨论】:

      【解决方案3】:
         Dog dog = new Animal();
          //Completely converted into pure Dog class Object
          Dog d = (Dog) dog;
      

      Dogd 都指向同一个引用,因为您没有创建 new object。 Cast 在这里不会产生影响。

      铸造和创造是完全不同的。

      【讨论】:

        【解决方案4】:

        在本例中,您只创建了一个对象,它是一个Animal,(很遗憾,它是Dog 的一种特殊类型)。当你在这个对象上调用eat 时,你总是会得到Animal 类中定义的版本,而不是Dog 类中定义的版本。

        这就是多态性。被调用的方法的版本取决于对象的类,而不是引用它的变量的类型。

        【讨论】:

          【解决方案5】:

          你的假设是错误的:

          完全转化为纯Dog类Object

          当您将Animal 转换为Dog 时,您的变量d 仍然是Animal。它也是Dog,但最具体的类型是Animal

          您没有将变量完全转换为另一个实例。你的实例还是一样的。

          为了证明,你可以试试这个代码:

          Dog d = (Dog) dog;
          d.getClass(); // output Animal
          

          【讨论】:

            猜你喜欢
            • 2021-07-14
            • 1970-01-01
            • 1970-01-01
            • 2018-09-23
            • 2015-09-29
            • 2011-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多