1

次の2つのクラスがあります。

public class Class1
{
    public Class1 randomvariable; // Variable declared

    public static void main(String[] args)
    {
        randomvariable = new Class1(); // Variable initialized
    }
}

public class Class2
{
    public static void ranMethod()
    {
        randomvariable.getSomething(); // I can't access the member "randomvariable" here even though it's public and it's in the same project?
    }
}

私はそれが私がここで見逃している非常に基本的なことであると確信していますが、私は実際に何を見逃していますか?Class1メンバー「randomvariable」はパブリックであり、クラスもパブリックであり、両方のクラスは同じプロジェクトにあります。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

7

2つの問題があります:

まず、のインスタンスがなくても、randomvariableからに値を割り当てようとしています。これは、暗黙的にそうであるように、インスタンスメソッドでは問題ありませんが、これは静的メソッドです。mainClass1randomvariablethis.randomvariable

次に、関与Class2.ranMethodするインスタンスがない状態で、から値を読み取ろうとしています。Class1

インスタンス変数とは何かを理解することが重要です。これは、クラスの特定のインスタンスに関連付けられた値です。したがって、というクラスがある場合Personは、という変数がある可能性がありますname。今Class2.ranMethod、あなたは効果的に書いているでしょう:

name.getSomething();

それは意味がありません。まず、このコードを関連付けるPersonことはまったくありません。次に、どの人物が関与しているかはわかりません。

同様に、mainメソッド内ではインスタンスがないため、コンテキストを取得していません。

これが機能する代替プログラムであるため、違いがわかります。

public class Person {
    // In real code you should almost *never* have public variables
    // like this. It would normally be private, and you'd expose
    // a public getName() method. It might be final, too, with the value
    // assigned in the constructor.
    public String name;

    public static void main(String[] args) {
        Person x = new Person();
        x.name = "Fred";
        PersonPresenter.displayPerson(x);
    }
}

class PersonPresenter {

    // In a real system this would probably be an instance method
    public static void displayPerson(Person person) {
        System.out.println("I present to you: " + person.name);
    }
}

コメントからわかるように、これはまだ理想的なコードではありませんが、元のコードにかなり近づけたいと思いました。

ただし、これは機能するようになりました。特定のインスタンスmainのインスタンス変数の値を設定しようとしています。同様に、パラメーターとしてインスタンスへの参照が与えられるため、そのインスタンスの変数の値を見つけることができます。presentPersonname

于 2012-05-20T19:56:44.543 に答える
1

アクセスしようとするときrandomvariableは、それがどこにあるかを指定する必要があります。非静的クラスフィールドであるClass1ため、を取得するにはのインスタンスが必要randomvariableです。例えば:

Class1 randomclass;
randomclass.randomvariable.getSomething();

代わりに静的フィールドである場合、つまりインスタンスごとに1つではなく、クラスごとに1つしか存在しない場合は、クラス名を使用してアクセスできます。

Class1.randomvariable.getSomething();
于 2012-05-20T19:56:57.097 に答える