Java —— Advanced Language Features —> static

来源:互联网 发布:win10如何安装mysql 编辑:程序博客网 时间:2024/06/11 17:48

一. static修饰符

static修饰符可以用来修饰类的成员变量、成员方法和代码块

  • 用static修饰的成员变量表示静态变量,可以直接通过类名来访问;
  • 用static修饰的成员方法表示静态方法,可以直接通过类名来访问;
  • 用static修饰的代码块表示静态代码块,当Java虚似机加载类时,就会执行该代码块;
被static所修饰的成员变量和成员方法表明归某个类所有,它不依赖于类的特定实例,被类的所有实例共享。 
  1. static 变量

    成员变量:定义在类里面、方法外面的变量, 分两种:        a. 实例变量;        b. 静态变量;形式和实例变量类似,在实例变量前面加static关键字; 

     static变量和实例变量的区别:

    • static变量对于每个类而言在内存中只有一个,能被类的所有实例所共享; 实例变量对于每个类的每个实例都有一份,它们之间互不影响;

    • Java虚拟机在加载类的过程中为static变量分配内存,实例变量在加载完类后创建对象时分配内存;

    • static变量可以直接通过类名访问,实例变量通过引用类型变量访问;

  2. static 方法 

        成员方法分为静态方法和实例方法。用static修饰的方法叫静态方法,或类方法。

    注意:

    a. static方法不可以直接访问所属类的实例变量和实例方法,直接访问所属类的静态变量和静态方法;

    注:1) 不能使用this关键字;     2) 不能使用super关键字,super关键字用来访问当前实例从父类中继承的方法和属性。      super关键字与类的特定实例相关;                  3) 静态方法必须被实现。      静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。       既然如此,当前类必须为静态方法提供实现。

    b. 父类的静态方法不能被子类覆为非静态方法。
    c. 父类的非静态方法不能被子类覆盖为静态方法; 

  3. static 代码块  

    类中可以包含静态代码块,它不存于任何方法中。在Java虚拟机中加载类时会执行这些静态代码块。如果类中包含多个静态代码块,那么Java虚拟机将按照它们在类中出现的顺序依次执行它们,每个静态代码块只会被执行一次。 

    类的构造方法用于初始化类的实例,而类的静态代码块则可用于初始化类,给类的静态变量赋初始值。静态代码块与静态方法一样,也不能直接访问类的实例变量和实例方法,而必须通过实例的引用来访问它们。 

    new一个对象的时候JVM都做了那些事情: 

    1.之前没有进行类加载    1.类加载,同时初始化类中静态的属性(赋默认值)    2.执行静态代码块2.之前已经进行了类加载    3.分配内存空间,同时初始化非静态的属性(赋默认值)    4.调用父类构造器    5.父类构造器执行完后,如果自己声明属性的同时有显示的赋值,那么进行显示赋值把默认值覆盖    6.执行匿名代码块    7.执行构造器    8.返回内存地址 
  4. 静态导入 

    静态导入也是JDK5.0引入的新特性。 要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。
    使用静态导入可以使被导入类的静态变量和静态方法在当前类中可以直接使用,使用这些静态成员无需再在前面写上他们所属的类名。  

        //例如:        import static java.lang.Math.random;        import static java.lang.Math.PI;;        public class Test {            public static void main(String[] args) {                //之前是需要Math.random()调用的                System.out.println(random());                System.out.println(PI);            }        }
原创粉丝点击