静态变量和非静态(实例)变量的区别

      一、  静态变量:独立存在的变量,只是位置放在某个类下,可以直接类名加点(.)调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是同样,可以直接调用。
        实例变量:就是相当于该类的属性,需要先初始化(实例化)该类,就是new 该类后,才可以调用。但是该类未被再次使用,被垃圾回收器回收后,该实例也将不存在了,就是不在内存中了。
下面是上述两类的区别:
1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关,如下Demo所示:
class Demo {
public static String a;
public String b;
public static void main(String[] args) {
   Demo d = new Demo();
   d.a; // 警告,虽然可以通过编译,但没有意义
   d.b; // 正确
   Demo.a; // 对static变量的正确引用
   Demo.b; // 错误
}
3.内存分配方式不同。static字段对每个类来说都只有一份,无论你创建多少对象,该static区域都只有一份,它对于这些对象来说是共享的;而非static字段,因为其从属于对象,因此每有一个对象,就会为该变量申请一个存储空间;
4.生命周期不同。从程序运行开始,static域就已经确定下来,因此在没有创建对象之前,就可以引用该区域变量及函数,而非static域的变量及函数,必须等(类)实例化之后才可以通过对象来调用。
5.理解了this之后,更能体会到static的含义。static方法就是没有this的方法,这也就是为什么在static方法中不能引用非static变量,因为该方法内没有隐含的this,编译器无从知道这个变量是属于哪一个类的。
二、静态变量的初始化
1、
最常用的初始化静态变量的操作是在声明变量时直接进行赋值操作
</pre><pre name="code" class="java">package day05;

public class staticTest {
	static{
		_i =20 ;}
	public static int _i = 10;
		public static void main(String[] args){
			System.out.println(_i);
		}
	
}


2、静态变量是通过赋值操作进行初始化的,因此可以通过静态函数返回值的方式为其初始化
package day05;

import javax.naming.InitialContext;

public class staticTest {
	
	static{
		_i =init() ;}
	public static int _i = init();
	private static int init(){
		return 10;
	}
		public static void main(String[] args){
			System.out.println(_i);
		}
	
}
返回结果也是10
3、不仅类定义中可以有多个static块,而且在编译时编译器会将多个static块按照代码的前后位置重新组合成一个static块。
      
package day05;

public class staticTest {
		public static int _i;
		static{
			
			_i = 20;
			_i = 10;
		}
		public static void main(String[] args){
			
			System.out.println(_i);//输出10,若是_i =20写在下面,则输出20
		}
	
}

静态变量被保存到常量池中的工作原理这里不深入讨论。在此需要注意的是:

  • 静态变量的声明与初始化是两个不同的操作;
  • 静态变量的声明在编译时已经明确了内存的位置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值