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版本 常见的 ...
随机推荐
- iOS工具——Xcode9无证书真机调试
入坑iOS开发这么久,一直都是在模拟器上运行,公司的项目也都有公司的开发者账号进行真机调试.但是很多时候在网上download一些demo想在真机上运行看一下效果的时候都没法成行,今天抽空好好研究和学 ...
- LCA倍增算法
LCA 算法是一个技巧性很强的算法. 十分感谢月老提供的模板. 这里我实现LCA是通过倍增,其实就是二进制优化. 任何一个数都可以有2的阶数实现 例如16可以由1 2 4 8组合得到 5可以由1 2 ...
- 22.jQuery(实例)
1.开关灯效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 解决iar试调时程序无法进入主函数的问题
尼玛,我TM当时核心板上还接着摄像头,啊啊啊啊,必须吧摄像头关了,不然,k60初始化时会检测io口状态,状态不正确当然无法进入主函.摄像头上电即输出数据,会对单片机上电检测造成干扰.
- JavaScript编码规范(1)
参考的是百度公司的JS规范,分为两部分.这是第一部分 [建议] JavaScript 文件使用无 BOM 的 UTF-8 编码. 空格 [强制] 二元运算符两侧必须有一个空格,一元运算符与操作对象之间 ...
- nodejs-url网址解析的好帮手
HTTP协议中url和uri的区别. 每个url都是uri,但是不是每个uri都是url. URI:是统一资源的标识符,web上可用的每种资源如HTML文档.图像.视频片段.程序等都是一个URI来定位 ...
- Java设计模式(二)抽象工厂模式
一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性 ...
- UML系列图
用例图: 时序图:
- spring 文件模板下载多种实现方式
针对于文件的下载,我们有很多种实现方式.业务场景是这样子的,要实现Excel文件的导入和导出功能,问题对于java的POI操作没有问题,所以实现文件的下载就相对简单,只需要从数据库取出相关的数据,针对 ...
- 笔记:Struts2 输入校验
Struts2的输入校验包含了客户端校验和服务器端校验,通过编写校验规则文件来实现输入校验,需要增加 Convention 插件,将 struts2-convention-plugin-2.3.31. ...