今天我正在阅读有关静态嵌套类的内容,由于代码如下,我感到很困惑。
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,它不是静态的,它也可以有这个指针。那么如果嵌套类是静态的,那么内部方法或非静态方法?请澄清一下。
答案 0 :(得分:1)
写static int x
代替int x
,然后就可以了。正如你自己所说,静态内部类只能访问外部类的静态成员。由于x
在您的代码中不是静态的,因此您无法访问它。
P.S。
请注意,所有普通类都是静态的,即每个应用程序运行都存在一个类信息实例。因此,当您声明内部类为static
时,您只需声明它与普通类一样。
相反,非静态内部类是不同的。非静态内部类的每个实例都是一个闭包,即它与某些外部类的INSTANCE相关联。即如果不考虑某些外部类实例,则无法创建非静态内部类的实例。
P.P.S。
抱歉,您没有突出显示this
和innerVar
。两者都是内部类的非静态成员,因此您可以访问它们。仅当属于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
属于您的静态内部类,因此在您访问它时没有错误。