【问题标题】:stackoverflow error in static inner class in Java?Java中静态内部类中的stackoverflow错误?
【发布时间】:2013-11-18 06:51:20
【问题描述】:

这是我通过StaticInner 的静态变量更新OuterClass 的实例变量x 的代码。我知道静态内部类不能直接引用外部类的实例变量。我正在使用外部类的实例来引用其实例变量“x”并对其进行更新。这进入stackoverflow错误。代码符合要求。代码中的最后一行没有编译,我注释掉了。我不明白那条线有什么问题。

public class OuterClass {
    private int x = 10;
    private static int y = 15;
    private static StaticInner si=null;

    public OuterClass() {
        setStaticInner();
        this.x=si.ic.x;
    }

    public static class StaticInner {
        private static int z = 20;
        private OuterClass ic = new OuterClass();
        public void increment() {
            OuterClass.y+=z;
            z+=OuterClass.y;
            ic.x+=10;
        }
    }

    public void setStaticInner(){
        si=new StaticInner();
    }

    public static void main(String[] args){

        OuterClass ic = new OuterClass();
        ic.si.increment();
        System.out.println(ic.x);

        //OuterClass.StaticInner sb1 = ic.new StaticInner(); This line does not compile.
    }

}

【问题讨论】:

    标签: java inner-classes static-class


    【解决方案1】:

    你在构造函数中有一个循环依赖,导致它们之间递归调用

    Outer(){
      createInner()
    }
    
    Inner(){
       createOuter()
    }
    

    这是行不通的(除非你使用反射,但这违背了目的)。

    您需要对类进行结构化,以便存在线性依赖关系。我建议将外部实例传递给内部构造函数

    Outer(){
       inner = new Inner(this);
    }
    
    Inner(Outer o){
      myouter = o;
    }
    

    【讨论】:

      【解决方案2】:

      不要用外部类实例限定“新”。这仅适用于内部类。只需像其他任何实例一样实例化嵌套类。

      在外部类中使用静态嵌套类时,您根本不需要提及外部类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-16
        • 2011-05-10
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        相关资源
        最近更新 更多