从另一个方法调用一个方法,其中两个方法都在同一个 class

Calling a method from another method in which both are in the same class

我正在从 main 方法中调用 class 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);         

classmyClass如下:

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()。这可能是什么原因?是不是传参有问题?任何帮助表示赞赏。 =)

你的错误是,当你进入 myMethod 时,你创建了新的 myClass 对象并且这个对象有 count 字段,但是这个字段的值为零,因为这个是新对象。但是您所有的工作和更改 count 字段都会进入您在 main 方法中创建的另一个对象:

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

如果您需要如此简单的示例,请尝试在字段 count:

上使用 static modifier
static int count = 0;

编辑findRoom方法:

    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);
}

首先,我建议您多了解对象和 classes。在方法 myMethod() 中的代码中,第一个语句用于创建 myClass 的新对象。当您创建它时,就像您正在获取 class 属性的全新副本。 (如果它们不是静态的)所以它总是会给你变量 count 和你给它的值,即 0.
如果您的代码必须记住赋予 class 变量的值而不取决于您创建的对象,则必须将它们设为静态。然后你可以在不创建对象的情况下调用这些变量。

myClass.count;

所以你要做的就是将 int count=0; 替换为 static int count=0; 还有一些可以改进编码的东西。

  • class 名称以大写字母开头(这不是规则,而是一种很好的做法)
  • 详细了解静态和非静态之间的区别methods/variables。
  • 通常 class 变量与 private 访问修饰符一起使用。 (用于封装)

像这样应该可以解决问题:

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);
        }

    }

}

递归(调用自身的方法),使您不必创建两个方法,并且在 'if statement' 中使用 arrayName.length 将避免您在决定使用时对条件进行硬编码一组更大的数组。