java中static类型的代码块和静态成员变量的执行顺序
static
静态成员变量
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
class Circle
{
private double radius;
public Circle(double radius){this.radius=radius;}
public double findArea(){return Math.PI*radius*radius;}
}
创建两个Circle对象
Circle c1=new Circle(2.0); //c1.radius=2.0
Circle c2=new Circle(3.0); //c2.radius=3.0
Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。
上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然
在Java类中声明变量、方法和内部类时,可使用关键字static做为修饰符
static标记的变量或方法由整个类(所有实例)共享,如访问控制权限允许,可不必创建该类对象而直接用类名加‘.’调用。
静态方法(Static Method)
没有对象的实例时,可以用类名.方法名()的形式访问由static标记的类方法
class Person {
private int id;
private static int total = 0;
public static int getTotalPerson() {
return total;
}
public Person() {
total++;
id = total;
}
}
public class TestPerson {
public static void main(String[] args) {
System.out.println("Number of total is " +Person.getTotalPerson());
在static方法内部只能访问类的static属性,不能访问类的非static属性。
class Person {
private int id;
private static int total = 0;
public static int getTotalPerson() {
id++; //非法
return total;
}
public Person() {
total++;
id = total;
}
}
因为不需要实例就可以访问static方法,因此static方法内部不能有this,也不能有super
class Person {
private int id;
private static int total = 0;
public static void setTotalPerson(int total){
this.total=total; //非法,在static方法中不能有this,也不能有super
}
public Person() {
total++;
id = total;
}
}
public class TestPerson {
public static void main(String[] args) {
Person.setTotalPerson();
}
}
在静态方法里只能直接调用同类中其它的静态成员(包括属性和方法),而不能直接访问类中的非静态成员(包括属性和方法)。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
静态方法不能以任何方式引用this和super关键字。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。
静态初始化
一个类中可以使用不包含在任何方法体中的静态代码块(static block ),当类被载入时,静态代码块和静态成员变量按顺序执行,且只被执行一次,静态块经常用来进行类属性的初始化。
static块通常用于初始化static (类)属性
package cn.com.Classwork190122;
public class StaticTest {
public StaticTest() {
System.out.println("无参构造方法");
}
{
System.out.println("代码块");
}
static {
System.out.println("静态代码块");
}
private static int legs = 4;
public static void main(String[] args) {
System.out.println(new StaticTest());
System.out.println(new StaticTest());
}
}
在执行这段代码时,程序首先运行静态代码块,接着运行静态成员变量,然后运行普通代码块,最后再运行类的无参构造方法。
即静态初始化运行顺序为:顺序执行静态代码块和静态成员变量->普通代码块->构造函数->普通成员变量
体现在上述代码中即为“13->16->9->5"
的执行顺序
最后附上本文参考链接:github/miaozilong/JAVA SE