为什么在内部类定义一个static字段必须是final的

为什么在内部类定义一个static字段必须是final的,第1张

每一个非静态内部类不会随外部类加载而加载,必须维持一个对其外部类实例的引用,这就表明了非静态内部类的作用域是实例级别(需要对象);而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;
	}
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1295766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存