1、static 关键字

对于多个对象拥有相同的属性值,多次赋值很麻烦,希望做到一次赋值多次使用,属性加上static,相当于该属性是该类的所有对象所共享。

特点:静态修饰的成员变量,只有一份,被所有对象共享

静态的内存分析:static修饰的成员,class文件中和堆内存中保存的都是静态标记(地址),该静态成员变量真正的值在  静态区

静态方法:类名.方法名()调用

静态方法内不能访问非静态成员变量(或是非静态成员方法),因为静态方法优先于对象产生,所以在方法内不能出现this和super(指代的是对象),同时不知道this,super指代哪个对象(静态变量被所有对象共享)

无论是变量、方法还是代码块,只要用static修饰,就是在类被加载时就已经“准备好了”,也就是可以被使用或者已经被执行,都可以脱离对象而执行。反之,没有static,则必须是依赖于对象。

2、静态代码块和静态方法

一般情况下,如果有写代码必须在项目启动时就执行的话,需要使用静态代码块,这种代码主动执行;

需要在项目启动的时候就初始化,在不创建对象的情 况下,其他程序来调用的时候,需要使用静态方法,这种代码被动执行;

静态方法在类加载的时候 就已经加载,可以用类名直接调用。比如main方法就必须是静态的,这是程序入口。

静态代码块和静态方法两者的区别就是:

(1)静态代码块是自动执行的;               

(2)静态方法是被调用的时候才执行的。

(3)静态代码块与非静态代码块区别很简单:

(4)静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;

(5)非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次。

对象初始化的顺序:

静态代码块==>执行父类非静态代码块和构造方法==>子类非静态代码块和构造方法  
而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。