在自学java,接口,跟给的代码一样,不知道哪里出问题


public class Testjk {
    public static void main(String[] args) {
        //创建厨师对象
        FoodMenu cooker1 = new ChinaCooker();
        //创建顾客对象
        Customer customer = new Customer(cooker1);
        //顾客点菜
        customer.order();
    }
    
    //菜单
    public interface FoodMenu{
        //西红柿炒鸡蛋
        void shiZiChaoJiDan();
        
        //鱼香肉丝
        void yuXiangRouSi();
    }
    
    //中国厨师
    //实现菜单上的菜
    public class ChinaCooker implements FoodMenu{
        //西红柿炒鸡蛋
        public void shiZiChaoJiDan() {
            System.out.println("中餐师傅做的西红柿炒鸡蛋");
        }
        
        //鱼香肉丝
        public void yuXiangRouSi() {
            System.out.println("中餐师傅做的鱼香肉丝");
        }
    }
    
    //西餐厨师
    //实现菜单上的菜
    public class AmericCooker implements FoodMenu{
        //西红柿炒鸡蛋
        public void shiZiChaoJiDan() {
            System.out.println("西餐师傅做的西红柿炒鸡蛋");
        }
        
        //鱼香肉丝
        public void yuXiangRouSi() {
            System.out.println("西餐师傅做的鱼香肉丝");
        }
    }
    
    //顾客
    public class Customer{
        //顾客手里有一个菜单
        private FoodMenu foodMenu;//已经私有化

        //构造方法
        public Customer() {
            
        }
        
        public Customer(FoodMenu foodMenu) {
            this.foodMenu=foodMenu;
        }

        public void setFoodMenu(FoodMenu foodMenu) {
            this.foodMenu = foodMenu;
        }

        public FoodMenu getFoodMenu() {
            return foodMenu;
        }

        //提供一个点菜方法
        public void order() {
            //先拿到菜单
            foodMenu.shiZiChaoJiDan();
            foodMenu.yuXiangRouSi();
        }
    }
}

_**Exception in thread "main" java.lang.Error: 无法解析的编译问题:
没有任何类型 Testjk 的外层实例可访问。必须用类型 Testjk 的外层实例(例如,x.new A(),其中 x 是 Testjk 的实例)来限定分配。

at 接口.Testjk.main(Testjk.java:4)**_

main方法里new的时候加上Testjk.
new Testjk.ChinaCooker(),下面那个也是
内部类在静态方法内需要这样使用

public class Testjk {
    public static void main(String[] args) {
        //创建厨师对象
        FoodMenu cooker1 = new ChinaCooker();
        //创建顾客对象
        Customer customer = new Customer(cooker1);
        //顾客点菜
        customer.order();
    }
}//把最下面的括号挪到这里,Testjk到这里结束

    //菜单
    interface FoodMenu{
        //西红柿炒鸡蛋
        void shiZiChaoJiDan();
        //鱼香肉丝
        void yuXiangRouSi();
    }
    //中国厨师
    //实现菜单上的菜
    class ChinaCooker implements FoodMenu{
        //西红柿炒鸡蛋
        public void shiZiChaoJiDan() {
            System.out.println("中餐师傅做的西红柿炒鸡蛋");
        }
        //鱼香肉丝
        public void yuXiangRouSi() {
            System.out.println("中餐师傅做的鱼香肉丝");
        }
    }
    //西餐厨师
    //实现菜单上的菜
    class AmericCooker implements FoodMenu{
        //西红柿炒鸡蛋
        public void shiZiChaoJiDan() {
            System.out.println("西餐师傅做的西红柿炒鸡蛋");
        }
        //鱼香肉丝
        public void yuXiangRouSi() {
            System.out.println("西餐师傅做的鱼香肉丝");
        }
    }
    //顾客
    class Customer{
        //顾客手里有一个菜单
        private FoodMenu foodMenu;//已经私有化
        //构造方法
        public Customer() {
        }
        public Customer(FoodMenu foodMenu) {
            this.foodMenu=foodMenu;
        }
        public void setFoodMenu(FoodMenu foodMenu) {
            this.foodMenu = foodMenu;
        }
        public FoodMenu getFoodMenu() {
            return foodMenu;
        }
        //提供一个点菜方法
        public void order() {
            //先拿到菜单
            foodMenu.shiZiChaoJiDan();
            foodMenu.yuXiangRouSi();
        }
    }

改成这样试试

我的FoodMenu cooker1 = new ChinaCooker();这句话报错,也不知道哪里有问题

调用的代码在静态方法main里,访问非静态的内部类是不行的。
两种改法:

  1. 把下面的class定义改成静态的
    public static class ChinaCooker implements FoodMenu
    public static class Customer

  2. 把main方法里的代码挪到一个非静态的方法里,比如

    public void test(){
        //创建厨师对象
        FoodMenu cooker1 = new ChinaCooker();
        //创建顾客对象
        Customer customer = new Customer(cooker1);
        //顾客点菜
        customer.order();
    }
    
    public static void main(String[] args) {
        new Testjk().test();
    }