这一节我们来学习java语言中一个新的关键字就是static关键字。
当然对于每一个关键字,我们都要明确的是它有什么作用,怎么用。我们先来看一个例子:
~~~
class Person
{
String name;//姓名
String country = "中国";//国籍
public void printInfo()
{
System.out.println(name+":"+country);
}
}
class StaticTest
{
public static void main(String[] args)
{
Person p = new Person();
p.name = "小强";
p.printInfo();
Person p1 = new Person();
p1.name = "小明";
p1.printInfo();
Person p2 = new Person();
p2.name = "小红";
p2.printInfo();
}
}
~~~
我们看看这个例子的运行结果:
![](https://box.kancloud.cn/2016-05-18_573c41ecdb674.jpg)
我们会发现创建的三个对象中,姓名不同,但是国籍是相同的,那么对于很多个对象呢,国籍是相同的,那么我们就会想能不能把国籍独立起来放到一个空间中供所有对象直接引用就可以了,而在对象中只需要有姓名这个属性即可。
java语言给我了我们解决这个问题的途径,那就是我们现在要说的static关键字。
很明显,我们也就明确了static关键字的作用:就是把特有数据谜面所有对象都能共享的数据,也称为对象的共享数据。
那么上面的代码用static关键字进行优化:
~~~
class Person
{
String name;//姓名
static String country = "中国";//国籍
public void printInfo()
{
System.out.println(name+":"+country);
}
}
~~~
当然结果还是我们上面看到的结果,但是实际上,内存中会把country专门存放在一个独立的空间中,而每个对象中都只有name属性,这样就节省了很多不必须的空间。
我们刚才看了static关键字的作用,那么下面我们再来看static关键字有哪些特点呢?
我们通过上面的例子,引申总结出以下四条特点:
**1.static既是关键字,也是修饰符,用于修饰成员。**这里的成员就是成员变量和成员函数。
**2.static关键字修饰的数据是共享数据。**我们前面看到了static的作用就是修饰共享数据,而对象中存储的数据就是每个对象的特有数据。
**3.static关键字修饰的成员随着类的加载而加载。**这是由于static修饰的数据要被所有对象共享,所以要在对象共享之前就存在,因此java语言就赋予了static这样的功能。
**4.static关键字修饰的成员优先于对象存在,**因为static成员是随着类的加载面存在的。
**5.static关键字修饰的成员多了一种调用方法,可以直接被类名调用,即:类名.静态成员 的调用方式。**
比如上面的例子中,我们可以这样调用:
~~~
class StaticTest
{
public static void main(String[] args)
{
Person p = new Person();
//p.name = "小强";
//p.printInfo();
System.out.println(Person.country);
}
}
~~~
结果:
![](https://box.kancloud.cn/2016-05-18_573c41eceed4b.jpg)
我们看到staitc修饰的成员我们可以直接用类名去调用,也就是说我们不需要创建对象就可以直接调用,因为static成员随着类的加载而存在,实现了相同数据被不多个对象的共享。
当然,既然我们的java是面向对象语言,如果我们把所有的成员都用static修饰,也就是说没有对象了,那是一件多么可怕的事情呢。但是,不管怎么说,共享数据个人认为确实还是比较爽的。
- 前言
- 1.1 基本常识
- 1.2 Java语言概述
- 1.3 Java语言的环境搭建
- 1.4 Java程序开发之初体验--Hello World
- 2.1 关键字
- 2.2 标识符
- 2.3 注释
- 2.4 常量
- 2.5 进制扫盲
- 2.6 变量和数据类型(1)
- 2.7 变量和数据类型(2)
- 2.8 运算符
- 3.1 if语句
- 3.2 switch语句
- 3.3 while和do-while语句
- 3.4 for语句
- 3.5 for循环的嵌套
- 3.6 break语句与continue语句
- 4.1 函数的定义
- 4.2 定义函数的两个明确
- 4.3 函数的内存加载过程
- 4.4 函数的重载
- 5.1 数组的定义
- 5.2 数组的内存分配及特点
- 5.3 数组操作中常见问题
- 5.4 数组常用操作(1)
- 5.5 数组常用操作(2)
- 5.6 二维数组
- 6.1 面向对象的概述
- 6.2 类与对象的关系
- 6.3 对象的内存体现
- 6.4 成员变量与局部变量
- 6.5 类类型参数与匿名对象
- 6.6 基本数据类型参数与引用数据类型参数的传递过程
- 6.7 封装
- 7.1 构造函数概述与默认构造函数
- 7.2 构造函数与一般函数的区别
- 7.3 构造函数的重载
- 7.4 构造函数的内存加载
- 7.5 构造函数需要注意的几个细节
- 7.6 this关键字的原理
- 7.7 this关键字的细节与应用
- 8.1 static关键字之特点
- 8.2 成员变量与静态变量的区别
- 8.3 static关键字使用的注意细节
- 8.4 main函数的解析与细节
- 8.5 static关键字的使用场景
- 8.6 静态的内存加载
- 8.7 静态代码块
- 8.8 构造代码块
- 9.1 继承
- 9.2 单继承与多重继承
- 9.3 子父类中成员变量特征体现