Java非静态内部类中为什么不能有静态变量却可以有常量?
2023-09-11 14:16:51 时间
如:
public class InnerClassDemo{
int x;
class A{
static int a = 0;//这样写是不合法的.
static final int b=0;//这样写是合法的
}
}
解答:简单说,定义一个静态的域或者方法,要求在静态环境或者顶层环境,这里静态环境具体说,例子里如果加上 static class A就ok。
非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关,因此,非静态内部类中不能定义静态域/方法,编译过不了。
而常量之所以可以(不论有无static),因为java在编译期就确定所有常量,放到所谓的常量池当中。常量的机制和普通变量不一样。
说深入点,java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么必须先执行加载外部类,再加载内部类,最后初始化静态变量 a ,问题就出在加载内部类上面,我们可以把内部类看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。
相关文章
- Java核心技术卷I基础知识3.6.6 码点与代码单元
- Java 成员内部类 静态内部类
- JAVA集合--解决哈希冲突的寻址算法及代码示例
- Map在Java 8中增加非常实用函数接口
- Java项目实战——瑞吉外卖Day01
- Java开发环境的搭建以及使用eclipse从头一步步创建java项目
- java线程安全问题之静态变量、实例变量、局部变量
- java获取年月日
- Java静态变量的初始化(static块的本质)
- Java中静态变量/成员变量、静态内部类/成员内部类小节
- Java 设计模式之装饰模式,Java 装饰模式,java装饰模式和代理模式的区别
- java线程安全问题之静态变量、实例变量、局部变量
- Java | 韩顺平 循序渐进学Java自用笔记---OOP基础 [ 更新中 ]
- Java_java动态编译整个项目,解决jar包找不到问题
- 『Java练习生的自我修养』java-se进阶² • 并发与多线程
- java 根据IP地址获取详细的地域信息(百度API)
- Java中的静态变量、静态方法与静态代码块
- 简单的JAVA MVC框架模式--Java-servlet-JavaBean
- Java小白入门200例62之java中日期查询常用实例
- 【JAVA】浅谈java枚举类
- 【JAVA】浅谈java枚举类
- Java动态绑定和静态绑定(多态)