1、static 关键字
对于多个对象拥有相同的属性值,多次赋值很麻烦,希望做到一次赋值多次使用,属性加上static,相当于该属性是该类的所有对象所共享。
特点:静态修饰的成员变量,只有一份,被所有对象共享
静态的内存分析:static修饰的成员,class文件中和堆内存中保存的都是静态标记(地址),该静态成员变量真正的值在 静态区
静态方法:类名.方法名()调用
静态方法内不能访问非静态成员变量(或是非静态成员方法),因为静态方法优先于对象产生,所以在方法内不能出现this和super(指代的是对象),同时不知道this,super指代哪个对象(静态变量被所有对象共享)
无论是变量、方法还是代码块,只要用static修饰,就是在类被加载时就已经“准备好了”,也就是可以被使用或者已经被执行,都可以脱离对象而执行。反之,没有static,则必须是依赖于对象。
2、静态代码块和静态方法
一般情况下,如果有写代码必须在项目启动时就执行的话,需要使用静态代码块,这种代码主动执行;
需要在项目启动的时候就初始化,在不创建对象的情 况下,其他程序来调用的时候,需要使用静态方法,这种代码被动执行;
静态方法在类加载的时候 就已经加载,可以用类名直接调用。比如main方法就必须是静态的,这是程序入口。
静态代码块和静态方法两者的区别就是:
(1)静态代码块是自动执行的;
(2)静态方法是被调用的时候才执行的。
(3)静态代码块与非静态代码块区别很简单:
(4)静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
(5)非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次。
对象初始化的顺序:
静态代码块==>执行父类非静态代码块和构造方法==>子类非静态代码块和构造方法
而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。