如何将子类对象转换为超类对象
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
的子类,即:Cat
、Dog
- 两个子类将共享相同的特征,例如
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)
在您的场景中,subclass
是 superclass
的适当子类型。这意味着可以将 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.
我有 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
的子类,即:Cat
、Dog
- 两个子类将共享相同的特征,例如
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)
在您的场景中,subclass
是 superclass
的适当子类型。这意味着可以将 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.