2016-07-16 1 views
0

나는 main 방법에서 클래스 myClass에있는 방법 findRoom() 호출 오전 :모두 같은 클래스에있는 또 다른 방법에서 메서드를 호출

int room[]= {1,2,3,4,5,6,7,8,9,10}; 
String customer[] = {"","Shay","","Yan","Pan","","","Xiao","Ali",""}; 
    myClass m = new myClass(); 
    m.findRoom(customer, room);   

은 다음 클래스 myClass가 될 때 :

class myClass { 

int count = 0; 

public void findRoom(String customerName[], int roomNo[]) { 

    Scanner sc = new Scanner(System.in); 
    System.out.println("Please enter Customer's Name"); 

    String name = sc.next(); 

    for (int i = 0; i < 10; i++) { 

     if (customerName[i].equalsIgnoreCase(name)) { 
      System.out.println(roomNo[i]); 
      count++; 
      break; 
     } else { 
      count++; 

     } 
    } 
    myMethod(customerName, roomNo); 
} 

public void myMethod(String cusName[], int rooms[]) { 
    myClass m = new myClass(); 
    if (m.count == 10) { 
     System.out.println("Please check the name again"); 
     m.count = 0; 
     m.findRoom(cusName, rooms); 
    } 
} 
} 

사용자가 입력 한 이름이 배열 customer[]에없는 경우 사용자가 고객의 이름을 다시 입력하라는 메시지가 프로그램에 표시됩니다. 그래서 나는 myMethod()이라는 메쏘드를 만들었고, 사용자에게 고객의 이름을 다시 입력하라고 요구할 것입니다.

사용자가 배열에 이미있는 이름을 입력해도 사용자가 배열에없는 이름을 입력하면 프로그램이 제대로 작동합니다. 방법 myMethod()이 호출되지 않습니다. 이것에 대한 가능한 이유는 무엇일까요? 매개 변수 전달에 문제가 있습니까? 어떤 도움을 주셔서 감사합니다. =)

+3

언제나 항상 클래스 이름은 대문자로 시작해야합니다. –

+0

myMethod를 호출하여 새 MyClass 객체를 만들 때마다 항상 클래스 이름을 사용해야합니다. 메서드에서 if 조건을 만족하지 못하는 새로 만든 객체의 인스턴스 변수 (개수)에 액세스하고 있습니다. –

답변

1

사용자가 실수로 myMethod에 들어가면 새 myClass 개체를 만들고이 개체의 필드는 count이지만이 개체의 값은 0입니다. 새 개체이기 때문에이 필드의 값은 0입니다. 그러나 모든 작업과 count 필드를 변경하면 main 방법에서 만든 다른 개체에가는 :

static int count = 0; 

편집 findRoom : 당신이 그렇게 간단한 예 필요한 경우

myClass m = new myClass(); 
m.findRoom(customer, room); 

, 필드 countstatic modifier를 사용하려고 방법 :

myClass.count++; 
    break; 
} else { 
    myClass.count++; 

편집 myMethod 방법 :

if (myClass.count == 10) { 
    System.out.println("Please check the name again"); 
    myClass.count = 0; 
    m.findRoom(cusName, rooms); 
} 
+0

대단히 고맙습니다. 그것은 효과가 있었다. =) –

0

우선 개체 및 클래스에 대해 자세히 알아 보시기 바랍니다. 코드 myMethod()에서 첫 번째 문은 myClass의 새 개체를 만드는 것입니다. 그것을 만들 때 클래스 속성의 새로운 사본을 얻는 것과 같습니다. (정적이 아닌 경우) 항상 0으로 설정된 값으로 변수 수를 제공합니다.
클래스 개체에 의존하지 않고 클래스 변수에 주어진 값을 기억해야하는 경우 그것들을 정적으로 만드십시오. 그런 다음 객체를 만들지 않고 변수를 호출 할 수 있습니다.

myClass.count; 

그래서 당신은 당신의 코딩을 개선하기 위해 static int count=0; 및 몇 가지로 int count=0;을 대체한다 무엇을해야. 대문자와

  • 시작 클래스 이름 (이 규칙은 아니지만 좋은 연습)
  • 정적 및 비 정적 메서드/변수의 차이에 대해 자세히 알아보십시오.
  • 일반적으로 클래스 변수는 private 액세스 수정 자와 함께 사용됩니다.(캡슐화) 트릭해야이 같은
+0

팁과 설명에 감사드립니다. =) –

+0

@DindiRave Stack Overflow의 감사 방법은 투표입니다. –

+0

나는 당신의 대답을 upvote 했어.하지만 개인적으로 cz ur 설명이 내가 수업과 물건에 관해 가지고 있던 의구심을 정리하는데 도움이되었다는 것에 고마워해야했다. –

0

뭔가 :

import java.util.Scanner; 
public class MyClass { 


    static int[] room; 
    static String[] customer; 



    public static void main(String[] args) { 

     room = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
     customer = new String[]{"", "Shay", "", "Yan", "Pan", "", "", "Xiao", "Ali", ""}; 

     MyClass mc = new MyClass(); 
     mc.findRoom(customer, room); 

    } 



    public void findRoom(String customerName[], int roomNo[]){ 

     Scanner sc = new Scanner(System.in); 
     System.out.println("Please enter the Customer's name."); 
     String name = sc.next(); 

     int count = 0; 


     for(int i = 0; i < customerName.length; i++){ 
      if(customerName[i].equalsIgnoreCase(name)){ 

       System.out.println(name + " is in room number " + roomNo[i]); 
       break; 
      } 
      else{ 
       count++; 
      } 
     } 

     //##### RECURSION STARTS HERE ##### 
     if(count == customerName.length){ 

      count = 0; 
      System.out.println("Name not found, please try again.\n"); 
      findRoom(customerName, roomNo); 
     } 

    } 

} 

재귀 (방법 자체에 호출), 또한, 두 가지 방법을 만들 필요 내 arrayName.length를 사용에서 당신을 저장하는 ' if 문 '을 사용하면 더 큰 배열 집합을 사용하기로 결정한 경우 조건을 하드 코딩하지 않아도됩니다.

관련 문제