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版本 常见的 ...
随机推荐
- 【最新】Power BI混合现实应用Mixed Reality app预览版正式发布
1.介绍 2018年3月13日,Power BI在官方博客和Docs文档发布了Power BI for Mixed Reality应用预览版的消息, 也就是可以以后在更虚拟的世界中来观察你的报表,想象 ...
- Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL
前面的文章主要是整理的Android 官方文档对OpenGL ES支持的介绍.通过之前的文章,我们基本上可以完成的基本的形状的绘制. 这是本人做的整理笔记: https://github.com/re ...
- java--抽象类实例(包含静态内部抽象类)
静态内部抽象类可以被继承. public class testfather { public static void main(String[] args) { person.talk2 a = ne ...
- Linux增加LV(逻辑卷)容量
Linux增加LV(逻辑卷)容量 2017-09-29-17:34:13 个人原创博客,转载请注明出处. 查看逻辑卷的相关命令: lvs vgs 命令: [root@arch ~]# vgs VG # ...
- 使用python读取word,写入execl
word里面有2张表,需要找到第二张表,并写入execl中: 代码如下: #coding:utf-8 import os from docx import Document import win32c ...
- Navicat通过跳板机连接数据库
完成对应设置后,即可连接数据库,本人亲测!
- 关于SQL性能优化的十条经验
1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便会 ...
- Liquibase的简单使用
LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.它的目标是提供一种数据库类型无关的解决方案,通过执 ...
- Webpack的加载器
一.什么是加载器(loaders)loaders 用于转换应用程序的资源文件,他们是运行在nodejs下的函数 使用参数来获取一个资源的来源并且返回一个新的来源(资源的位置),例如:你可以使用load ...
- diy51单片机最小系统------从零件到51整体测试成功小白篇
前言 因为现在网上资料很多,但是很多博主水平不一样,有很多时候,自己在网上找了很多资料,因为自己智商不够,有时候感觉很多关键性的东西没说清楚,导致解决不了问题.那现在就从一个小白的角度来记录自己做过的 ...