You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用Getter-Setter方法时第二个程序出现“cannot find symbol”错误?

问题:调用Sandwich类方法时提示"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:33:04