6

クラスで、オブジェクト作成のプロセス以外Bのクラスのオブジェクトを作成するにはどうすればよいですか(つまり、オブジェクトを作成せずに)?Anull

class A
  {
    public int one;  
   A(A a)
    {
      a.one=1;
    }
  }
class B
  {
   public static void main(String...args)
     {
     //now how to create an object of class A over here.
     }
  }
4

6 に答える 6

7

タイプAのオブジェクトを作成するには、タイプAの別のオブジェクトへの参照、またはnull参照のいずれかをコンストラクターに渡す必要があります。したがって、2つのオプションしかありません。

A a1 = new A(null);
A a2 = new A(a1);

タイプのオブジェクトを初めて作成するときは、タイプAの他のオブジェクトがないため、null参照を使用する必要がありますA


アップデート

質問を変更した後、タイプのオブジェクトを作成することはできないと思いますA

于 2012-06-02T10:22:51.490 に答える
5

私があなたの質問を正しく理解しているなら、あなたは同じタイプの既存のオブジェクトを渡す必要なしにオブジェクトを作成したいと思うでしょう。

これを行うには、タイプAのパラメーターを受け取らないコンストラクターをクラスAに追加するか、既存のパラメーターを変更する必要があります。

class A
    {
        A() {
            // Constructor logic.
        }
        A(A a) {
            // Constructor logic when passing an existing object of the same type, perhaps to create a clone.
        }
    }

何らかの理由でクラスAを変更できない場合は、Mark Byersの回答に従い、コンストラクターにnull参照を渡す必要があります。


アップデート

コードを更新すると、この問題(または思考実験)は解決できなくなります。クラスAは記述どおりにインスタンス化できません。

于 2012-06-02T10:28:01.547 に答える
4

通常、Javaではこれを行うことはできません。

ただし、それは激しい不正行為で可能です。本番コードではこれを行わないでください。しかし、議論のために:

1)Mockitoを使用する場合(ただし、セキュリティマネージャーとは連携しません):

import org.mockito.Mockito;

class B {

    public static void main(String... args) {
        A mockedA = Mockito.mock(A.class);
        A realA = new A(mockedA);
        System.out.println(realA);
    }
}

2)これをオーバーライドする別の方法がありますfinalize()

于 2012-06-02T19:00:21.213 に答える
3

オブジェクトを作成する唯一の方法は、コンストラクターで他のAオブジェクトを与えることですが、他のAオブジェクトもコンストラクターで別のAオブジェクトを必要とします。これは、コンストラクターにnull参照を入れた場合にのみ停止します。

編集

私の答えは、以前のバージョンのコードに基づいていました。コンストラクターを入れることができないため、オブジェクトを作成できなくなりnullました(nullはoneフィールドを持っていません)。Aオブジェクトを作成する場合は、コンストラクターでnullをテストし、nullif (a!=null){ a.one=1;}を渡すか、コンストラクターで既に作成されているAオブジェクトを渡す必要があります。

于 2012-06-02T10:25:56.337 に答える
2

Aが封印されている(編集できない)場合は、そのクラスを拡張して、そのクラスにデフォルトのコンストラクターを与えて、Aの新しいインスタンスに渡すことしかできません。Aのソースコードを変更しない限り、他の解決策はありません。

于 2012-06-02T11:10:11.553 に答える
2

例ではAをインスタンス化できません。鶏が先か卵が先かという問題です。Aのインスタンスを作成するにはAのインスタンスが必要ですが、AのインスタンスがないとAのインスタンスを作成できません。

したがって、Aを変更しないと(「null」チェックを追加するか、デフォルトのコンストラクターを追加するかにかかわらず)、このシナリオでAのインスタンスを作成することはできません。

于 2012-06-02T12:24:12.567 に答える