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

How to cast subclass object to superclass object

我有 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继承:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

子类可以使用超类方法,但超类不能使用子类方法。如果要调用超类使用子类方法,必须先将超类实例强制转换为子类。 (subclass) sup

超类无法知道子类的方法。

这样想:

  • 你有一个超类Pet

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

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

您可以通过告诉程序您知道 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

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

这是行不通的,因为您正在执行 narrowing reference conversion。来自 JLS:

From any reference type S to any reference type T, provided that S is a proper supertype of T (§4.10)

在您的场景中,subclasssuperclass 的适当子类型。这意味着可以将 subclass 的实例声明为 superclass:

superclass sc = new subclass();

正如您之前发现的那样。

但是,class members 只能通过继承 进行转移;也就是说,superclass 可以将字段和方法传递给它的 subclasses,但是 subclass 不能为它的 superclass.[=20 做同样的事情=]

来自 JLS:

The members of a class type are all of the following:

  • Members inherited from its direct superclass (§8.1.4), except in class Object, which has no direct superclass

  • Members inherited from any direct superinterfaces (§8.1.5)

  • Members declared in the body of the class (§8.1.6)

将所有这些相当大的词联系在一起:

  • 您正在 向上 继承链从 child 到 parent
  • parent 可以将方法和字段传递给它的 child,但是 child 不能 将方法和字段传递给它的 parent
  • 如果您通过它的超class引用子class的实例(如superclass sc = new subclass();),您不能访问任何子class'成员字段或方法。

作为一般的编程实践,只有当您只需要 object 来根据 [=62] 的特征执行某些操作时,您才会使用更广泛的 class 声明=] class 或接口,而不是任何特定于 class 或接口的 sub-instances。在这种情况下,您应该 避免 使用 parent 并使用 child class 代替,因为您依赖于仅存在的非常具体的行为在 child class.