为何调用Getter-Setter方法时第二个程序出现“cannot find symbol”错误?
我正在完成大学作业,要求在Sandwich.java中使用getter和setter方法,供TestSandwich.java调用。现有Sandwich类定义了PrimaryIngredient、Loaf、Cost三个内部类,各自包含对应属性的getter和setter方法;TestSandwich类创建Sandwich实例后,调用其setMainIngredient、setBread、setPrice方法,期望输出指定内容,但执行时提示“cannot find symbol”错误,指向setMainIngredient方法。
原Sandwich类代码
class Sandwich { public static void main(String[] args){} public class PrimaryIngredient{ private String mainIngredient; public String getMainIngredient(){return mainIngredient;} public void setMainIngredient(String newMain){this.mainIngredient = newMain;} } public class Loaf{ private String bread; public String getBread(){return bread;} public void setBread(String newBread){this.bread = newBread;} } public class Cost{ private double price; public double getPrice(){return price;} public void setPrice(double newPrice){this.price = newPrice;} } }
原TestSandwich类代码
class TestSandwich { public static void main (String args[]) { Sandwich sandwich = new Sandwich(); sandwich.setMainIngredient("tuna"); sandwich.setBread("wheat"); sandwich.setPrice(4.99); System.out.println("You have ordered a " + sandwich.getMainIngredient() + " sandwich on " + sandwich.getBread() + " bread, and the price is " + sandwich.getPrice()); } }
错误信息
TestSandwich.java:6: error: cannot find symbol sandwich.setMainIngredient("tuna"); ^ symbol: method setMainIngredient(String) location: variable sandwich of type Sandwich
问题原因
你把setMainIngredient、setBread、setPrice这些方法放在了Sandwich的内部类(PrimaryIngredient、Loaf、Cost)里,而不是直接定义在Sandwich类本身。TestSandwich里调用的是Sandwich实例的方法,但Sandwich类根本没有这些方法,所以编译器找不到对应的符号。
解决方案1:直接将属性和方法定义在Sandwich类中(更符合作业需求)
这种方式更简单,也符合常规类设计,把三明治的属性直接放在Sandwich类里,然后提供对应的getter和setter:
class Sandwich { private String mainIngredient; private String bread; private double price; // MainIngredient的getter和setter public String getMainIngredient() { return mainIngredient; } public void setMainIngredient(String newMain) { this.mainIngredient = newMain; } // Bread的getter和setter public String getBread() { return bread; } public void setBread(String newBread) { this.bread = newBread; } // Price的getter和setter public double getPrice() { return price; } public void setPrice(double newPrice) { this.price = newPrice; } public static void main(String[] args) {} }
TestSandwich类不需要修改,直接运行就能得到预期输出:You have ordered a tuna sandwich on wheat bread, and the price is 4.99
解决方案2:保留内部类,在Sandwich中提供代理方法
如果必须保留内部类的设计,需要在Sandwich类中创建内部类的实例,并编写代理方法来调用内部类的get/set:
class Sandwich { // 创建内部类实例 private PrimaryIngredient primaryIngredient = new PrimaryIngredient(); private Loaf loaf = new Loaf(); private Cost cost = new Cost(); // 代理PrimaryIngredient的方法 public String getMainIngredient() { return primaryIngredient.getMainIngredient(); } public void setMainIngredient(String newMain) { primaryIngredient.setMainIngredient(newMain); } // 代理Loaf的方法 public String getBread() { return loaf.getBread(); } public void setBread(String newBread) { loaf.setBread(newBread); } // 代理Cost的方法 public double getPrice() { return cost.getPrice(); } public void setPrice(double newPrice) { cost.setPrice(newPrice); } // 内部类保持不变 public class PrimaryIngredient{ private String mainIngredient; public String getMainIngredient(){return mainIngredient;} public void setMainIngredient(String newMain){this.mainIngredient = newMain;} } public class Loaf{ private String bread; public String getBread(){return bread;} public void setBread(String newBread){this.bread = newBread;} } public class Cost{ private double price; public double getPrice(){return price;} public void setPrice(double newPrice){this.price = newPrice;} } public static void main(String[] args){} }
这种方式也能让TestSandwich正常调用方法,得到预期结果。
内容的提问来源于stack exchange,提问作者Takeshi DBXV

