Java非静态内部类中为什么不能有静态变量却可以有常量?
如:
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常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。
转载于:https://www.cnblogs.com/DarrenChan/p/5738824.html
Java非静态内部类中为什么不能有静态变量却可以有常量?相关推荐
- java中的关键字static(静态变量)和final定义常量
package point;class Point {int x = 0;int y = 0;static int z = 100; // 定义静态变量z,类变量static final double ...
- 1vmware中的centos7配置静态变量
vmware中的centos7配置静态变量 安装centos7时推荐最小化安装,避免占用过多资源 问题: 解决虚机中的Centos7连不上网 https://blog.csdn.net/u014271 ...
- Android 中的Activity的静态变量问题
请看,在一个Activity中定义了一个静态变量userUUID,然后在Service中引用,Service第一次启动的时的引用值,和将app手动kill掉后,Service会重启,然后重启的Serv ...
- 非静态内部类中为什么不能拥有静态成员?
答案来自:https://zhidao.baidu.com/question/534600874.html,其实我是草草啦 的回答. java类加载顺序,首先加载类,执行static变量初始化,接下来 ...
- java static 变量存在哪_Java中的静态方法和静态变量存储在哪里?
小编典典 静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分. 更新说明: 请注意,只有变量及其技术值(原始或 ...
- Java中的类变量(静态变量static的具体用法快速入门))
文章目录 问题分析 修改过后的代码 运行结果 先看一段代码 package study_static;public class Childgame {public static void main(S ...
- python 类中静态变量_Python中的类或静态变量
python 类中静态变量 Python类/静态变量 (Python Class / Static Variables) Class or Static variables are class-rel ...
- spring中注解无法修饰静态变量
背景:使用@value注解为类的静态属性赋值的时候,发现一直是空.为什么会这样呢? Spring 依赖注入 是依赖 set方法,set方法是 是普通的对象方法,也就是类实例化的时候才会赋值,但是sta ...
- 成员变量、局部变量、实例变量、静态变量、类变量、常量
成员变量: 直接在类中声明的变量叫成员变量(又称全局变量) ▲ 初始化: 如果未对成员变量设置初始值,则系统会根据成员变量的类型自动分配初始值:int分配初始值0.boolean分配初始值false, ...
- Java的子类可以继承父类的静态变量和静态方法吗?
应该是没有继承,这些静态资源属于类级别的,创建子类对象的时候,虽然父类的有关数据也初始化了(必须调父类的构造器),但是静态的数据在方法区中,实际也是通过父类的名称去访问的.所以子类并没有继承下来.
最新文章
- 关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题
- Unidirectional Link Detection Protocol
- qtablewidget 数据量大效率很低_让大牛带你走进大数据分析:R基础及应用的潮流尖端,享受RHadoop...
- python基础代码事例-菜鸟世界 -python基础---set
- 2.10 是否要使用端到端的深度学习-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
- 一句话理解tf.identity的含义
- 硬件信息修改大师_零成本学习之单片机硬件开发(1)
- Android上传文件至服务器(转)
- 你还不知道怎么退出 Vim?
- Windows下深度学习标注工具LabelImg安装和使用指南
- dijikstra 旅行商问题_第27期:基于旅行商问题(TSP)的配送网络优化—R实现
- 问题八:C++中this是干嘛用的
- [转]——软件开发人员如何成长
- (已更新)漫画小程序,自动采集资源,漫画源码简单即可发布
- 【渝粤题库】陕西师范大学201601《中国古代文学(三)》作业 (高起本)
- Nacos注册中心和配置中心
- ubuntu18.4 浏览器无法上网
- OpenCV C++实现树结构可视化(画出一棵四叉树)
- 解决[Vue warn]: Unknown custom element: <ag> - did you register the component correctly? For recursive
- 黑客内核:如何实现属于你的实时内核?