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

时间:2015-05-23 16:11:07

标签: java inheritance casting subclass superclass

我有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
   }
}

4 个答案:

答案 0 :(得分:3)

超类不能知道子类方法。

以这种方式思考:

  • 您有一个超类Pet

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

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

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

答案 1 :(得分:1)

看一下java继承:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

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

答案 2 :(得分:0)

即使super和sub对象都指向内存中的同一个对象,你的超级对象也不知道sub.subMethod()的存在。因此,您得到了上述错误。下图说明了发生的事情:

enter image description here

答案 3 :(得分:0)

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

  

从任何引用类型S到任何引用类型T,前提是S是T的适当超类型(§4.10)

在您的方案中,subclasssuperclass的正确子类型。这意味着允许将subclass的实例声明为superclass

superclass sc = new subclass();

正如您之前发现的那样。

但是,class members只能通过继承传输;也就是说,超类可以将字段和方法传递给它的子类,但子类不能对其超类执行相同的操作。

来自JLS:

  

类类型的成员都是以下所有:

     
      
  • 成员继承自其直接超类(第8.1.4节),但类Object中没有直接超类

  •   
  • 从任何直接超接口继承的成员(第8.1.5节)

  •   
  • 在班级(第8.1.6节)

  • 中宣布的成员   

将所有这些相当大的词组合在一起:

  • 您正在向上从子级到父级的继承链
  • 父级可以将方法和字段传递给其子级,但子级不能将方法和字段传递给其父级
  • 如果您通过其超类引用子类的实例(如superclass sc = new subclass();中所述),则无法访问任何子类的成员字段或方法。

作为一般编程实践,唯一一次使用更广泛的类声明的时候,只需要该对象根据父类或接口的特征进行某些操作,而不是特定于子实例的任何操作类或接口。在这种情况下,您应该避免使用父级,而是使用子级,因为您依赖于仅存在于子级别中的特定行为。