静态嵌套类如何具有此指针

时间:2013-02-09 10:24:31

标签: java

今天我正在阅读有关静态嵌套类的内容,由于代码如下,我感到很困惑。

class testOuter {
    int x;
     static class inner {
       int innerVar; 
    public void testFunct() {
        x = 0;       // Error : cannot make static reference to non static field
        innerVar = 10;
        outerFunc(this);
     }
     }
     static void outerFunc(SINGLETON s) {

     }
}

我对静态嵌套类的理解是,它的行为类似于外部类的静态成员。它只能引用静态变量,可以调用静态方法。从上面的代码 x=0的错误很好。但令我感到困惑的是,如果它的行为类似于静态块,那么它允许我修改innerVar,它不是静态的,它也可以有这个指针。那么如果嵌套类是静态的,那么内部方法或非静态方法?请澄清一下。

4 个答案:

答案 0 :(得分:1)

static int x代替int x,然后就可以了。正如你自己所说,静态内部类只能访问外部类的静态成员。由于x在您的代码中不是静态的,因此您无法访问它。

P.S。

请注意,所有普通类都是静态的,即每个应用程序运行都存在一个类信息实例。因此,当您声明内部类为static时,您只需声明它与普通类一样。

相反,非静态内部类是不同的。非静态内部类的每个实例都是一个闭包,即它与某些外部类的INSTANCE相关联。即如果不考虑某些外部类实例,则无法创建非静态内部类的实例。

P.P.S。

抱歉,您没有突出显示thisinnerVar。两者都是内部类的非静态成员,因此您可以访问它们。仅当属于OUTER类时,才能访问非静态成员。

答案 1 :(得分:1)

this表示与任何其他类相同的内容。它指的是班级的当前instance。静态内部类可以实例化(通常是):

Inner inner = new Inner();

静态内部类的工作方式与其他任何类完全相同。唯一的区别是,通过将其隐藏到其包含的类中,它可以从其他类中隐藏。

编译示例:

public class Course {
    private List<Student> students;

    public Course(Collection<Student> students) {
        this.students = new ArrayList<>(students);
        Collections.sort(this.students, new StudentComparator(-1));
    }

    private static class StudentComparator implements Comparator<Student> {
        private int factor;
        StudentComparator(int factor) {
            this.factor = factor;
        }

        @Override
        public int compare(Student s1, Student s2) {
            return this.factor * (s1.getName().compareTo(s2.getName());
        }
    }
}

答案 2 :(得分:0)

class testOuter {
   static int x;

   static class inner {
     int innerVar; 
     public void testFunct() {
       x = 0;       
       innerVar = 10;
     }
   }

   static void outerFunc(SINGLETON s) {
   }
}

答案 3 :(得分:0)

  

但我感到困惑的是,如果它的行为像静态块,那么它允许我修改innerVar,这不是静态的

从静态内部类中,您不能引用外部类的非静态成员innerVar属于您的静态内部类,因此在您访问它时没有错误。