static关键字

static的作用?

static可以修饰变量,被static修饰的变量叫做静态变量,静态变量在类加载阶段赋值,并且只赋值一次。请看例1

static可以修饰方法,被static修饰的方法叫做静态方法,不用创建对象就能能直接访问该方法,即使用类名.静态方法名的方式。静态方法不能访问非静态的数据,静态方法不能使用this。请看例2

static可以定义静态语句块,静态语句块在类加载阶段执行,并且只执行一次,并且是自上而下的顺序执行,在构造方法之前执行。请看例3

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

比如wifi,多个人可以共同使用同一个wifi,所以wifi可以使用static修饰。手机是每人使用自己的,就不能用static修饰。

例1:

public class StaticTest01 {

    publicstaticvoidmain(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 = "阿里巴巴";

    publicStringgetName(){

        return name;

    }

    publicvoidsetName(String name){

        this.name = name;

    }

}

例2

class StaticTest02{

    //成员变量    int i;

    //成员方法    

//成员方法必须使用“引用.”调用    

    publicvoidm1(){

        System.out.println("m1方法");

    }

    //静态方法    

//可以使用“类名.”方式调用.也可以用“引用.”,即使用的是“引用.”,底层还是用的“类名.”   

 //静态方法中不能直接访问非静态数据.    

//静态方法中不能使用this    publicstaticvoidm2(){

        //m1();错误,静态方法中不能访问非静态的方法        

//System.out.println(i);错误,静态方法中不能访问非静态的变量        

System.out.println("m2方法");

    }

    publicstaticvoidmain(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("构造方法");

    }

    publicstaticvoidmain(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关键字)