我有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
}
}
答案 0 :(得分:3)
超类不能知道子类方法。
以这种方式思考:
您有一个超类Pet
您有两个Pet
的子类,即:Cat
,Dog
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()的存在。因此,您得到了上述错误。下图说明了发生的事情:
答案 3 :(得分:0)
这不起作用,因为您正在执行narrowing reference conversion。来自JLS:
从任何引用类型S到任何引用类型T,前提是S是T的适当超类型(§4.10)
在您的方案中,subclass
是superclass
的正确子类型。这意味着允许将subclass
的实例声明为superclass
:
superclass sc = new subclass();
正如您之前发现的那样。
但是,class members只能通过继承传输;也就是说,超类可以将字段和方法传递给它的子类,但子类不能对其超类执行相同的操作。
来自JLS:
类类型的成员都是以下所有:
成员继承自其直接超类(第8.1.4节),但类Object中没有直接超类
从任何直接超接口继承的成员(第8.1.5节)
- 中宣布的成员
在班级(第8.1.6节)
将所有这些相当大的词组合在一起:
superclass sc = new subclass();
中所述),则无法访问任何子类的成员字段或方法。作为一般编程实践,唯一一次使用更广泛的类声明的时候,只需要该对象根据父类或接口的特征进行某些操作,而不是特定于子实例的任何操作类或接口。在这种情况下,您应该避免使用父级,而是使用子级,因为您依赖于仅存在于子级别中的特定行为。