博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java非静态内部类中为什么不能有静态变量却可以有常量?
阅读量:6217 次
发布时间:2019-06-21

本文共 596 字,大约阅读时间需要 1 分钟。

如:

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常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。

转载地址:http://groja.baihongyu.com/

你可能感兴趣的文章
《 线性代数及其应用 (原书第4版)》——1.10 经济学、科学和工程中的线性模型...
查看>>
《JUnit实战(第2版)》—第1章1.4节JUnit的设计目标
查看>>
《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.2 基本光照效果
查看>>
在Ubuntu中安装XScreenSaver
查看>>
《HTML5 2D游戏编程核心技术》——第3章,第3.9节使用视差产生视深的假象
查看>>
Practical Clojure - 简介
查看>>
深入下Ruby中的String
查看>>
Django 博客开发教程 4 - 让 Django 完成翻译:迁移数据库
查看>>
《Python密码学编程》——2.7 在线跟踪程序
查看>>
雾里看花之 Python Asyncio
查看>>
《树莓派Python编程入门与实战》——3.9 总结
查看>>
Velocity官方指南-使用Velocity
查看>>
jQuery获取数组对象的值
查看>>
从《一九八四》到《窃听风暴》
查看>>
《jQuery、jQuery UI及jQuery Mobile技巧与示例》——9.2 技巧:用单个HTML文件服务多张页面...
查看>>
360 for Linux 与 setuid
查看>>
《驾驭大数据》一3.5 电力行业:智能电网数据的价值
查看>>
《用户至上:用户研究方法与实践(原书第2版)》一2.5 特殊人群
查看>>
《OpenStack云计算实战手册(第2版)》——1.3 配置Ubuntu Cloud Archive
查看>>
《C#多线程编程实战(原书第2版)》——导读
查看>>