0

くだらないタイトルで申し訳ありませんが、Java の質問に対するより良いバージョンを思いつきませんでした。現在、Java バージョン: 1.6.0_18 および Netbeans バージョン: 6.8 を使用しています。

それでは質問です。

私が行ったことは、保護されたintプロパティを1つだけ持つクラスを作成し、次にintプロパティを特定の値に設定するパブリックメソッドを作成しました。次に、そのクラスのオブジェクトを作成し、そのパブリック メソッドを使用して int プロパティを 5 に設定しました。このオブジェクトを取得して保護された int プロパティを公開する別のクラスを作成するには、あなたの助けが必要です。

これを行うと考えられる方法は、そのクラスを継承するサブクラスを作成してから、スーパークラスの int プロパティを取得するメソッドを作成することでした。int プロパティを取得するコードの作成には成功しましたが、この新しいサブクラスを使用してスーパー クラスのオブジェクトを参照する方法がわかりません。

これまでに私が持っている2つのクラスは次のとおりです。

パブリッククラスA
{
  保護された int iNumber;

  public void setNumber ( int aNumber )
  {
    iNumber = aNumber;
  }
}
public class B は A を拡張します
{
  public int getNumber()
  {
   super.iNumber を返します。
  }
}

「A」のオブジェクトを作成し、そのメソッドを使用して、次のようにプロパティを 5 に設定しました。

objA = 新しい A();
objA.setNumber ( 5 );

ここで、「B」のオブジェクトを作成して、「objA」のプロパティに格納されている int を出力したいと考えています。私はこのコードを実行しようとしました:

B objB = (B) objA;
String aNumber_String = String.valueOf( objB.getNumber() );
System.out.println( aNumber_String );

しかし、最初の行に「java.lang.ClassCastException」というエラーが表示されました

B objB = (B) objA;

とにかく私がやろうとしていることはありますか?

PSクラスAを編集したくないので(選択の余地がない限り)、ゲッターメソッドを与えることでこのアイデアを機能させたいと思っています。

PPSまた、プロパティを非公開にして公開セッター/ゲッターメソッドを使用するのではなく、公開するのが「悪い」考えであることは知っていますが、私はこの方法が好きです:)。

編集:コードタグを追加

4

3 に答える 3

1

A オブジェクトを B にキャストすることはできません。getNumber を呼び出す場合は、実際の B オブジェクトが必要です。

B objB = new B();
objB.setNumber ( 5 );
System.out.println( objB.getNumber() );

キャストは必要ありません。

于 2010-04-29T01:38:42.373 に答える
1

ラインの場合

B objB = (B) objA;

class のオブジェクトは class のオブジェクトでAはないBため、キャストは許可されません。

Aとの間のクラス関係Bは、つまりB is-a Aです (クラスBが extendsであるためA) ですが、この場合、逆は言えません。

以下が存在する例を次に示します。

  • クラスAnimal
  • クラスDog拡張Animal

上記の例で試みられているのは、 を にキャストするAnimalことDogです。

Dog dogObject = (Dog)animalObject;  // Not allowed.

Animalすべての s がsであるとは限らないため、必ずしもそうであるとは限りませんDog。私たちが知っている限りでは、はを拡張animalObjectするクラスのインスタンスである可能性がありますが、これは絶対に ではありません。CatAnimalDog

于 2010-04-29T01:39:18.070 に答える
0

他の人が言ったように、関係のために A オブジェクトを B にキャストすることはできません。私が追加したいのは、クラスが 1 つしかないように聞こえるが、他のオブジェクトが数値の値を読み取れないようにする状況がいくつかあるということです。これはインターフェースで提供する方が良いと思います。setNumber(int) メソッドのみを持つようにインターフェイスを定義します。クラスを定義して、getNumber() メソッドと setNumber(int) メソッドの両方を持ち、「setter」インターフェースを実装します。次に、A オブジェクトをパラメーターとして受け入れるメソッドがある場合は、インターフェイスを受け入れるように変更します。

これにより、オブジェクトの値を取得できないコードを作成できますが、クラスを 1 つだけ定義することでコードを簡素化できます。

于 2010-04-29T01:56:34.640 に答える