java 释放静态变量_java静态变量
静态static
静态出现最大的原因:节约内存,只存一份,由对象共享这个属性。
静态的作用是什么?
场景:
当每个对象都有一个相同的属性,如country="China",那么每个对象所在的堆内存中都会为其分配空间来保存这个属性值country="Chian"。
既然每个对象的country属性值都是一样的,能否只用一个存储空间就行了呢?这样节约堆内存空间。
答案是可以的。
通过static修饰的属性,其值将被所有对象共享使用。
注意:对象特有的属性不能定义为静态的,因为静态即共享。如Person类的name不能是静态的。
如,饮水机是共享的,大家都共同使用同一个饮水机,则静态;
如,杯子是特有的,每个人都有属于自己的水杯,则非静态。
静态的特征:
静态static修饰的成员,优先于对象存在;
静态static修饰的成员,随着类的加载而进入内存;
静态static修饰的成员,是共享的,而对象中存储的则是特有的;
静态static修饰的成员,不仅可以被对象所使用,还能被类直接使用;
静态的优点:
实现共享数据在内存中的唯一存储,节约了内存空间;
每个对象都不用在堆内存中为其单独开辟空间保存,直接使用共享的数据即可。
静态的缺点:
常驻内存,内存释放周期长,只随着类的消失而消失。
类什么时候消失?
类其实也是对象,JVM启动时就会加载类路径目录下的类,当内存中加载的类太多太多,JVM的GC会根据某种算法对加载的某些类进行清理,释放空间。
当JVM关闭时,类消失。
类变量与成员变量的区别
类变量不是类的成员变量
存储位置不一样
成员变量,在堆内存中,每个对象都有自己的一份不同的成员变量存储区
静态变量,在方法区中,只有唯一的一份,是类变量,每个对象都共享使用这个变量
生命周期不一样
成员变量,随着对象的创建而存在,随着对象的回收而释放
静态变量,随着类的加载而存在,随着类的消失而释放
调用方式不同
成员变量,只能由对象调用
静态变量,一般直接使用类名进行调用
成员变量--->实例变量,对象的特有属性
静态变量--->类变量,该类中的对象都具有相同的一个属性
静态修饰属性
静态变量也称为类变量;
静态变量存储在方法区的静态区内存中;
当每个对象的某个属性的值都相同,则可以考虑使用静态来修饰该属性。
public static String county = "CN";
方法区:
存放方法/函数的地方。
方法区又分为了几个部分:静态数据区,常量区,代码区(存放方法代码的区域)等。
需要说明一点:
类中的代码到底是如何存放的。
类中可以定义的内容:成员变量,类变量,构造方法,一般方法,静态方法。
其中,
成员变量是对象特有的数据,存在于对内存中
构造方法、一般方法,将存放到方法区的非静态区中
类变量、静态方法,将存放到方法区的静态区中
=========================================================================
静态修饰方法
静态修饰的方法具有局限性,只能使用静态变量或调用静态方法。
工具方法,工具类,不需要创建对象
方法中只要没有操作对象特有的数据,就可以定义为静态方法;
1.创建对象来调用静态方法,浪费时间、空间,无意义
---私有构造方法,可以防止外部通过对象来调用静态工具方法(单例模式);
2.静态方法中不能处理对象的特有数据,因为静态方法中无法引用对象(静态先于对象存在);
由于静态方法先于对象加载到内存,导致:
静态方法中只能使用静态成员(静态属性,静态方法);
静态方法中不能使用this/super关键字;
=============================================================================
静态什么时候用?
1.静态变量/类变量(从节约堆内存上考虑)
对象中的成员变量的值都是相同的,而且都只需要使用该值,而不做修改,则定义为静态的!
如果其中哪怕只有一个对象将有可能修改这个值,都必须将其定义为成员变量,放到堆内存中存储,此时决定不能将其定义为静态的。
好处:
每个对象都不必在堆内存中为同一份数据分配空间,只需要在方法区存放一份数据即可!
前提:对象只读该数据,不修改该数据,因为大家共享这个数据。
2.静态方法(从执行代码上考虑,从方法的调用上考虑)
方法能否被定义为静态,就看一点:
方法中是否使用到了对象的特有数据或者调用到了普通方法,如果没有,则定义为静态方法!
好处:
1.不需要创建对象,因为创建对象耗费时间空间,而且静态方法的执行中没有使用到对象的数据。
(创建对象需要在堆内存开辟空间,调用构造方法进行初始化等操作)
2.调用简单,直接通过类名即可调用方法。
注意:不管是静态方法还是非静态方法,都只是一段代码,在方法区中都只存一份,只是存放的区域不同而已!不存在节约内存的说法。
=========================================================================
扩展:主函数main为什么设计成static的
首先,主函数的功能:程序的入口,由JVM调用
主函数专注于:
* 在函数体中创建其它类的对象,指挥这些对象调用它们各自的方法来完成某种功能!
* 代码按功能封装到函数中
* 函数都封装到类中
* 主函数只做一件事:创建那些封装好的类的对象,再调用类的方法!
Java代码
publicclassStaticTest {
/**
* 对象的特有属性,每个对象的id都不同
*/
intid;
/**
* 讨论主函数为什么是静态static的
* 1.主函数是程序的入口。
* 2.主函数中调用其它函数的2种方式:
* a.静态方法,由类名调用;
* b.非静态方法,由对象调用
* a.静态方法,被主函数调用,由于静态方法中只能使用类变量,使得静态方法的功能具有局限性(对象的特有属性无法在静态方法中使用,因为对象还未创建),不能满足大多数的功能需求;
* 这样就只留另一条路,调用非静态方法
* b.非静态方法的调用,必须由对象来操作,所以,主函数中必须先创建对象,再通过对象来调用,使得大多数功能的调用都以对象为起点进行
* Java面向对象,以对象为核心,将主函数设计为静态的,强制开发人员通过对象来调用方法!
*
* 哦也!
* @param args
*/
publicstaticvoidmain(String[] args) {
//say(); //静态方法中不能调用非静态方法
//只能通过对象来调用
StaticTest test = newStaticTest();
test.say();
//把say()也变为静态的,也能直接调用啊!其后果是,say()要能执行,那么id也必须静态,静态即共享--->id是对象的特有属性,不同对象有不同的id
//所以,主函数中调用方法,遵从Java的规范,用对象来调用方法!!!
}
publicvoidsay() {
System.out.println(this.id);
}
}public class StaticTest {
/**
* 对象的特有属性,每个对象的id都不同
*/
int id;
/**
* 讨论主函数为什么是静态static的
* 1.主函数是程序的入口。
* 2.主函数中调用其它函数的2种方式:
* a.静态方法,由类名调用;
* b.非静态方法,由对象调用
* a.静态方法,被主函数调用,由于静态方法中只能使用类变量,使得静态方法的功能具有局限性(对象的特有属性无法在静态方法中使用,因为对象还未创建),不能满足大多数的功能需求;
* 这样就只留另一条路,调用非静态方法
* b.非静态方法的调用,必须由对象来操作,所以,主函数中必须先创建对象,再通过对象来调用,使得大多数功能的调用都以对象为起点进行
* Java面向对象,以对象为核心,将主函数设计为静态的,强制开发人员通过对象来调用方法!
*
* 哦也!
* @param args
*/
public static void main(String[] args) {
//say(); //静态方法中不能调用非静态方法
//只能通过对象来调用
StaticTest test = new StaticTest();
test.say();
//把say()也变为静态的,也能直接调用啊!其后果是,say()要能执行,那么id也必须静态,静态即共享--->id是对象的特有属性,不同对象有不同的id
//所以,主函数中调用方法,遵从Java的规范,用对象来调用方法!!!
}
public void say() {
System.out.println(this.id);
}
}
java 释放静态变量_java静态变量相关推荐
- java类静态初始化_Java静态代码块和类初始化、实例初始化过程
1. 静态代码块 静态代码块:定义在类中方法外,使用static修饰 ①可以为类变量(静态变量)初始化 ②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次 ③若有多个静态代码块, ...
- java 运行环境变量_java 环境变量配置与第一个程序运行
从开始下载jdk,到运行出java第一个程序 ,花了5天时间 ,不过我相信万事开头难 ,以后会越来越好的 ,加油! jdk的下载: 在oracle官网上即可下载,jdk安装包,下载完以后运行安装 ,路 ...
- java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...
Java 环境变量和路径 在 Solaris 系统上,必须先设置 JAVA_HOME 和 PATH 环境变量,Sun Management Center 3.6 安装向导.设置向导和 Java 控制台 ...
- java 找不到环境变量_java环境变量详解---找不到或无法加载主类
默认安装在C:\ProgramFiles\Java\jdk1.7.0目录下 环境变量配置为 PATH=.;%JAVA_HOME%\bin CLASSPATH=.;%JAVA_HOME%\lib\dt. ...
- java一键环境变量_Java环境变量一键配置
能自动检测JDK的安装路径,不限版本,一键设置PATH,JAVA_HOME, CLASSPATH环境变量,即时生效无需重启,本软件用VC开发,非批处理程序! 最简单的配法: 假设你的jdk安装在:F: ...
- 2003 java环境变量_Java环境变量设置(适用于Windows 2000、XP、2003)及Windows JSP运行环境配置...
首先,从Sun网站上下载jdk,当前版本为1_5_0_06(其他版本亦可) 最终下载下来的文件为jdk-1_5_0_06-windows-i586-p.exe 双击jdk-1_5_0_06-windo ...
- java输出变量_java输出变量怎么操作?怎么输入变量?
变量是java中最基础的功能,但同时也是最不可缺少的,有些刚学习java的小伙伴可能还不知道怎么输出输入变量,下面就听小编讲解讲解吧. 变量 1.变量声明数据类型 变量名; 赋值 变量名 = 值; 合 ...
- java静态代码块和静态变量_java静态变量和静态代码块的加载顺序
静态变量的声明和赋值是分开的,变量名的声明先加载,赋值是按照代码顺序执行. public class Test { static { NAME = "xing"; } privat ...
- java 静态数据_Java 静态数据初始化的示例代码
无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...
最新文章
- Android -- TouchDelegate
- asp.net ajax 怎么获取前端ul li_字节前端提前批面试题:触发了几次回流几次重绘...
- js压缩代码后怎么生成source map_??markdown生成导航? #x27;[toc]#x27;足矣
- python输出输入的指定位数的密码_用python生成指定位数的密码
- 【牛客网】NC31 第一个只出现一次的字符
- (转)jquery基础教程七 选择器(selectors 的xpath语法应用)
- 2018ICPC赛后总结
- 7-9 找出最小值 (20 分)
- div 中的i标签如何点击事件_前端优化:语义标签进化史
- Jmeter登录接口返回 status415
- 浅谈C语言函数调用与系统调用
- mapbox/minemap 首屏固定比例尺为1:20
- 云流化是什么?对软件企业有什么好处?
- 程序人生丨25岁毕业,月薪1万
- 未来,Siri将能读心!
- nRF24L01+ 数据手册
- 【记录】我的一个Centos开机自启动脚本的制作
- 向量的相似度计算常用方法
- 机器人技术(2)Ubuntu linux系统简介及安装
- python文本聚类_python 文本聚类算法