Static关键字在Java中的具体用法总结

1、static一般用在哪里?

    在Java类中声明属性、方法、代码块和内部类时,可以使用static关键字作为修饰符。

    在被static修饰的属性或者方法由整个类(所有实例)共享,如果访问权限允许,可以不必创建该类的对象,而直接用类名加 “ . ” 来调用。

    被static修饰的属性、方法也称为 “ 静态成员 ” 、 “ 静态方法 ”。

2、static具体使用

  2.1 、static修饰属性

      static修饰的属性由所在的类共享,无论创建多少个该类的对象,甚至不创建人和对象,该属性都将存在,且只存在唯一的一份。

此static属性也称为 “ 类变量 ” 或 “ 静态变量 ” (不受对象的动态创建和销毁影响)。

未被static修饰的类属性称为 “ 实例变量 ”。

    ***static属性的生存周期

      在其所在类加载到JVM内存时被一次性创建初始化的,包括分配内存空间、默认初始化和显式初始化。

      static属性被保存在堆内存中,然后在访问权限允许的前提下,通过该类的任何实例或类名均可访问该属性,直至应用程序运行完毕,JVM关闭时static属性才被销毁。

public class A {
    private  int id;
    public static int res = 0 ;
    public A ( ) {
         res  ++;
         id = res ;
    } 
}

public class Test{
    public static void mian (String args[]) {
          A.res = 100;
          System.out.println(A.res);
          A a1 = new A ( );
          A a2 = new A ( );
          System.out.println(A.res);
    }
}

  程序运行输出结果为:

 100

 102

  2.2、static修饰方法

   和static修饰属性类似,在方法声明时修饰。同样static方法由整个类共有,而不依赖特定的对象。

   也就是说static方法不必使用 “ <对象名>.<方法名>(<实参列表>) ” 的方式调用,而使用  “ <类名>.<方法名>(<实参列表>) ” 直接调用 (当然还需访问控制权限 )。

***使用了类名直接调用static方法后,在其方法体中不能再直接使用其所在类的实例变量,也不允许使用this关键字。

     同样,在static方法中也不允许不创建对象而直接调用所在类的非static方法。

public class A {
    private  int id;
    public static int res = 0 ;
    public A ( ) {
         res  ++;
         id = res ;
    } 
    public int getId( ) {
         return id;
    }
    public static int getResA(){
         return res;//不能改为 id ,否则会出现编译错误
    }
}

public class Test{
    public static void mian (String args[]) {
          System.out.println(A.getResA());
          A a1 = new A ( );
          System.out.println(a1.getResA());//不允许使用this
          System.out.println(A.getResA());
    }
}
程序运行输出结果为:

0

1

1

  2.3、 static静态代码块

    在定义Java类时,可以在类体中、方法的外部包含一个或多个static 标记的语句块,这些语句块仅仅在其所属的类被载入JVM时被执行一次,通常用于一次性初始化(当      然也可以使用非static初始化块来初始化对象)。而且static静态代码块优先于其他非static代码块的初始化。

   在涉及到继承的时候,先初始化父类的static代码块,然后初始化子类的static代码块。

public class A {
    private  int id;
    public static int res = 0 ;
    static {
        res = 100;
        System.out.println("in static block");
    }
}

public class Test{
    public static void mian (String args[]) {
          System.out.println("res="+A.res);
          System.out.println("res="+A.res);
    }
}
程序运行输出结果为:

in static block

res = 100

res = 100

  2.4、static修饰内部类

通常一个普通的类不允许声明为static,只有一个内部类才可以。此声明的静态类可以直接当做普通类使用。


public class StaticA {
    public static void main(String[] args) {
       OuterA.InnerA a = new OuterA.InnerA();
    }
}

class OuterA {
    public static class InnerA {
       InnerA() {
           System.out.println("InnerA");
       }
    }
} 
程序运行输出结果为:

InnerA

3、使用static需要注意:

注意static静态方法中不能出现 this 和 super 关键字;

    不能直接访问所属类的实例变量和实例方法(即不带static的实例和方法);

    static方法独立于任何实例,故static方法必须被实现,而且不能被abstract修饰。

4、static和final一起使用的情况:

static  final 用来修饰成员变量和成员方法,可以理解为是“ 全局常量 ” ;

修饰变量时,一旦给值就不能修改,而且通过类名可以访问;

修饰方法时,则不可被覆盖,可通过类名直接访问。
   





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值