Java类中一个方法调用同类另一个方法是否符合语法规则?
这种写法完全符合Java规则
你在pizzaCodes()方法中调用同一个类的pizzaSizes()方法的写法完全合规,Java本身就允许同一个类的实例方法(非static修饰的方法)之间直接互相调用。
你之前只接触过在main方法里调用方法,是因为main是静态方法,调用实例方法必须先创建类的对象;但pizzaCodes()和pizzaSizes()都是实例方法,它们属于同一个对象实例,所以可以直接调用,不需要额外创建对象,这就是代码能正常运行的原因。
你的代码展示
pizzaCodes()方法
public String pizzaCodes(){ Scanner sc = new Scanner(System.in); System.out.println("Choose your pizza: "); code = sc.next().charAt(0); switch(code){ case 'A', 'a': System.out.println("Pizza: " + pizzaCode[0]); System.out.println("Choose size(R/L): "); pizzaSizes(size); // pizzaSizes() method used in pizzaCodes() method. if(pizzaSize == 'R'){ dPizza = "Chicken Delight: Regular"; price2 = price[0]; }else{ dPizza = "Chicken Delight: Large"; price2 = price[3]; } System.out.println("Quantity?"); quantity = sc.nextInt(); break; case 'B', 'b': System.out.println("Pizza: " + pizzaCode[1]); System.out.println("Choose size(R/L): "); pizzaSizes(size); // pizzaSizes() method used in pizzaCodes() method. if(pizzaSize == 'R'){ dPizza = "Beef Pepperoni: Regular"; price2 = price[1]; }else{ dPizza = "Beef Pepperoni: Large"; price2 = price[4]; } System.out.println("Quantity?"); quantity = sc.nextInt(); break; case 'C', 'c': System.out.println("Pizza: " + pizzaCode[2]); System.out.println("Choose size(R/L): "); pizzaSizes(size); // pizzaSizes() method used in pizzaCodes() method. if(pizzaSize == 'R'){ dPizza = "Cheese Bomb: Regular"; price2 = price[2]; }else{ dPizza = "Cheese Bomb: Large"; price2 = price[5]; } System.out.println("Quantity?"); quantity = sc.nextInt(); break; case 'D', 'd': dPizza = "Super Deals"; System.out.println("Pizza: " + pizzaCode[3]); System.out.println("Choose size(R/L): "); pizzaSizes(size); // pizzaSizes() method used in pizzaCodes() method. System.out.println("Quantity?"); quantity = sc.nextInt(); break; } total = price2 * quantity; totPrice = total + totPrice; if(totPrice > 50){ // if else for applying discount newPrice = totPrice - 20; System.out.println("Discount applied"); System.out.println("Total amount :RM" + String.format("%.2f", newPrice)); }else{ newPrice = totPrice; System.out.println("No discount applied"); System.out.println("Total amount :RM" + String.format("%.2f", newPrice)); } return dPizza; }
pizzaSizes()方法
public String[] pizzaSizes(String[] size){ Scanner sc = new Scanner(System.in); pizzaSize = sc.next().charAt(0); if(pizzaSize == 'R'||pizzaSize == 'r'){ System.out.println("Size: " + size[0]); }else{ System.out.println("Size: " + size[1]); } return size; }
额外的优化建议
虽然代码能运行,但有几个可以改进的地方:
- 避免重复创建Scanner:两个方法都新建了
Scanner,可以在类中声明一个全局的Scanner实例,复用它。 - 减少全局变量依赖:目前
pizzaSizes()是通过修改全局变量pizzaSize传递结果,更合理的做法是让方法直接返回选择的size字符(比如public char pizzaSizes(String[] size)),这样代码的可读性和可维护性更好。 - 消除重复代码:每个
switchcase里的逻辑高度重复,可以把选择size、设置披萨名称和价格的逻辑提取成一个单独的方法,减少冗余。 - 优化方法职责:
pizzaSizes()现在返回传入的size数组,但这个返回值并没有被使用,可以调整方法的返回值为实际选择的size,或者根据需求修改方法的职责。
内容的提问来源于stack exchange,提问作者sakif
相关产品推荐
相关产品推荐

