如何将子类对象转换为超类对象

问题描述 投票:3回答:5

我有2个类,分别称为超类和子类,我试图将子类对象转换为超类,但是当我想使用超类的子类对象时,它似乎不起作用。请帮忙解释一下。谢谢。这些是代码:-

public class superclass
{
    public void displaySuper()
    }
        System.out.println("Display Superclass");
    }
}

public class subclass extends superclass
{
    public void displaySub()
    {  
        System.out.println("Display Subclass");
    }
}


public class Testing
{    
   public static void main(String args[])
   {
      subclass sub = new subclass();
      superclass sup = (superclass) sub; 

当我尝试从子类中使用displaySub()时出现错误

      sup.displaySub(); //the displaySub method cant found
   }
}
java inheritance casting subclass superclass
5个回答
4
投票

超类不能知道子类方法。

以这种方式思考:

  • 您有超类Pet

  • 您有Pet的两个子类,即:CatDog

  • 两个子类都具有相同的特征,例如speak
  • Pet超类知道这些,因为所有Pet都可以说话(即使它不知道此操作的确切原理)
  • 但是Dog可以做猫不能做的事情,即eatHomework
  • [如果我们将Dog强制转换为Pet,则应用程序的观察者将不会意识到Pet实际上是Dog(即使我们知道这是实现者)
  • 考虑到这一点,调用eatHomeworkPet没有意义

您可以通过告诉程序您知道sup的类型为subclass来解决您的问题>

public class Testing
{    
   public static void main(String args[])
   {
      subclass sub = new subclass();
      superclass sup = (superclass) sub; 
      subclass theSub = (subclass) sup;
      theSub.displaySub();
   }
}

您可以通过执行以下操作来完全解决该问题:

public class superclass
{
    public void display()
    }
        System.out.println("Display Superclass");
    }
}

public class subclass extends superclass
{
    public void display()
    {  
        System.out.println("Display Subclass");
    }
}

public class Testing
{    
   public static void main(String args[])
   {
      subclass sub = new subclass();
      superclass sup = (superclass) sub; 
      sup.display();
   }
}

查看本教程的更多信息:overrides



0
投票

尽管超级对象和子对象都指向内存中的同一对象,但是您的超级对象对sub.subMethod()的存在一无所知。因此,您遇到了以上错误。下图说明了发生的情况:


0
投票

这将不起作用,因为您正在执行narrowing reference conversion。从JLS:

© www.soinside.com 2019 - 2024. All rights reserved.