本文撰文环境:

  1. windows10专业版(1809)
  2. eclipse编译工具 --- Version: 2018-12 (4.10.0)
  3. jdk环境java11(未使用jdk11特性)

本文理解要点:

  1. 理解类中被static定义的(静态成员)成员方法或变量,即使不实例化该类,也已经加载到了当前的运行环境的规定
  2. 理解类中没有被static定义的(非静态成员)成员方法或变量,必须通过实例化该类,才可以加载到当前的运行环境的规定
  3. 静态变量又称为类变量,非静态变量又称为实例变量,区别在于当初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

 

 

以上代码已经很好的解释了非静态与静态的区别,如果没有理解到,建议多敲代码才行哦!