需求:描述一下学校的学生。  特点:都是中国人....

测试代码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没多久的菜鸟,希望有错大家可以点出。



最新文章

  1. 全文检索原理以及es
  2. windows计划任务+批处理文件实现oracle数据库的定时备份与恢复
  3. mysql 锁-比较详细、深入的介绍
  4. BeanUtils
  5. 剑指Offer:面试题31——连续子数组的最大和(java实现)
  6. java.lang.IllegalArgumentException: template not initialized; call afterPropertiesSet() before using
  7. BZOJ1070 [SCOI2007]修车
  8. Spring与Quartz的整合实现定时任务调度 以及crontab的用法
  9. data and dream
  10. linux下mysql函数的详细案列
  11. Python基础(8)--文件
  12. 转:Apache POI Tutorial
  13. 32.怎样在Swift中实现TabBar和导航视图结合的项目?
  14. 让Barebox正确引导Tiny6410的linux内核
  15. C#BASE64 UTF8字符串加密解密
  16. Oracle使用并行建索引须要注意的问题
  17. 完全删除Postgresql
  18. 1.10 tuple 元组
  19. Spring之AOP模块
  20. 使用Ninject的一般步骤

热门文章

  1. PLSQL Developer连接远程数据库的配置
  2. [转]使用Subversion进行版本控制
  3. Docker学习——pinpoint部署
  4. 怎么用secureCRT连接Linux
  5. JVM内存越多,能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。
  6. find命令总结
  7. 如何 创建一个model对象保存到LIST集合里面并取出来
  8. Eclipse 基础操作与设置
  9. push_back和emplace_back的区别
  10. 笔记:Maven 生命周期与命令行详解