java静态变量和静态方法的区别

Java中的静态变量和静态代码块是在类加载的时候就执行的,实例化对象时,先声明并实例化变量再执行构造函数。如果子类继承父类,则先执行父类的静态变量和静态代码块,再执行子类的静态变量和静态代码块。同样,接着在执行父类和子类非静态代码块和构造函数。

static 静态变量。
	加载:java虚拟机在加载类的过程中为静态变量分配内存。
	类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享
	销毁:类被卸载时,静态变量被销毁,并释放内存空间。static变量的生命周期取决于类的生命周期

类初始化顺序:
	静态变量、静态代码块初始化
	构造函数
	自定义构造函数

成员变量和静态变量的区别:
1.两个变量的生命周期不同
  成员变量随着对象的创建而存在,随着对象的被回收而释放;
  静态变量随着类的加载而存在,随着类的消失而消失;
2.调用方式不同
  成员变量只能被对象调用;
  静态变量能被对象调用,还能被类名调用;
3.别名不同
  成员变量也称为实例变量;
  静态变量被称为类变量;
4.数据存储位置不同
  成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据;
  静态变量数据存储在方法区的静态区,所以也叫对象的共享数据;

举个栗子:

我们在面试的时候经常都会出现这样的一道题

下边的代码输出顺序是什么?
	
	public class Test extends Base{

   static{
       System.out.println("test static");
   }
    
   public Test(){
       System.out.println("test constructor");
   }
    
   public static void main(String[] args) {
       new Test();
   }
}

class Base{
    
   static{
       System.out.println("base static");
   }
    
   public Base(){
       System.out.println("base constructor");
   }
}

输出结果为:

base static
test static
base constructor
test constructor

我们先来想一下这段代码具体的执行过程,在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Test类,而在加载Test类的时候发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类的时候,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器。因此,便出现了上面的输出结果。

总结

做java的朋友对于对象的生命周期可能都比较熟悉,对象基本上都是在jvm的堆区中
创建,在创建对象之前,会触发类加载(加载、连接、初始化),当类初始化
完成后,根据类信息在堆区中实例化类对象,初始化非静态变量、非静态代码以及
默认构造方法,当对象使用完之后会在合适的时候被jvm垃圾收集器回收。
读完本文后我们知道,对象的生命周期只是类的生命周期中使用阶段的主动引用的
一种情况(即实例化类对象)。而类的整个生命周期则要比对象的生命周期长的多。