非静态变量无法引用求助:拆分main方法创建RentalAgency实例
解决“Non static variable cannot be referenced”错误
嘿,这个问题我天天帮人排查!咱们先搞懂为啥会出这个错,再给你两种靠谱的解决方案。
错误原因
你写的createAgency()是非静态实例方法,而main()是静态方法——静态方法属于类本身,调用的时候不需要创建类的实例;但非静态方法属于类的具体对象,必须先有对象才能调用。在静态的main()里直接调用非静态的createAgency(),Java虚拟机找不到对应的对象实例,自然就抛出这个错误啦。
解决方案1:把createAgency()改成静态方法
如果这个方法不需要访问类里的非静态成员变量,最简单的办法就是给它加上static修饰符,这样就能在main()里直接调用了:
/** 创建包含若干汽车和摩托车的代理机构 */ public static RentalAgency createAgency(){ List<Vehicle> theVehicles = new ArrayList<Vehicle>(); Map<Client,Vehicle> rentedVehicles = new HashMap<Client,Vehicle>(); RentalAgency agency = new RentalAgency(theVehicles, rentedVehicles); // 这里可以添加具体的车辆实例,比如: // theVehicles.add(new Car("Toyota", 2023)); // theVehicles.add(new Motorcycle("Yamaha", 2022)); return agency; }
然后在main()里直接调用:
public static void main(String[] args) { RentalAgency myAgency = createAgency(); // 后续业务逻辑... }
解决方案2:先创建当前类的实例再调用方法
如果createAgency()需要访问类里的非静态成员(比如你这个类里有其他非静态变量要用到),那就在main()里先new一个当前类的对象,再通过这个对象调用方法:
public class RentalApp { // 假设这里有非静态成员变量 private String agencyName = "City Rental"; public RentalAgency createAgency(){ List<Vehicle> theVehicles = new ArrayList<Vehicle>(); Map<Client,Vehicle> rentedVehicles = new HashMap<Client,Vehicle>(); // 可以访问非静态的agencyName RentalAgency agency = new RentalAgency(agencyName, theVehicles, rentedVehicles); return agency; } public static void main(String[] args) { // 创建当前类的实例 RentalApp appInstance = new RentalApp(); // 通过实例调用非静态方法 RentalAgency myAgency = appInstance.createAgency(); } }
选哪种方案看你的实际需求:如果方法只是单纯创建对象,不需要依赖类的实例状态,用静态方法更简洁;如果需要用到类里的非静态成员,就用实例调用的方式。
内容的提问来源于stack exchange,提问作者Rémy.W
相关产品推荐
相关产品推荐

