有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java向子类转换

当我这样做时:

Animal dog = new Dog();

如果狗是动物的一个子类,那么这个对象实际上是一个狗型的对象,它是否曾经暴露在这个系统中,或者它永远消失了?这个问题与Java和C有关,因为我假设它们是相似的,但为了清楚起见,让我们把重点放在C上

根据我的知识,我认为这个物体将永远被视为动物物体。Dog的属性和方法将被分配给对象实例,但我们永远不会知道它是从Dog类实例化的


共 (3) 个答案

  1. # 1 楼答案

    在C#中,您可以检查wheter dog是否为dog using is的实例:

    if(dog is Dog) ...
    

    或用作:

    var dog = animal as Dog;
    if( dog != null )
        dog.Bark();
    
  2. # 2 楼答案

    在Java中,您可以使用instanceof检查dog是否为dog的实例:

    if (dog instanceof Dog) ...
    
  3. # 3 楼答案

    通过将Animal的实例强制转换为Dog,您可以访问Dog的proerties/methods

    Animal dog = new Dog();
    
    // then somewhere
    var dogDog = (Dog)dog;
    

    如果您不确定是Dog还是不-使用“软”铸造

    var mayBeDog = animal as Dog;
    if (maybeDog != null)
    {
        // is Dog
    }
    else
    {
        // wasn't Dog
    }
    

    另一个问题——我们需要关心什么是具体类型的动物吗? 如果您关心-那么在这种情况下不应该使用继承

    假设您有一个以Animal为参数的方法,这意味着您应该能够传递Animal的任何派生类,并且您的方法将以预期的方式工作