得到一个"没有封闭的类型实例..."错误

时间:2012-03-29 18:43:30

标签: java object subclass 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;
        }
    }
}

一直说:

  

没有封闭AddBoardTestCommand.BoardTestBean类型的实例   无障碍。必须使用附加的实例来限定分配   输入AddBoardTestCommand.BoardTestBean(例如x.new A(),其中x是   AddBoardTestCommand.BoardTestBean的实例。

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

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

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

2 个答案:

答案 0 :(得分:5)

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

如果SAT不需要使用任何BoardTestBean的状态,请声明static;否则,将实例方法添加到BoardTestBean并从那里实例化SAT

P.S。我假设您从同一个软件包访问SAT,因为它具有软件包可见性。如果这不是故意的,您还需要制作课程public

编辑以下是向BoardTestBean SAT添加实例方法的方法:

SAT makeSAT() {
    return new SAT();
}

现在在BoardTestBean之外你可以这样做:

// assuming that you have an instance of BoardTestBean...
BoardTestBean myBean = ...
BoardTestBean.SAT = myBean.makeSAT();

答案 1 :(得分:2)

你定义了一个内部类,它隐藏了它的外部类。

只做

public static class SAT {

你得到一个没有隐藏的

的嵌套类