本文撰文环境:
- windows10专业版(1809)
- eclipse编译工具 --- Version: 2018-12 (4.10.0)
- jdk环境java11(未使用jdk11特性)
本文理解要点:
- 理解类中被static定义的(静态成员)成员方法或变量,即使不实例化该类,也已经加载到了当前的运行环境的规定
- 理解类中没有被static定义的(非静态成员)成员方法或变量,必须通过实例化该类,才可以加载到当前的运行环境的规定
- 静态变量又称为类变量,非静态变量又称为实例变量,区别在于当初java被我们学习的时候翻译词语没有掌握好,所以现在听到最多的就是非静态成员和静态成员的称谓
引言
在java学习中常常会遇到静态代码块、静态成员、静态成员方法、成员方法、成员变量这些概念,其实这些都是类中的成员,类中的静态代码块也是成员,不过他不是用来调用的,他是用来初始化类的代码块。而且,不论该类是否实例化,静态代码块都不能用来调用。
那么除了非静态代码块,非静态成员变量(实例变量)、非静态成员方法(实例方法)、静态成员方法(类方法)、静态成员变量(类变量)这四类都是用来调用的,我们的代码中最多的也是对这四类成员的操作。
其实,非静态成员(实例成员)和静态成员(类成员)他们的区别在于,是否在该类被实例化之前就被加载的区别。如果类中的成员(成员方法和成员变量),在没有被实例化之前就能用过[类.成员]的方式访问,就是静态成员(类成员),如果必须被实例化才能被访问的呢,就是非静态成员(实例成员)啦。
代码实例:
class Employee {
public static void main(String[] args) {
System.out.println("ex类静态变量StaticA的原来的值是:" + ex.StaticA);
System.out.println("ex类静态变量StaticA加一操作已执行");
// 以下代码试图访问普通成员方法将会报错,因为它不是静态变量,没有经过实例化是无法访问的
// System.out.println("ex类非静态变量b原值是:"+ex.b);
/**
* 以下通过直接调用ex类的静态变量StaticA加一操作,这里可以直接通过[类.静态变量]的方式赋值和读取,
* 是因为静态的变量可以不经过实例化都可以访问
*/
ex.StaticA = ex.StaticA + 1;
System.out.println("ex类静态变量StaticA加一后的值是:" + ex.StaticA);
// 现在我们通过将ex类实例化成两个对象e、e0
System.out.println("将ex类实例化成两个对象:e、e0");
ex e = new ex();
ex e0 = new ex();
/*
* 输出结果都为2,因为我们在没有实例化的时候就已经对ex类的静态变量StaticA进行了加一操作,
* 所以这里实例化出来也是被修改过后的静态值,所以这里可以说明,静态变量是属于类的,而不是属于对象的
*/
System.out.println("将ex的实例化对象e的静态变量StaticA输出:" + e.StaticA);
System.out.println("将ex的实例化对象e的静态变量StaticA输出:" + e0.StaticA);
System.out.println("再次执行ex类静态变量StaticA加一操作");
ex.StaticA = ex.StaticA + 1;
/**
* 通过以上直接对ex类的静态变量的加一操作
* 发现也影响了对该类的实例化对象e、e0的静态变量变量产生了影响,即通过调用类的静态变量加一操作,
* 造成了该类的实例对象e、e0的静态变量StaticA都被加一的操作
*/
System.out.println("输出ex类静态变量StaticA的值:" + ex.StaticA);
System.out.println("输出ex类的实例实例化对象e的静态变量StaticA" + e.StaticA);
System.out.println("输出ex类的实例实例化对象e的静态变量StaticA" + e0.StaticA);
/**
* 接下来我们对ex类的实例化对象e的非静态变量b进行了一次加一操作
* 然后分别输出ex类的实例化对象e、e0非静态变量b,
* 发现对ex类的实例化对象e的非静态变量b的加一操作,
* 并没有影响ex类的实例化对象e0的非静态变量b的值
* 这再次说明了两件事:
* 1.对象之间的存储空间是相互独立的
* 2.静态变量是属于类的,而不是属于类的实例化对象的
*
*/
System.out.println("将ex的实例化对象e的非静态变量加一");
e.b = e.b + 1;
// 以下结果输出并没有受到ex类的实例化对象e0非静态变量b加一操作的影响
System.out.println("将ex的实例化对象e0的非静态变量输出:" + e0.b);
}
}
class ex {
public static int StaticA = 1;
public int b = 2;
}
输出结果:
ex类静态变量StaticA的原来的值是:1
ex类静态变量StaticA加一操作已执行
ex类静态变量StaticA加一后的值是:2
将ex类实例化成两个对象:e、e0
将ex的实例化对象e的静态变量StaticA输出:2
将ex的实例化对象e的静态变量StaticA输出:2
再次执行ex类静态变量StaticA加一操作
输出ex类静态变量StaticA的值:3
输出ex类的实例实例化对象e的静态变量StaticA3
输出ex类的实例实例化对象e的静态变量StaticA3
将ex的实例化对象e的非静态变量加一
将ex的实例化对象e0的非静态变量输出:2
以上代码已经很好的解释了非静态与静态的区别,如果没有理解到,建议多敲代码才行哦!