您的位置:首页 > 编程语言 > Java开发

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

2017-06-10 11:00 337 查看
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 用来修饰成员变量和成员方法,可以理解为是“ 全局常量 ” ;

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

修饰方法时,则不可被覆盖,可通过类名直接访问。
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java static