Java:转换和继承
好的,所以最近我意识到我对java内部的扩展和继承有一些误解 到目前为止,我的理解是你不能这样做Java:转换和继承,java,inheritance,classcastexception,extends,Java,Inheritance,Classcastexception,Extends,好的,所以最近我意识到我对java内部的扩展和继承有一些误解 到目前为止,我的理解是你不能这样做 MySubClass myClass = (MySubClass) new MyClass(); 这对我来说很有意义,但是有一些我不知道如何成功的GAB和解决方法,例如,如果一个人试图从返回超类的方法中获取子类。例如: public static MyClass getNewMyClass() { return new MyClass(); } 在MySubClass内部有一些我想要访问
MySubClass myClass = (MySubClass) new MyClass();
这对我来说很有意义,但是有一些我不知道如何成功的GAB和解决方法,例如,如果一个人试图从返回超类的方法中获取子类。例如:
public static MyClass getNewMyClass() {
return new MyClass();
}
在MySubClass内部有一些我想要访问的特定方法,比如
public void sayBye() {
System.out.println("Bye.");
}
所以我想我需要做的是
((MySubClass) myClass).sayBye();
…但这当然会引发ClassCastException
摘要/问题
所以基本上我的问题是,如何从方法中获取返回类的子类,或者是否可能
示例:MyClass.getNewMyClass返回一个新的MyClass,但我想在其子类MySubClass中使用方法sayBye
更多信息
我问这个问题的原因是因为我正在尝试为自己创建一个API,它基本上会缩短我试图完成的开发。在我的一个类中,它包含一大堆返回MyClass的方法。一些方法示例可以是公共MyClass getNewMyClass{}、公共MyClass FindMyCyclassString name{},等等
但是当我开始为一些额外的方法执行MyClass时,我从返回MyClass的超类中得到了大约10个方法,所有这些基本上都让我回到了开始。是否有返回类的可能性你不能让动物吠叫,只有动物的一个子类,狗可以吠叫
同样,您不能在超类实例上调用子类方法。面向对象的概念与现实世界非常相似。MySubClass是MyClass可以接受的回报。相反,我将返回新的MySubClass,它将能够调用子类方法。多态性适用。试图从超类中获取子类的麻烦在于您不知道它是什么子类。您可以在强制转换之前先执行instanceof检查,这样可以避免ClassCastException,但这很糟糕。理想情况下,应该让方法返回层次结构中尽可能高的对象,但如果需要属于子类的方法,则应该是该方法的返回类型 编辑: 您的更多信息有点模糊,但这是合法的:
public class MyClass {
public MyClass getNewMyClass(){
return new MyClass();
}
}
public class MySubClass extends MyClass{
@Override
public MySubClass getNewMyClass() {
return new MySubClass();
}
}
所有的丰田都是汽车,但不是所有的汽车都是丰田。这与这里有什么关系?在这个例子中,汽车类似于你们的MyClass,丰田类似于你们的MyClass 如果将对象创建为汽车,则无法访问Toyota内部的方法。但是,如果您创建一个对象作为Toyota,您确实可以访问车内的公共或受保护的方法
如果你是MyClass和MySubClass的设计者,你认为“再见”是一种在父级可以访问的方法,那么也许你需要考虑重新设计/重构并在父类中做一个再见方法。
< P>:((MySubClass) myClass).sayBye();
并不总是抛出ClassCastException,正如您所说,但它取决于变量myClass引用的对象的实际更具体类型
如果变量MyClass MyClass引用了类MySubClass的对象,则强制转换不会引发任何异常
但关键是,如果你想调用一个对象的方法,这个方法必须在该对象的类或某个超类中定义和实现,而你不能在一个对象上调用方法,因为这个方法只在它的一些子类中实现,因为在这种情况下,该方法不存在于该对象中,而仅存在于其子类的对象上。如果该对象是MyClass类型,那么它就不是MySubClass类型。因此,基本上,如果一个类有一大堆返回MyClass的方法,那么我希望这些方法在MySubClass中加上一些额外的方法,我必须重新声明所有这些?Java中的对象与真实对象的工作方式非常相似。有了电话,你就可以打电话了。有了智能手机,你还可以观看视频。智能手机扩展了手机。如果你去买手机,你将无法观看视频。如果你真的买了一部智能手机,你就只能看视频了。因此,如果一个方法返回一个MyClass实例,那么您将无法使用仅存在于MySubClass中的方法。请尝试委派而不是继承,这几乎总是对此类问题进行排序
public class MySubClass extends MyClass {
public MySubClass(String name) {
super(name);
}
public static MySubClass doMath() {
// Got the new instance of MyClass
MyClass myClass = getNewMyClass();
// And turned it into a MySubClass with myClass' properties.
myClass = new MySubClass(myClass.getName());
return (MySubClass) myClass;
}
public void sayBye() {
System.out.println("Bye.");
}
}
public class MyClass {
public MyClass getNewMyClass(){
return new MyClass();
}
}
public class MySubClass extends MyClass{
@Override
public MySubClass getNewMyClass() {
return new MySubClass();
}
}
((MySubClass) myClass).sayBye();