Java基础之static关键字
1.static关键字用途
总结出处:https://www.cnblogs.com/dolphin0520/p/3799052.html
https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral
1)修饰变量
在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员,这是相对于对象的属性和方法来说的。
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
static成员变量可以用作计数。
2)修饰方法
static的另一个作用,就是修饰成员方法,静态方法不依赖于任何对象就可以进行访问,因此static方法中不能用this和super关键字。相比于修饰成员属性,修饰成员方法对于数据的存储上面并没有多大的变化,因为我们从上面可以看出,方法本来就是存放在类的定义当中的。static修饰成员方法最大的作用,就是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗。在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。
3)修饰代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
2.访问static方法
1)非静态方法必须实例化之后才能调用,static方法可以直接调用;
public class Test {
public static void main(String args[]) {
run();
speak();//不能直接调用非静态方法,必须先实例化,如下
//Test t = new Test();
//t.run();
}
public void speak() {
System.out.println("speak");
}
public static void run() {
}
}
2)static方法和非static方法互相调用
静态方法只能调用静态方法,不可以调用非静态方法,反之是可以的。另外,静态方法也只能调用静态成员变量,且静态成员变量需要先于静态方法声明。
public class Test {
public static void main(String args[]) {
}
public void speak() {
System.out.println("speak");
//非静态方法能调用静态方法
run();
}
public static void run() {
//静态方法不能调用非静态方法
speak();
}
}
3.static变量和代码块的执行顺序
出处(含实例代码):https://www.cnblogs.com/jj-chenjunjie/p/5331107.html
Java中的静态变量和静态代码块是在类加载的时候就执行的,实例化对象时,先声明并实例化变量再执行构造函数。如果子类继承父类,则先执行父类的静态变量和静态代码块,再执行子类的静态变量和静态代码块。同样,接着在执行父类和子类非静态代码块和构造函数。
注意:(静态)变量和(静态)代码块的也是有执行顺序的,与代码书写的顺序一致。在(静态)代码块中可以使用(静态)变量,但是被使用的(静态)变量必须在(静态)代码块前面声明。
最后给出执行步骤:
1)父类静态变量和静态代码块(先声明的先执行);
2)子类静态变量和静态代码块(先声明的先执行);
3)父类的变量和代码块(先声明的先执行);
4)父类的构造函数;
5)子类的变量和代码块(先声明的先执行);
6)子类的构造函数。
补充:静态变量,静态代码块先于System.out.println(“打印输出”)执行,静态的东西只执行一次,相当于全局变量。