2017-02-21 22 views
1

私は何かに取り組んでいます。短くてシンプルにするために、2つのクラスがあります。 1つのクラスは、すべてのプログラムが実行されるクラスと、使用されるコードを記述するクラスです。私はすべてのプログラムが実行されるクラスにxとyの整数を持ち、xまたはyを1つ上げたり下げたりするメソッドが必要です。私はその人が4つの選択肢を持つswitch文を持っていますxとyの値が上がったり下がったりするかどうかは、どの選択によって決まるかによって決まります。複数の方法で1つの整数を使用する

import java.util.Scanner; 
public class Walking { 
public void NorthSouthEastWest(){ 
    int x = 0; 
    int y = 0; 
    boolean direction = false; 
    Scanner input = new Scanner(System.in); 

    do{String userDirection = input.nextLine(); 

     switch(userDirection){ 
      case "North": 
       direction = true; 
       y++; 
       break; 
      case "South": 
       direction = true; 
       y--; 
       break; 
      case "East": 
       direction = true; 
       x++; 
       break; 
      case "West": 
       direction = true; 
       x--; 
       break; 
      default: 
    } 
}while(direction == false); 

が、私はプログラムを実行すると、私はswitch文のためにコマンドを入力する前と後の私は、xとyをプリントアウトし、xとyがちょうど変更されません。なぜ私は分かりません。どんな解決策ですか?

+0

すべての構文の最初には、間違っています。関係ないと思われる – Akshay

+0

私は両方のクラスでxとyを持っていると思いますか?だから、あなたは1つのクラスの1つのxを変更し、他のクラスの他のxを印刷しますか? – IQV

+0

@Akshay間違っているわけではありません。それを 'while(!direction);'と書くほうが良いでしょうが、それは正しいです。 –

答えて

-2

あなたは、このようなスキーマを使用することができます。

public class YourClass { 
    public int x; 
    public int y; 

    public void NorthSouthEastWest(){ 
//  your logic, don't do int x = 0; int y = 0; 
    } 

    public static void main(String[] args) { 
     YourClass yourClass = new YourClass(); 

     yourClass.printXY(); 

     yourClass.NorthSouthEastWest(); 

     yourClass.printXY(); 
    } 

    public void printXY() { 
     System.out.println("x=" + x + ", y=" + y); 
    } 
} 
+0

しかし、彼は他のクラスでxとyを戻さない。 – IQV

+2

ものを変更しません。プリミティブラッパーは、プリミティブと同じように不変です。 –

+0

私はそれを試して、うまくいったが、悲しいことに、それは私が望んでいたxとyを上げなかった。私はそれが何が育ったか分からないが、私が必要とするクラスのxとyではなかった。しかし、試していただきありがとうございます。 –

2

あなたがそれら(のx & y)を使用すると、それらの値を変更したいときに渡していることを確認していますか? Javaはメソッド引数を参照渡ししませんので、それを見てみてください。

3

プリミティブとプリミティブラッパーはJavaでは変更できません。したがって、変更可能なオブジェクトにプリミティブとラッパーをラップするのが良い解決策です。

以下は、クラスの例です。xyの座標を保持しています。

import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) { 
     Location location = new Location(); 
     Walking walking = new Walking(); 
     walking.northSouthEastWest(location); 

     System.out.println(location.x); 
     System.out.println(location.y); 
    } 
} 

class Location { 
    int x; 
    int y; 
} 

class Walking { 
    public void northSouthEastWest(Location location) { 
     boolean direction = false; 
     Scanner input = new Scanner(System.in); 

     do { 
      String userDirection = input.nextLine(); 

      switch (userDirection) { 
       case "North": 
        direction = true; 
        location.y++; 
        break; 
       case "South": 
        direction = true; 
        location.y--; 
        break; 
       case "East": 
        direction = true; 
        location.x++; 
        break; 
       case "West": 
        direction = true; 
        location.x--; 
        break; 
      } 
     } while (!direction); 
    } 
} 

カスタムLocation様オブジェクトを使用しない場合、あなたは、2つの要素を持つint[]配列を使用することができます。

0

xおよびy変数は、NorthSouthEastWest()メソッドで宣言されています(慣習的には、Javaのstartメソッドでは小文字が使用されます)。それらはローカルスコープを持ち、宣言されたメソッドでのみ表示されます。

xおよびy変数に別のメソッドからアクセスする場合は、それらをインスタンス変数またはクラス変数として宣言します。リンクに続いて、あなたが問題を理解するのに役立つ必要があります。たとえばThe Java Tutorials - Variables

を:(方向== false)をしながら、

public class Walking { 
    // These could also be declared as static variables 
    private int x; 
    private int y; 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    // Rest of your code... 
} 
関連する問題