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内部有一些我想要访问

好的,所以最近我意识到我对java内部的扩展和继承有一些误解

到目前为止,我的理解是你不能这样做

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();