JAVA_SE基础——34.static修饰成员变量
需求:描述一下学校的学生。 特点:都是中国人....
测试代码1:
class Student{
String name;
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("陈明");
System.out.println("姓名:"+s1.name+" 国籍:"+ s1.country);
System.out.println("姓名:"+s2.name+" 国籍:"+ s2.country);
}
}
运行结果:
姓名: 小红 国籍: 中国
姓名: 陈明 国籍: 中国
这段代码能够运行,看似没有什么问题,那么我们再看下代码在内存中是怎么运行的?
测试代码1内存图:
s1和s2的对象都有个country="中国";
一两个的时候都没什么问题,但是学校,都是成千上万个的,每多一个学生,内存就多一个country="中国"; 所有学生的国籍都是中国的 ,都有公共的特点,所以就没必要在每个学生对象上面都加country="中国"; 这样会很耗内存的 。。
所以我们发现一个问题先
目前存在的问题: 所有的学生都是中国 的,有n个学生就会有n份中国的 数据存内存中,这样子
会浪费内存。
解决问题,内存优化
1:为了让所有Student对象都共享一个country?
可以尝试将country放入共享区。
2:country变量如何放入共享区?对象如何访问?
使用static
测试代码2:
class Student{
String name;
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("陈明");
System.out.println("姓名:"+s1.name+" 国籍:"+ s1.country);
System.out.println("姓名:"+s2.name+" 国籍:"+ s2.country);
}
}
运行结果:
姓名: 小红 国籍: 中国
姓名: 陈明 国籍: 中国
测试代码1:和测试代码2:运行结果一样,而且在代码上貌似只加了static关键字,肯定有人会觉得这两段代码没区别
来看下测试代码2的内存图:
测试代码1:和测试代码2:内存图的区别是:静态的成员变量只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中都维护一份的。。(有static的成员变量叫做静态成员变量。没有则叫非静态成员变量)
没static关键字:每new一个对象 ,都多一个conuntry="中国"
有static关键字:每new一个对象,都去调用数据共享区的country="中国"
使用了static修饰country,那么这时候country就是一个共享的数据。
测试代码3:
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); // 小日本
}
}
运行结果:
姓名: 小红 国籍: 小日本
姓名: 陈明 国籍: 小日本
大家肯定会对结果有疑问的,不急,先看内存图
测试代码3内存图:
s1.country = "小日本";
这行代码,把方法区的 country="中国" 给从新赋值了 所以此行代码后的所有new出来的Student对象。 国籍都是country="小日本"
测试代码4:
class Student{
String name;
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); // 中国
}
}
运行结果:
姓名: 小红 国籍: 小日本
姓名: 陈明 国籍: 中国
测试代码4内存图:
这次没有加static关键字,所以每个对象自己单独有个country
s1.country = "小日本";
只是把s1所连接的对象里面的country赋值成"小日本" 了、
所以不影响s2所连接的对象。
下面我们来详细的学习一下static关键字
static是(静态\修饰符)
1. static修饰成员变量 :如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。
静态成员变量的访问方式:
方式1: 可以使用对象进行访问。
格式: 对象.变量名。
方式二: 可以使用类名进行访问。
格式: 类名.变量名;
注意:
1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。
2. 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候才使用static修饰。
static修饰成员变量的应用场景: 如果一个数据需要被所有对象共享使用的时候,这时候即可好实用static修饰。

JAVA_SE基础——34.static修饰成员变量的更多相关文章
- JAVA_SE基础——35.static修饰成员函数
在Java中适用static关键字修饰的方法称为静态方法. 声明静态方法的语法格式如下: 权限修饰符 static 数据类型 方法名(){ 方法体 } 静态方法 可以使用类名直接调用 类名.方 ...
- 静态static关键字概述和静态static关键字修饰成员变量
static关键字 概述 关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的.也就是说,既然属于类,就可以不靠创建对象来调用了 ...
- JAVA_SE基础——42.final修饰符
高手勿喷~ final关键字可用于修饰类.变量和方法,它有"这是无法改变的"或者"最终"的含义,因此被final修饰的类.变量和方法将具有以下特征: 1.fin ...
- static 类成员变量 和 static const类成员变量
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...
- static 修饰的变量在程序中容易出现的问题
package lianxi; public class StaticTest { int a = 0; static int b =0; StaticTest(){ ...
- Java面试 - static 修饰的变量和方法有哪些特点?
1.static修饰的变量和方法,在类加载时即被初始化,可直接通过类名.变量名和类型.方法名进行调用. 2.static修饰的变量,在类加载时会被分配到数据区的方法区.类的实例可共享方法区中的变量.如 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第6节 static静态_12_静态static关键字修饰成员变量
创建一个学生类 定义成员变量,无参构造,全参构造.成员变量的getter和setter 所在教室必须是一样的,定义所在教室 下面来创建两个学生 只给one的room赋值了.two的教室并没有赋值.都输 ...
- java中的static(包括类前面修饰的static、方法前面修饰的static、成员变量前面修饰的static)
static是静态修饰符: 什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个 ...
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
在perference 加content Assist 可以设置快捷键 透视图与视图 透视图:Debug和java主窗口 视图:每一个小窗口就是视图 高版本的java可运行低版本的java版本 常见的 ...
随机推荐
- [BZOJ1609] [Usaco2008 Feb] Eating Together麻烦的聚餐 (dp)
Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...
- Zabbix JMX监控之ActiveMQ
监控原理: ActiveMQ作为依赖java环境的中间件,同样可以像tomcat一样用JMX(java扩展程序)监控.并且与tomcat不同的是,ActiveMQ自带了JMX,只需在配置文件中开启即可 ...
- UWP 使用UCT的Markdown控件
之前在网上偶然碰到过 一个在线的Markdown Text编辑器 http://mahua.jser.me/,功能很齐全. 然后就突然有了一个大胆的想法 这个玩意要是在uwp中实现,用来做更新日志说明 ...
- fitnesse - 安装部署
fitnesse - 安装部署 2017-09-29 1 先决条件Java环境 确保机器上装了java, java -version 2 安装fitnesse http://fitnesse.org/ ...
- Ansible学习总结(1)
---恢复内容开始--- 1. Ansible概述 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric) ...
- SDN 网络系统之 Mininet 与 API 详解
SDN 网络系统之 Mininet 与 API 详解 Mininet 是轻量级的软件定义网络系统平台,同时提供了对 OpenFlow 协议的支持.本文主要介绍了 Mininet 的相关概念与特性,并列 ...
- NYOJ一种排序
//最重要的收获就是懂得了,还可以调用库函数直接对结构体进行排序sort(const void *,const void *,cmp) /* bool cmp(rect c,rect d) { if( ...
- 功能性AI术语表
算法:一套计算机要遵循的指令.一个算法可以是一个简单的单步程序也可以是一个复杂的神经网络,但是通常被用来指一个模型. 人工智能:这是一个统称.广义上说,软件意味着模仿或取代人类智能的各个方面.人工智能 ...
- 转载NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes
原文:http://mp.weixin.qq.com/s/dHaiX3H421jBhnzgCCsktg ClusterIP ClusterIP服务是Kuberntets的默认服务.它在集群内部生成一个 ...
- 利用sfc文件构建网络渗透
收集哈希 SCF(Shell命令文件)文件可用于执行一组有限的操作,例如显示Windows桌面或打开Windows资源管理器,这并不是什么新鲜事.然而,一个SCF文件可以用来访问一个特定的UNC路 ...