从另一个方法调用一个方法,其中两个方法都在同一个 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 将避免您在决定使用时对条件进行硬编码一组更大的数组。
我正在从 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 将避免您在决定使用时对条件进行硬编码一组更大的数组。