Java代码报错No enclosing instance of type is accessible求助
解决Java中“No enclosing instance of type is accessible”错误
错误原因
你碰到的这个报错,本质是非静态内部类Employee不能在静态上下文(比如main方法)里直接实例化,同时静态内部类Manager继承非静态的Employee也会触发这个问题——非静态内部类默认会持有外部类oop的实例引用,而静态方法(比如main)里没有外部类的实例,自然没法创建这类内部类的对象。
修复方案
最合理的修复方式是把Employee改成静态内部类,因为这个演示程序里,Employee完全不需要依赖外部类oop的任何状态,改成静态类就消除了对外部实例的依赖。
另外还要注意,Manager类的getSalary方法里有个逻辑错误:当前代码写的是return baseSalary - bonus;,这会把奖金从基本工资里扣除,明显不符合逻辑,应该改成baseSalary + bonus。
修正后的完整代码
public class oop { public static void main (String[]args) { Manager boss = new Manager("Boss Man", 80000, 1987); boss.setBonus(5000); Employee[] staff = new Employee[3]; staff[0] = boss; staff[1] = new Employee("Teller Tom", 50000, 1989); staff[2] = new Employee("Lender Lory", 40000, 1990); for (Employee empIndex : staff) { System.out.println(String.format("Name: %-11s Earnings: $%,.2f Hired in: %s", empIndex.getName(), empIndex.getSalary(), empIndex.getHireYear())); } } // 将Employee改为静态内部类 static class Employee { private String name; private double salary; private int yearHired; Employee(String nam, double sal, int yr) { System.out.println("Employee superclass"); name = nam; salary = sal; yearHired = yr; } public String getName(){ return name; } public double getSalary(){ return salary; } public int getHireYear(){ return yearHired; } } static class Manager extends Employee { private double bonus; public Manager(String name, double salary, int year){ super(name, salary, year); System.out.println("Manager subclass"); bonus = 0; } // 修正奖金计算逻辑 public double getSalary(){ double baseSalary = super.getSalary(); return baseSalary + bonus; } public void setBonus(double bon){ bonus = bon; } } }
另一种可选方案(不推荐)
如果一定要保留Employee为非静态内部类,那必须先创建外部类oop的实例,再通过这个实例创建内部类对象,代码会变成这样:
public static void main (String[]args) { oop outer = new oop(); Manager boss = outer.new Manager("Boss Man", 80000, 1987); // ... 其他创建Employee的地方也要改成outer.new Employee(...) } // 同时Manager不能是静态类,要改成非静态:class Manager extends Employee
但这种方式完全没必要,因为这个演示程序里外部类oop没有任何实例变量,改成静态内部类更简洁合理。
内容的提问来源于stack exchange,提问作者Victor Rabelo
相关产品推荐
相关产品推荐

