static关键字

static的作用
0.static可以修饰变量,被static修饰的变量叫做静态变量,程序运行时静态变量存放在方法区里面,因此,静态变量在类加载阶段赋值,并且只赋值一次。请看例1
1.static可以修饰方法,被static修饰的方法叫做静态方法,不用创建对象就能能直接访问该方法,即使用类名.静态方法名的方式。静态方法不能访问非静态的数据,静态方法不能使用this。请看例2
2.static可以定义静态语句块,静态语句块在类加载阶段执行,并且只执行一次,并且是自上而下的顺序执行,在构造方法之前执行。请看例3

static修饰的变量、方法、代码块都是隶属于类(class)级别的,跟对象无关。某一类物体如果可以被多个其他物体所共享,那么可以将这类物体使用static修饰。
比如wifi,多个人可以共同使用同一个wifi,所以wifi可以使用static修饰。手机是每人使用自己的,就不能用static修饰。

例1:

public class StaticTest01 {

    public static void main(String[] args){

        Employee e = new Employee();
        //可以通过对象名.静态方法名的方式访问,工作中不这样使用
        System.out.println(e.company);
        //可以通过类名.静态方法名的方式访问,工作中使用这种写法
        System.out.println(Employee.company);
        e = null;
        System.out.println(e.company);//不会报空指针,说明静态变量跟对象无关。
    }

}

class Employee{

    private String name;

    static String company = "阿里巴巴";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

例2:

class StaticTest02{

    //成员变量
    int i;

    //成员方法
    //成员方法必须使用“引用.”调用
    public void m1(){
        System.out.println("m1方法");
    }

    //静态方法
    //可以使用“类名.”方式调用.也可以用“引用.”,即使用的是“引用.”,底层还是用的“类名.”
    //静态方法中不能直接访问非静态数据.
    //静态方法中不能使用this
    public static void m2(){
        //m1();错误,静态方法中不能访问非静态的方法
        //System.out.println(i);错误,静态方法中不能访问非静态的变量
        System.out.println("m2方法");
    }


    public static void main(String[] args){

        StaticTest02 st = new StaticTest02();
        st.m1();
        m2();


        st.m2();//不建议这样使用
        StaticTest02.m2();//建议这样使用            

        st = null;
        st.m2(); //不会报出空指针异常

    }

}

例3:

public class StaticTest03{

    //静态语句块
    static{
        System.out.println("静态语句块1");
    }

    static{
        System.out.println("静态语句块2");
    }

    static{
        System.out.println("静态语句块3");
    }

    //构造方法
    StaticTest03(){
        System.out.println("构造方法");
    }

    public static void main(String[] args){
        System.out.println("main main方法 1");
        System.out.println("main main方法 2");
        new StaticTest03();
        new StaticTest03();//静态语句块只执行了一次
    }

}

问题:请问下面代码是否可以正常执行?

public class StaticTest04{


    static{
        System.out.println(i);
    }

    static int i = 100;


}

上面代码编译报错,因为静态代码块的执行顺序是自上而下,静态代码块里面打印的变量i还没有声明。

你可能感兴趣的:(static关键字)