Javaクラスの変数を別のJavaクラスで使用できるかどうか疑問に思っていました.変数TimeがクラスAで定義および計算されているとします.クラスBでどのように使用できますか?
5 に答える
他の回答は、変数の可視性を高めることを示唆しています。これをしないでください。これはカプセル化を破ります。クラスがフィールドを使用して特定の情報を格納するという事実は、実装の詳細です。代わりに、クラスのAPI(そのメソッド)を介して関連情報を公開する必要があります。ほとんどの場合、フィールドをプライベートにする必要があります。
同様に、他のいくつかの回答は、変数を静的にする可能性を示唆しています。これを恣意的に行わないでください。staticが実際に何を意味するのかを理解する必要があります。つまり、この情報は、型の特定のインスタンスではなく、型に関連しているということです。場合によってはそれが適切なこともありますが、一般的にはテスト不可能なコードへの道であり、多くの場合、明らかに間違っています。たとえば、Person
クラスには変数があるかもしれませんが、それは確かに静的であってはなりません-それは明らかに一name
人の人に関する情報の一部です。
とにかく情報を公開する前に慎重に検討する必要があります-データを断片的に提供するのではなく、問題のクラスが公開できるより広い操作があるかどうかを検討してください-しかし、フィールドの値を公開したい場合は、プロパティを使用してください。例えば:
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
メソッドを介して公開することで、既存のクライアントを壊すことなく、後で実装の詳細を変更できます。
getName()
次に、別のクラスから、メソッドを呼び出すだけです。
// However you end up getting a reference to an instance of Person
Person person = ...;
String name = person.getName();
静的フィールドがある場合は、同じ方法で値を公開できますが、静的メソッドを使用して、クラス名を使用して呼び出します。
変更可能な値を返すことに注意してくださいjava.util.Date
。これは、フィールドへの直接アクセスを許可する代わりにgetterメソッドを使用するもう1つの理由です。必要な場所で、メソッドに防御コピーを返すようにすることができます。
また、Javaのアクセス指定子についても読んでください。
public として宣言されている場合は、 を使用できますClassA.yourVariable
。一方、プライベート アクセス修飾子の場合は、getter をClassA
. で、ClassB
に電話しますClassA.getYourVariable()
。
変数を public または static として宣言すると、別のクラスからアクセスできるようになります。
これは非常に悪い考えです:)
変数が の場合、変数にアクセスできる任意のコードからstatic
参照できます。A.Time
クラス A のすべてに対して1 つのTime
値しかありません。それがインスタンス変数で、a
クラスのインスタンスがある場合A
、変数を として参照できますa.Time
。class のインスタンスごとに個別の値がありますA
。
これには、Java のアクセス ルールが適用されます。
- もしフィールドが
public
_public
final
- フィールドが の場合
protected
、同じパッケージ内または のサブクラス内のコードのみA
がアクセスできます - フィールドにデフォルトのアクセス権がある場合、クラス A と同じパッケージ内のコードのみがアクセスできます
- フィールドが の場合、クラス内の
private
コードA
( の内部クラスを含むA
) のみがアクセスできます。
または、クラス A でアクセサ メソッドを提供できます。
public class A {
. . .
public class getTime() {
return this.Time; // the "this." is optional
}
}