获取"没有封闭的类型实例..."错误

Nac*_*cht 3 java subclass object abstract

谁能告诉我这段代码有什么问题?

public abstract class BoardTestBean{
    protected String month;
    protected String day;
    protected String name;


    public String getMonth() {
        return month;
    }
    public void setMonth(String month) {
        this.month = month;
    }
    public String getYear() {
        return day;
    }
    public void setYear(String day) {
        this.day = day;
    }
    public String getName(){
        return name;
    }


    //Classes
    public class SAT {
        boolean pre2005=false;
        private String verbal;
        private String quantitative;
        private String writing="";//if pre-2005, do not set. It is not used. 

        public SAT() {
            super();
            if(pre2005)
                name="SAT (pre 2005)";
            else
                name="SAT";             
        }
        public SAT(String verbal, String quantitative, String writing) {
            super();
            this.verbal = verbal;
            this.quantitative = quantitative;
            if(writing!=null && !writing.isEmpty())
                this.writing = writing;
            else
                pre2005=true;
            if(pre2005)
                name="SAT (pre 2005)";
            else
                name="SAT"; 
        }
        public String getVerbal() {
            return verbal;
        }
        public void setVerbal(String verbal) {
            this.verbal = verbal;
        }
        public String getQuantitative() {
            return quantitative;
        }
        public void setQuantitative(String quantitative) {
            this.quantitative = quantitative;
        }
        public String getWriting() {
            if(!this.pre2005)
                return writing;
            else
                return "";
        }
        public void setWriting(String writing) {
            this.writing = writing;
        }
        public boolean isPre2005() {
            return pre2005;
        }
        public void setPre2005(boolean pre2005) {
            this.pre2005 = pre2005;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它一直在说:

不能访问类型为AddBoardTestCommand.BoardTestBean的封闭实例.必须使用AddBoardTestCommand.BoardTestBean类型的封闭实例限定分配(例如,xnew A(),其中x是AddBoardTestCommand.BoardTestBean的实例).

当我尝试这样做时:SAT bean = new SAT(); 以SAT导入为AddBoardTestCommand.BoardTestBean.SAT

我不明白为什么它要求我在BoardTestBean抽象时初始化类.它只是为几个子类保存值(SAT不是唯一的子类.为简单起见,我只省略了其他子类).

谁能告诉我什么是错的?谢谢.

das*_*ght 5

这是因为SAT类是内部类BoardTestBean,但不是一个静态内部类.只有静态内部类才能在没有"封闭"实例上下文的情况下实例化; 非静态需要一个"父"实例.

如果SAT不需要使用任何BoardTestBean状态,请声明static; 否则,添加一个实例方法BoardTestBeanSAT从那里实例化.

PS我假设您正在SAT从同一个包中访问,因为它具有包可见性.如果这不是故意的,那么你也需要上课public.

编辑这是添加实例方法BoardTestBean返回的方法SAT:

SAT makeSAT() {
    return new SAT();
}
Run Code Online (Sandbox Code Playgroud)

现在外面BoardTestBean你可以做到这一点:

// assuming that you have an instance of BoardTestBean...
BoardTestBean myBean = ...
BoardTestBean.SAT = myBean.makeSAT();
Run Code Online (Sandbox Code Playgroud)