每一个非静态内部类不会随外部类加载而加载,必须维持一个对其外部类实例的引用,这就表明了非静态内部类的作用域是实例级别(需要对象);而static关键字显式指定某个属性、方法或内部类的作用域是属于类级别(static修饰的依赖于类的加载而加载)。既然二者在语言层面要求的作用域不同,自然无法编译通过。
为什么添加final就可以了呢?
final关键字的字面语义就是指明不可变,用在属性上,表示属性一旦赋值后即不可改变。与static关键字合用即表示定义一个常量,从这个角度看有点类似c++中的const。一旦作为常量,其作用域自然不再是实例级别了,而是全局级别了,只是java语言里面没有全局级别的作用域这个概念,类级别作用域其实就只是加了一个访问权限修饰的全局作用域而已。所以编译自然OK。
下面就进入该类型错误:
//错误代码
public class Ex7_1 {
class StaticTest {
static final int i = 47;
}
}
有两种方式更正
//1.将变量改变成final,使之作用域为全局
public class Ex7_1 {
class StaticTest {
static final int i = 47;
}
}
//2.将内部类变成static
public class Ex7_1 {
static class StaticTest {
static int i = 47;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)