static关键字总结

参考博客:【https://www.cnblogs.com/xrq730/p/4820992.html】

一、static关键字的基本用法:

  1、static修饰变量,static修饰的变量不依赖类的初始化,在类的class文件加载的时候就已经加载了,可以直接用类名.变量名获取,不需要创建对象(注:接口中定义的变量会被默认为static变量)

  2、static修饰方法,static修饰的方法与变量一样,也不依赖类的初始化,可以直接用类名.变量名获取。

  3、静态代码块,静态代码块只会在类加载的时候执行,而且有且只执行一次。

  注:在Java中被static修饰的变量或者方法又被称之为静态变量或静态方法,而被static修饰的方法或方法不属于指定的类,他被所有的类所共享

  通过上面我们可以看出,static的基本用法中我们都在反复提到了(不依赖类的初始化也就是new关键字),而在Java中我们通常初始化一个类会用到new关键字,当一个类被实例化后,jvm会在内存中划分出一块区域专门存储内的一些信息(变量、方法等),而非static修饰的变量或方法,在这时候才会被加载如内存中,下面一个最简单的实例:

    

  这是一个非常简的测试,图中分别定义了一个静态方法/普通方法、静态变量/普通变量,我们直接用main执行可以清楚的看到,在编译的时候就出错了,而出现这种情况的原因就是,上面所说的,Java中非静态资源必须依赖于类的创建,而main方法时一个静态方法,则不需要依赖类的创建,在class文件加载的时候就已经加载进了内存中,反而我们的非静态资源由于没有创建对象将相关类的信息存储加载金内存中,所以在编译的时候方然无法通过,在这里稍微改动一下如下就可以正常编译:

    

  由上面的列子我们可以思考一下很容易得出面:  

    1、静态资源无法引用非静态资源(注:非静态资源在new的时候才会加载,静态资源压根就不知道你丫是谁

    2、静态资源可以引用静态资源(注:咱两(都是静态资源)都是在类被加载的时候加载的,一起进来的当然眼熟

    3、非静态资源可以引用静态资源(注:明明是我(静态资源class文件加载时加载)先来的,你丫(非静态资源new时加载)敢不认得我

二、静态代码块:

   1、静态代码块最常见的使用:在类初始化的时候做一些初始化的操作

    

   打印结果:

    

   2、静态需要注意的细节:

      2.1、静态代码块的加载顺序是依据静态资源定义的顺序来的:  

        

      打印结果:

        

      2.2、静态代码块无法访问,定义在它之后的静态变量,静态资源则可以正产静态方法:

        

      2.3 存在继承关系,静态资源的访问顺序:父类代码块优先于子类访问

        

        

      打印结果:

        

三、static修饰类

  如下我们创建一个测试类,里面有一个静态内部类和一个普通类进行测试,可以由编译清楚地看到:

  1、静态内部类中可以由非静态或静态方法:

  2、静态内部类无法访问外部的静态资源:

    

  3、访问静态内部类的静态方法,可以直接"."出来不需要一个类实例;要访问静态内部类的非静态方法,必须拿到一个静态内部类的实例对象

    

    

  4、注意一下实例化成员内部类和实例化静态内部类这两种不同的内部类时写法上的差别

    (1)成员内部类:外部类.内部类 XXX = 外部类.new 内部类();

    (2)静态内部类:外部类.内部类 XXX = new 外部类.内部类();

       

四、静态导包

  静态导包我们在实际中很少用到,在这里提一下,我个人不太倾向静态导包,虽然说是节省代码,但也给其他不熟悉这方面的开发人员无疑增加了阅读负担。

    

 

posted @ 2019-03-18 15:08  は問わない  阅读(138)  评论(0编辑  收藏  举报