java中的static
static只可以修饰变量和方法
静态变量和非静态变量
静态变量属于类,随着类的加载过程而加载,
非静态变量属于对象,随着对象的创建才加载!
public static void main(String[] args) {
System.out.println(StaticTest.age);//静态变量可以直接通过类名+变量名的方式访问
System.out.println(StaticTest.score);//报错:非静态变量不可以直接通过类名+变量名的方式访问
StaticTest staticTest = new StaticTest();
System.out.println(staticTest.score);//访问非静态变量需要先new一个对象,再通过对象名访问
System.out.println(staticTest.age);//也可以通过对象名访问静态变量,但是不建议这样用
}
静态方法和非静态方法
静态方法与静态变量相同,都是随着类的加载而加载,非静态方法是随着对象的创建而加载,所以非静态方法可以调用静态方法,因为在调用非静态方法之前静态方法早已经加载完成,而静态方法不能调用非静态方法。
public class StaticTest {
static int age;//静态变量
int score;//非静态变量
public static void main(String[] args) {
s1();//报错,因为此方法还没有被加载
s2();//通过,因为静态方法随着类的加载而加载
StaticTest staticTest1 = new StaticTest();
staticTest1.s1();//非静态方法加载成功
}
//非静态方法
public void s1(){
}
// 静态方法
public static void s2(){
}
匿名代码块和静态代码块
**匿名代码块:**随着对象的创建而加载
**静态代码块:**随着类的加载而加载
静态代码块、匿名代码块、构造方法的执行顺序
public class Test1 {
public static void main(String[] args) {
Test1 test1 = new Test1();
}
public Test1() {
System.out.println("空参构造器被调用");//3:根据new对象时用的是空参构造器还是有参构造器来决定
}
static {
System.out.println("静态代码块被调用");//1:只执行一次
}
{
System.out.println("匿名代码块被调用");//2:在每次new对象的时候执行,在初始化构造器之前执行
}
}
静态导入包
正常倒包只是倒到类:
import java.lang.Math;
而我们可以进一步导入指定的方法,需要在前边加上static修饰符
import static java.lang.Math.random;
package demoStatic;
import java.lang.Math;
import static java.lang.Math.random;
/**
* @author sjhstart
* @create 2021-07-09-18:16
*/
public class Test1 {
public static void main(String[] args) {
System.out.println(Math.random());//import java.lang.Math;
System.out.println(random());//import static java.lang.Math.random;
}