Java中static和final关键字用法总结

来源:互联网 发布:sql server存储过程 编辑:程序博客网 时间:2024/05/20 23:34

Static 可以修饰方法、变量、类

1.  静态方法

在一个类中定义一个方法为static,调用该方法的方式“类名.方法名”。

声明为static的方法有几条限制:

  • l  仅能调用其他的static方法
  • l  只能访问static数据。
  • l  不能以任何方式引用this和super
  • l  static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract

2.  静态变量

声明为static的变量实际上是全局变,调用方式“类名.静态变量名”。

  • l  Static变量前可以有 public 、private 、protect等权限修饰符。
  • l  声明类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量(存储在内存中全局区)
  • l   如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次
  • l  被static修饰的变量叫静态变量,不被static修饰的变量叫实例变量。实例变量依赖于具体的类的实例对象。Static变量或者方法独立于实例而存在因此不能用this或super并且优先初始化

 

class Value3 {

    static int c = 0;

 

    Value3() {

       c = 15;

    }

 

    Value3(int i) {

       c = i;

    }

 

    static void inc() {

       c++;

    }

}

 

public class Count {

    public static void prt(String s) {

       System.out.println(s);

    }

 

    Value3 v = new Value3(10);

    static Value3 v1v2;

    static {//此即为static块

       prt("v1.c=" + v1.c + "  v2.c=" + v2.c);

       v1 = new Value3(27);

       prt("v1.c=" + v1.c + "  v2.c=" + v2.c);

       v2 = new Value3(15);

       prt("v1.c=" + v1.c + "  v2.c=" + v2.c);

    }

 

    public static void main(String[] args) {

       Count ct = new Count();

       prt("ct.c=" + ct.v.c);

       prt("v1.c=" + v1.c + "  v2.c=" + v2.c);

       v1.inc();

       prt("v1.c=" + v1.c + "  v2.c=" + v2.c);

       prt("ct.c=" + ct.v.c);

    }

}


  结果为:

v1.c=0     v2.c=0

v1.c=27  v2.c=27

v1.c=15  v2.c=15

ct.c=10

v1.c=10  v2.c=10

v1.c=11  v2.c=11

ct.c=11

这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。

 

3.  静态类

通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。

 

public class StaticCls {

    public static void main(String[] args) {

       OuterCls.InnerCls oi = new OuterCls.InnerCls();

    }

}

 

class OuterCls {

    public static class InnerCls {

       InnerCls() {

           System.out.println("InnerCls");

       }

    }

    结果为:InnerCls



0 0