1

getter/setter を使用して子クラスに色を設定しようとしていますが、コンパイル エラーが発生します。

//world.java
import java.awt.Color;

public class world {
    private Color color;

    public Color getColor() {
        return color;
    }
    public void setColor(Color color) {
        this.color = color;
    }
}

//object.java
public class object extends world {
    public object{
        setColor(new world.Color(255,0,0); //compile error
    }
}

java.awt.Colorこれは、子にインポートして と入力することで簡単に解決できますsetColor(new Color(255,0,0)が、親に既にインポートされている場合は冗長ではありませんか? などの他の構文も試しましsetColor(world.setColor(new Color(255,0,0)))たが、別のエラーが発生します。これを正しく行うための正しい構文は何ですか?

4

4 に答える 4

1

の使用new world.Color(255,0,0);は、いくつかの点で正しくありません。Java コンパイラの場合、world という名前のクラスに対して Color という名前の内部静的クラスを要求します。これをコードベースに追加しても、コンパイル エラーは発生しません。

//world.java (different to World.java)
class world {
    public static class Color {
         public Color(int r, int g, int b) {}
    }
}

したがって、を使用してこれを修正できますnew Color(255, 0, 0);

また、インポートステートメントは冗長ではありません。Java では、すべての Java ファイルがコンパイル単位を定義します。このユニットはそれ自体を表します。タイプによって参照するすべてのクラス (直接名前が付けられたクラス/インターフェース) は、パッケージ名、クラス名、およびその定義 (内部クラス/インターフェース、無名クラスなど) を知るだけで解決可能でなければなりません。Color は別のパッケージに由来するため、コンパイル ユニット (Java ファイル) にはクラス Color への参照が含まれている必要があります。これは、import ステートメントを使用するか、Color クラスをフルネーム (= パッケージ + "." + クラス名) で参照することによって実行できます。これは、java.awt.Color を意味します。

于 2013-10-02T22:55:38.297 に答える
0

単純に

   setColor(new Color(255,0,0); //no compile error

importクラスを使用する各ファイルにステートメントが必要です...)

説明:

手元のクラスが拡張されますworld。つまり、 setColor() メソッドは、再度宣言することなく「すぐそこに」あることを意味します。明示的に指定せずにcolor、クラスのインスタンスフィールドを適切に設定します...静的修飾子を持つメソッドとフィールドは、クラスのインスタンスではなく、常にクラス自体に関連していますworld

なぜ機能しないのsetColor(world.setColor(new Color(255,0,0)))ですか?

この構文は、クラスの静的メソッドにアクセスするためのものですworldが、そのようなメソッドは存在しません。色の値はクラスの各インスタンスに個別に関連付けられているため、この場合は完全に適切な非静的メソッドがあります。したがって、この場合、world.setColor() 構文は有効ではありません。

OPのコメントに従って、ゲームオブジェクトがワールドにスワップされました

取るべきいくつかのルール

  • 大文字で始まるクラス名
  • JDK ライブラリ クラスに似ている、またはまったく同じ名前を使用しないでください。オブジェクト、文字列などに特に当てはまります!!!
于 2013-10-02T22:52:17.403 に答える
0

いいえ、importスーパークラスを含むファイルで指定されているという理由だけで、an は冗長ではありません。のimportスコープは、それが配置されているソース ファイルです。別のソース ファイルにあるサブクラス (またはその他のクラス) には、独自のインポートが必要です。

import java.awt.Color;子クラスのソース ファイルで再度、Color単純な名前で参照できます。

setColor(new Color(255, 0, 0));

または、必要に応じて完全修飾参照を指定できます。

setColor(new java.awt.Color(255, 0, 0));

JLSのセクション 6.3には、インポートの範囲について次のように書かれています。

single-type-import 宣言 (§7.5.1) または type-import-on-demand 宣言 (§7.5.2) によってインポートされる型のスコープは、すべてのクラスおよびインターフェイス型宣言 (§7.6) です。インポート宣言が表示されるコンパイル ユニット、およびコンパイル ユニットのパッケージ宣言 (存在する場合) の注釈。

「コンパイル単位」とは、ソースコードファイルを意味します。

于 2013-10-02T22:53:58.963 に答える
0

ここでの問題は、Color クラスが world のメンバーでnew world.Color(255,0,0)はないため、有効でないことです。その点では、あなたは言うことができますnew Color(255,0,0)

つまり、worldクラスが をインポートしていても、 をColor定義していないということColorです。

于 2013-10-02T22:54:17.143 に答える