Java中static(静态)关键字_静态java关键字-程序员宅基地

技术标签: java基础  Java基础  

static修饰成员变量 

如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。


静态成员变量的访问方式


方式1: 可以使用对象进行访问。
格式: 对象.变量名。

方式二: 可以使用类名进行访问。

格式: 类名.变量名;

推荐使用是类名直接访问静态的成员。


注意: 
1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。

2. 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的才使用static修饰

static修饰成员变量的应用场景

如果一个数据需要被所有对象共享使用的时候,这时候即可使用static修饰。


例:描述一下学生类。  都是中国人....

目前存在的问题: 所有的学生都是中国 的,有n个学生就会有n份中国的 数据存内存中,这样子会浪费内存。
解决方案: 把“中国”这个数据移动 到数据共享区中,共享这个数据给所有的Student对象使用即可。
如何才能把这个数据移动 到数据共享区中共享呢?只需要使用static修饰该数据即可。

静态的成员变量只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中都维护一份的。

class Student{

	String name;
	
	//使用了static修饰country,那么这时候country就是一个共享的数据。

	static	String  country  = "中国";	//国籍
	
	//构造函数
	public Student(String name){
		this.name = name;
	}
}

class Demo9 {

	public static void main(String[] args) 
	{
		Student s1 = new Student("张三");
		Student s2 = new Student("李四");

		s1.country = "日本省";
		System.out.println("姓名:"+s1.name+" 国籍:"+ s1.country); //  中国   
		System.out.println("姓名:"+s2.name+" 国籍:"+ s2.country); // 日本省
	}
}


静态的成员变量与非静态的成员变量的区别

1. 作用上的区别:
1. 静态的成员变量的作用共享一个数据给所有的对象使用。
2. 非静态的成员变量的作用是描述一类事物的公共属性。
2. 数量与存储位置上的区别:
1. 静态成员变量是存储方法 区内存中,而且只会存在一份数据。
2. 非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。
3. 生命周期的区别:
1. 静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
2.非静态的成员数据是随着对象的创建而存在,随着 对象被垃圾回收器回收而消失。


静态函数要注意的事项

1. 静态函数是可以调用类名或者对象进行调用的,而非静态函数只能使用对象进行调用。

2. 静态的函数可以直接访问静态的成员,但是不能直接访问非静态的成员。
原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,
而非静态的 成员数据是随着对象 的存在而存在的。

3. 非静态的函数是可以直接访问静态与非静态的成员。
原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态
数据也随着对象的创建而存在了。

4. 静态函数不能出现this或者super关键字。
原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this
关键字是代表了一个函数 的调用者对象,这时候产生了冲突。


静态的数据的生命周期

静态的成员变量数据是优先于对象存在的。


static什么时候修饰一个函数


如果一个函数没有直接访问到非静态的成员时,那么就可以使用static修饰了。 一般用于工具类型的方法

静态函数不能访问非静态的成员?

静态函数只要存在有对象,那么也可以访问非静态的数据。只是不能直接访问而已。
class Student{

	String name; //名字

	static	String country = "中国"; //国籍

	//静态代码块 :静态代码块是在Student.class文件加载到内存的时候就马上执行的。
	static{
		System.out.println("静态代码块执行了...");
	}

	//构造函数
	public Student(String name){
		this.name = name;
	}
	
	//非静态的成员函数
	public  void study(){
		System.out.println("好好学习"+this);
	}


	//静态函数
	public static void sleep(){  //静态方法与非静态方法的字节码文件是同时存在内存中 的。 只是静态的成员变量数据是优先于对象存在而已。
		Student s= new Student("张三");
		System.out.println(s.name+"呼呼大睡...");
	}
}


class Demo2 {
	public static void main(String[] args) {
		Student.sleep();
	//	Student s = new Student("张三");
	
	}
}

static特点

        1 随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失。说明它的生命周期很长。

        2 优先于对象存在。-->静态是先存在,对象是后存在。

        3 被所有实例(对象)所共享。

        4 可以直接被类名调用  


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cjh666666/article/details/80730875

智能推荐

Ext2、Ext3、Ext4的区别_ext2 ext3 ext4区别-程序员宅基地

文章浏览阅读6.9k次。这三个都是文件的系统格式1>Linux kernel自2.6.28开始正式支持新的文件系统Ext4;2>Ext3对Ext2只是增加了一个日志功能而已,Ext4是Ext3的改进版,修改了Ext3中部分重要的数据结构,提供更加的性能和可靠性,更丰富的功能,更大的文件系统和更大的文件。(Ext3支持最大16TB文件系统和最大2TB文件,Ext4分别支持1EB的文件系统,和16TB的文..._ext2 ext3 ext4区别

FFmpeg WAV文件转换_ffmpeg mp4转wav-程序员宅基地

文章浏览阅读4.2k次。FFmpeg WAV文件转换_ffmpeg mp4转wav

PMI-ACP练习题(17)_根据敏捷宣言以下哪一项属于敏捷原则-程序员宅基地

文章浏览阅读211次。A. Defect-stream and Value-stream B. Information-flow and information-owner C. Value-added and non value-added D. Sigma-ranked and Theta-prioritized 哈利的敏捷团队刚完成了其中一个产品的价值流程图。_根据敏捷宣言以下哪一项属于敏捷原则

开发者必知的8款App快速开发工具-程序员宅基地

文章浏览阅读2.5k次。“我有一个好创意,就差一个CTO……” “原生APP开发难度大,周期长,成本高,还没上线市场已经被占领了。” “APP版本迭代更新,都是企业的一道难关,没有一个一劳永逸的解决方式吗?” “一个Web开发者如何能快速适应移动互联网时代,用HTML5开发出一个APP呢?” “安卓、IOS双平台同时开发,程序员都累死在加班的路上了……”针对行业痛点,国内外涌现出众多APP开发工具,开发者只要有相..._开发app 开发工具

Centos curl command not found_centos cur command not found-程序员宅基地

文章浏览阅读1.2k次。试过了很多帖子的办法,各种安装都不行这个亲测可以: yum install -y curl 或者 sudo yum -y install curl_centos cur command not found

windows安装k8s-程序员宅基地

文章浏览阅读8.1k次。安装minikube minikube安装包下载 下载minikube-linux-amd64 执行命令安装chmod +x minikube && sudo mv minikube /usr/local/bin/查看版本以及是否安装成功minikube version用指定镜像地址启动minikube start --registry-mirr...

随便推点

Unity中的UGUI源码解析之事件系统(6)-RayCaster(下)_physics raycaster-程序员宅基地

文章浏览阅读2.2k次,点赞8次,收藏3次。Unity中的UGUI源码解析之事件系统(6)-RayCaster(下)接上一篇文章, 继续介绍投射器.GraphicRaycasterGraphicRaycaster继承于BaseRaycaster, 是BaseRaycaster具体实现类, 是针对UGUI元素的投射器, 需要对象上同时存在Canvas组件.值得一提的是, GraphicRaycaster和PhysicsRaycaster还有Physics2DRaycaster存放的目录不同, 后面两个放在EventSystem目录下, 而Gr_physics raycaster

12.触摸屏驱动_12c接口 触摸屏-程序员宅基地

文章浏览阅读900次。触摸屏子系统是通过input子系统来实现,对应设备节点 /dev/input/eventn,熟悉套路后重点放在硬件程序的编写一、内核自带触摸屏驱动S3c2410_ts的简单分析S3c2410_ts.c (drivers\input\touchscreen) 内核自带三星的触摸屏驱动(1)入口函数:/*注册一个平台driver*/static int __init s3c2410ts_init(void){// init_MUTEX(&gADClock); _12c接口 触摸屏

VC画面闪烁及解决方法-程序员宅基地

文章浏览阅读832次。http://topic.csdn.net/u/20080219/21/0B5F0688-0651-45C4-AA99-7C19A0C2C900.html转载于:https://www.cnblogs.com/aoyihuashao/archive/2009/12/14/1623694.html_vc 子文档最大化时闪

科技和商业模式的发展真的会导致很多人失业吗?-程序员宅基地

文章浏览阅读393次。前言 众所周知,人类社会科技发展和新机器的发明,常常伴随着商业模式的变革。新的模式常常伴随着旧的模式的淘汰,或者并存,这可以让全社会的生产力和生活质量日渐增高。 随着新机器的层出不穷,每隔一段时间就出现很多人担心会出现所谓的“机器取代人类工作”的谬论,不过..._纺织机刚发明时的担忧

Java集合类之HashMap原理小结_hashtable不使用的原因?-程序员宅基地

文章浏览阅读138次。1. 认识HashMapHashMap是用来存储key-value键值对的数据结构。当我们创建HashMap的时候,如果不指定任何参数,它会为我们创建一个初始容量为16,负载因子为0.75的HashMap (load factor,记录数/数组长度)。当loadFactor达到0.75或指定值的时候,HashMap的总容量自动扩展一倍。它的底层采用Entry数组来保存所有的key-val..._hashtable不使用的原因?

layui表格全英文,跳页部分_laypage中英文切换-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏6次。因开发要求需要将layui table中的中文组件部分改为英文,其它地方修改layui.js文件即可,但是跳页部分缺没找到对应中文部分一开始想到js二次修改html的方式:var html = document.querySelectorAll('.layui-laypage-skip'); html[0].innerHTML = 'Page<input type="text" min="1" value="1" class="layui-input"><bu_laypage中英文切换

推荐文章

热门文章

相关标签