2

私はしばらくの間立ち往生している単純な問題を抱えており、その答えを見つけることができません。基本的に、私はオブジェクトを作成し、静的変数を使用せずに変数にアクセスしようとしています。これは間違った方法であると言われました。これが問題のサンプルコードです。変数に解決できない最初のクラスでエラーを受け取りました。t.name私がやりたいのは、メイン以外の他のメソッドだけでなく、他のクラスでもアクセスできるようにすることです。以前はこれを回避するためTest2.nameに、クラスで変数を静的に使用して作成し、Test2間違っている場合は修正しましたが、それは間違った方法だと思います。どんな助けでも大歓迎です=)

public class Test {
  public static void main(String[] args) {
    Test2 t = new Test2("Joe");         
  }

  public void displayName() {
    System.out.println("Name2: " + t.name);
  }
}

public class Test2 {
  String name;

  public Test2 (String nm) {
    name = nm;
  } 
}
4

5 に答える 5

8

他の人がコードスニペットを投稿しているのを見ますが、実際には、これが機能する理由を投稿していません(この記事の執筆時点)。

コンパイルエラーが発生する理由は、メソッドにあるためです

public static void main(String[] args) {

    Test2 t = new Test2("Joe");         
}

変数tのスコープはまさにその方法です。Test2 tメソッド内にのみ存在するように定義してmain(String[] args)いるため、そのメソッド内でのみ変数を使用できますt。ただし、そのように変数をフィールドにして、Testクラスの新しいインスタンスを作成する場合は、

public class Test {
Test2 t;
public static void main(String[] args) {
    Test test = new Test();
    test.t = new Test2("Joe");  
   test.displayName();
}

public void displayName() {
    System.out.println("Name2: " + t.name);
}
}

Testそうすれば、変数tがクラススコープにあることを宣言しているので、コンパイルエラーは発生しなくなります。

于 2012-06-23T08:51:05.173 に答える
2

メソッドへの引数として、テストオブジェクトへの参照を指定できますdisplayName

public class Test {

    public static void main(String[] args) {    
        Test2 t = new Test2("Joe");         
        displayName(t);
    }

    public static void displayName(Test2 test) {
        System.out.println("Name2: " + test.name);
    }
}

注:displayName静的メソッドも作成しました。メソッド内からは、main参照なしで静的メソッドにのみアクセスできます。

于 2012-06-23T08:45:17.277 に答える
1

Testクラスをこれに変更します

public class Test {
  private static Test2 t;

  public static void main(String[] args) {
    t = new Test2("Joe");         
  }

  public void displayName() {
    System.out.println("Name2: " + t.name);
  }
}
于 2012-06-23T08:45:55.410 に答える
0

getter目的に合わせて使用​​してください。これは問題の副次的な解決策ですが、通常、これはgettersを使用してインスタンス変数を取得する方法です。

public class Test {


public static void main(String[] args) {

    Test2 t = new Test2("Joe");         
    displayName(t);
}

public static void displayName(Test2 test) {
    System.out.println(test.getName());
}
}



public class Test2 
{
private String name;

public Test2 (String nm)
{
    name = nm;
}   

public String getName()
{
     return name;
}
}

クラス内の変数はである必要があることを常に覚えておいてくださいprivate。これにより、クラス外からのアクセスから保護されます。したがって、gettersはそれらにアクセスする唯一の方法です。そして、それらを初期化するためsetterのsまたはs。constructor

于 2012-06-23T08:48:24.830 に答える
0

静力学が少ないほど、私はよく考えます。
Testをインスタンス化し、そのインスタンスでdisplayNameを呼び出してから、Test2のインスタンスをdisplayNameに渡します。しかし、それは全体的な目的が何であるかに依存します

于 2012-06-23T08:49:58.840 に答える