关于内部类为什么可以有静态常量,不能有静态变量的原因?
来源:互联网 发布:淘宝品牌销量排名 编辑:程序博客网 时间:2024/05/16 11:54
大部分都是拷贝的别人的!
java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么必须先执行加载外部类,再加载内部类,最后初始化静态变量 a ,问题就出在加载内部类上面,我们可以把内部类看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。
预备知识:
● 生命周期(Lifecycle):
静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。
非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。
● 在内存中存储位置
静态方法和静态变量创建后始终使用同一块内存,是连续的。
非静态方法会存在于内存的多个地方,是离散的。
● 效率
静态方法的使用效率比非静态方法的效率高。
● 线程安全
静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。
非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。
● 使用范围
静态方法:⒈ 有静态属性的类,一般会定义静态方法。⒉ 没有属性的类,一般会定义静态方法。⒊ 如果一个方法与他所在类的实例对象无关,那么它就应该是静态的。静态方法可以被继承但是不能被覆盖。
● 总计
如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。如果从线程安全、性能、兼容性上来看,选用实例化方法为宜。
static 方法 (静态方法)
方法在该方法所属类型第一次被使用的时候加载、在该类型所在应用程序域卸载的时候卸载、也就是说 static 方法只加载一次、除非整个Domain 被卸载了。
实例方法(非静态方法)
方法是在第一次该方法第一次调用的时候会加载、然后被缓存起来。但是中间如果有GC 的话, 就会被收集,那下次再调用该方法时,又得重新加载该方法。也就是说,实例方法有可能加载多次。
总的来说,static 方法只用加载一次,但一直会占用内存。多了些资源消耗;而实例方法需要加载多次,但不会一直占用内存。少些资源消耗。一般来说, 在程序里面,一些使用频率高的方法就用static 方法、使用频率低的则用实例方法
静态方法和静态变量创建后始终使用同一块内存,是连续的。
非静态方法会存在于内存的多个地方,是离散的。
●
●
静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。
非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。
●
静态方法:⒈ 有静态属性的类,一般会定义静态方法。⒉ 没有属性的类,一般会定义静态方法。⒊ 如果一个方法与他所在类的实例对象无关,那么它就应该是静态的。静态方法可以被继承但是不能被覆盖。
●
如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。如果从线程安全、性能、兼容性上来看,选用实例化方法为宜。
static 方法 (静态方法)
方法在该方法所属类型第一次被使用的时候加载、在该类型所在应用程序域卸载的时候卸载、也就是说
实例方法(非静态方法)
方法是在第一次该方法第一次调用的时候会加载、然后被缓存起来。但是中间如果有GC 的话, 就会被收集,那下次再调用该方法时,又得重新加载该方法。也就是说,实例方法有可能加载多次。
总的来说,static 方法只用加载一次,但一直会占用内存。多了些资源消耗;而实例方法需要加载多次,但不会一直占用内存。少些资源消耗。一般来说, 在程序里面,一些使用频率高的方法就用static 方法、使用频率低的则用实例方法
阅读全文
0 0
- 关于内部类为什么可以有静态常量,不能有静态变量的原因?
- java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?
- java中非静态内部类可以有常量但不能有staic修饰的属性
- Java内部类(3):非静态内部类为什么不能有静态成员变量和静态方法。
- Java非静态内部类为什么不能有静态成员
- Java非静态内部类为什么不能有静态成员
- 黑马程序员——内部类不能有静态的成员的原因
- 非静态内部类中为什么不能存在静态变量
- 非静态内部类不能有静态声明
- 非静态内部类不能有静态成员?
- 为何非静态内部类不能有静态成员
- 成员内部类里面为什么不能有静态成员和方法?
- java非静态内部类为何不能有静态的成员?
- java非静态内部类为何不能有静态的成员?
- 怎么想静态内部类可以有静态成员和方法而成员内部类不行?
- 为什么不管是静态内部类的普通方法还是静态方法都不能访问外部类的实例变量
- 【Java语法】java中成员内部类内为什么不允许有任何静态声明搜索
- 关于java内部类访问类的静态成员变量
- 玩命学英语吧兄弟们,请相信我!-七月结
- Untiy 生命周期函数
- UE4 全局数据(可变和不可变)
- 使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中
- 机房收费系统(登录窗体)
- 关于内部类为什么可以有静态常量,不能有静态变量的原因?
- js之杨辉三角
- P1002 过河卒
- HTML转图片或者HTML转PDF
- (Distance Metric Learning)度量学习学习资料
- 【C/C++】warning: ISO C++ forbids converting a string constant to 'char*'
- VUE快速入门心得——Vue生命周期
- 僵尸进程以及如何处理僵尸进程
- 装系统出现0xc000000f该怎么办?