Java static关键字

static 关键字

  static:

    1、static翻译为“静态”

    2、所有static关键字修饰的都是类相关的,类级别的。

    3、所有static修饰的,都是采用“类名.”的方式访问。也可以通过 实例. 访问,不推荐

    4、static修饰的变量:静态变量

    5、static修饰的方法:静态方法

  变量的分类

变量根据声明的位置进行划分:
  在方法体当中声明的变量叫做:局部变量。
  在方法体外声明的变量叫做:成员变量。

成员变量又可以分为:
  实例变量
  静态变量

class VarTest{

    // 以下实例的,都是对象相关的,访问时采用“引用.”的方式访问。需要先new对象。
    // 实例相关的,必须先有对象,才能访问,可能会出现空指针异常。
    // 成员变量中的实例变量
    int i;

    // 实例方法
    public void m2(){
        // 局部变量
        int x = 200;
    }


    // 以下静态的,都是类相关的,访问时采用“类名.”的方式访问。不需要new对象。
    // 不需要对象的参与即可访问。没有空指针异常的发生。
    // 成员变量中的静态变量
    static int k;

    // 静态方法
    public static void m1(){
        // 局部变量
        int m = 100;
    }
    
}

  变量声明:

    什么时候变量声明为实例的,什么时候声明为静态的?   

      如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。

      建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。

      一个对象一份的是实例变量。
      所有对象一份的是静态变量。

      比如 定义一个 Chinese 类, 国籍 就是一样的, 身份证号,姓名 就是不同的

     静态变量在类加载的时候初始化,不需要new对象,存储在方法区

  空指针异常

    空指针异常只有在什么情况下才会发生呢? 

      只有在“空引用”访问“实例”相关的,都会出现空指针异常。 如果空引用访问 静态变量,不会出现空指针异常

  

  方法声明

    关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法

      参考标准:

        当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。    

        我们以后开发中,大部分情况下,如果是工具类的话,工具类当中的方法一般都是静态的。

        (静态方法有一个优点,是不需要new对象,直接采用类名调用,极其方便。工具类就是为了方便,

        所以工具类中的方法一般都是static的。)

  静态代码块

    静态代码块,在类加载的时候执行,并且只执行一次

    一个类中有多个静态代码块

    static {

      java 语句

    }

    注意:静态代码块在类加载时执行,并且在main方法执行之前执行。

    静态代码块一般是按照自上而下的顺序执行。

    静态代码块有啥作用,有什么用?

      第一:静态代码块不是那么常用。(不是每一个类当中都要写的东西。)

      第二:静态代码块这种语法机制实际上是SUN公司给我们java程序员的一个特殊的时刻/。这个时机叫做:类加载时机。

    具体的业务:

      项目经理说了:大家注意了,所有我们编写的程序中,只要是类加载了,请记录一下

      类加载的日志信息(在哪年哪月哪日几时几分几秒,哪个类加载到JVM当中了)。

  

  代码块执行顺序

    静态代码块和静态变量都在类加载的时候执行,时间相同,只能靠代码的顺序来决定谁先谁后。

    static静态代码块在类加载时执行,不能访问实例变量;实例变量在声明对象的时候开辟

    到目前为止,你遇到的所有java程序,有顺序要求的是哪些?

      第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。

      第二:静态代码块1和静态代码块2是有先后顺序的。

      第三:静态代码块和静态变量是有先后顺序的。

      ps.在类体内方法是没有顺序

/*
    栈:方法只要执行,会压栈。(局部变量)
    堆:new出来的对象都在堆中。垃圾回收器主要针对。(实例变量)
    方法区:类的信息,字节码信息,代码片段。(静态变量)

    方法的代码片段放在方法区,但是方法执行过程当中需要的内存在栈中。
*/
public class StaticTest07{
    
    // 静态变量在什么时候初始化?类加载时初始化。
    // 静态变量存储在哪里?方法区
    static int i = 100;

    // 静态代码块什么时候执行?类加载时执行。
    static {
        // 这里可以访问i吗?
        System.out.println("i = " + i);
    }

    // 实例变量
    int k = 111; // k变量是实例变量,在构造方法执行时内存空间才会开辟。

    static {
        //k变量可以访问吗?
        // static静态代码块在类加载时执行,并且只执行一次。
        // 类加载时,k变量空间还没有开辟出来呢。
        //错误: 无法从静态上下文中引用非静态 变量 k
        //System.out.println("k = " + k);

        // 这里可以访问name吗?
        //错误: 非法前向引用
        // 静态代码块和静态变量都在类加载的时候执行,时间相同,只能靠代码的顺序来决定谁先谁后。
        //System.out.println("name = " + name);
    }

    // 静态变量在静态代码块下面。
    static String name = "zhangsan";


    //入口(main方法执行之前实际上执行了很多代码)
    public static void main(String[] args){
        System.out.println("main begin");
        System.out.println("main over");
    }
}

/*
总结:
    到目前为止,你遇到的所有java程序,有顺序要求的是哪些?
        第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。
        第二:静态代码块1和静态代码块2是有先后顺序的。
        第三:静态代码块和静态变量是有先后顺序的。
*/

  实例语句块

实例语句语法
{
  java语句;
  java语句;
  java语句;
}

实例语句块在什么时候执行?

  只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码。
  实际上这也是SUN公司为java程序员准备一个特殊的时机,叫做对象构建时机。

  (可以做提取构造方法的共同点)

posted @ 2020-08-29 23:03  一叶扁舟,乘风破浪  阅读(136)  评论(0编辑  收藏  举报