0

Java のスーパークラス タイプのメソッドでサブクラスを返すときに何が起こるかについての詳細を見つけるのに苦労しています。例えば:

    public class SuperClass
    {
        int a;
    }
    public class SubClass extends SuperClass
    {
        int b;
    }


    SuperClass superObj;
    SubClass subObj;

    private SuperClass getObject ()
    {
        return subObj;
    }


    public static void main (...)
    {
        superObj = getObject();
    }

スーパークラスとして返された場合、subObj は正確にどうなりますか? この例を入力しているときに、おそらく自分で簡単にテストできることに気付きましたが、これが発生したときのプロセスが正確に何であるか、およびそれが良い(機能する場合)または悪い習慣と見なされるかどうかについてはまだ興味があります.

現在、2 つの抽象基本クラスと、それぞれにいくつかのサブクラスがあるプロジェクトに取り組んでいるため、質問しています。抽象基本クラスを使用するときに追加される便利なポリモーフィズムを使用しながら、あるサブクラスから別のサブクラスに変更する必要があることを処理するための良い/悪い方法を見つけようとしています。

編集: メインとクラスの宣言を修正しました。申し訳ありません。

4

3 に答える 3

1

キャストは、基本的にオブジェクトを別の型に変更するのではなく、オブジェクトをそのスーパークラス (ダウンキャストの場合はサブクラス) として表示するようにコンパイラに指示するだけです。あなたの例では、superObj はまだ SubClass タイプのインスタンスですが、SuperClass のように見えます。つまり、 を参照しようとするsuperObj.bと、コンパイル エラーが発生します (スーパークラスには b が存在しないため)。ただし、参照できます(SubClass)superObj.b。この場合、コンパイラに subClass を SubClass のインスタンスと見なすように指示しています (実際にはそうです)。

これをさらに一歩進めて、コードに別のクラスを追加しましょう。

public class SisterClass extends SuperClass
{
    int c;
}

コードの他の部分 (構文の問題以外) を変更せずに、 を参照しようとします((SisterClass)superObj)。これはコンパイルされますが、ClassCastRuntime ランタイム エラーで失敗します。SisterClass は SuperClass のサブクラスですが、superObj は SisterClassのインスタンスではありません。したがって、オブジェクトが実際に何であるかにのみキャストできます

于 2013-07-25T16:29:32.463 に答える
0

あなたのコードにはいくつかの奇妙な点があります (main 内でメソッドを定義していますか?) が、それは我慢できません... getObject メソッドは subObj を変更せず、SuperClass 型のように見えるそれへの参照を返すだけです。「似ている」とは、SuperClass のメソッドまたはメンバーのみを公開することを意味します。ただし、その戻り値を取得して SubClass にダウンキャストしようとすると、キャストは成功し、SubClass からのフィールド/メソッドは、SuperClass として返された情報を失うことなく期待どおりに機能することがわかります。

于 2013-07-25T16:11:12.243 に答える
0

SubClass は SuperClass の拡張です

基本クラスにキャストしているだけで、すべての拡張機能は利用できません。さまざまな方法で何度も拡張できるため、それが何であるかを推測するため、それらを実装に戻そうとする必要はありません。

返されるクラスにはaがありますが、 bはありません

于 2013-07-25T16:06:59.210 に答える