JAVA static的作用

来源:互联网 发布:arm 模拟器 windows 编辑:程序博客网 时间:2024/05/11 04:47

(静态)类方法只能调用类(静态)变量,不能对非类(静态)成员变量调用,非静态方法即可以调用非类成员变量,也可以调用类变量
不可以在非静态方法中定义静态变量 
局部变量不能用静态修饰



1、静态变量:被static修饰的变量

     静态变量和实例变量的区别:

     1>静态变量在内存中占用一份备份,运行时JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存空间分配。可以直接通过类名访问静态变量。

     2>实例变量:每创建一个实例,就会为实例变量分配一次内存。实例变量可以在内存中有多份备份,互不影响。

 

2、静态方法:被static修饰的方法

     访问静态方法不需要创建类的实例,可以通过类名来访问。若已经创建了对象,也可以通过对象引用来访问。

      在使用静态方法时,注意一下几点:

     1>在静态方法里只能直接访问类中的其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为对于非静态的方法和变量,需要先创建类的实例后才可使用。

     2>静态方法不能以任何方式引用this和super关键字。因为静态方法在使用前是不需要创建任何对象的,当静态方法被调用时,this所引用的对象根本就没有产生。

     3>子类只能继承、重载、隐藏父类的静态方法,子类不能重写父类的静态方法,也不能把父类不是静态的方法重写成静态方法。

 

3、main()方法

   如果一个类要被Java解释器直接装载运行,这个类中必须有main()方法,由于JVM需要调用类的main()方法,所以该方法的访问权限必须是public,又因为JVM在执行main()方法是不必创建对象,所以该方法必须是static()的,该方法接收一个String类型的数组参数,该数组中保存从命令行给main()方法传递的参数,main()方法执行结束后不返回任何类型,所以该方法的返回类型是void,因此main()方法的修饰符是public  static void的。正因为main()是静态的,所以在main()方法中不能直接访问实例变量和实例方法。

 

4、静态代码块

   类中可以包括静态代码块,它不存在于任何方法体中。在JVM加载类时会执行这些静态代码块。如果类中有多个静态代码块,那么JVM将按照它们在类中出现的顺序依次执行它们,没个静态代码块只会被执行一次。  JVM先执行静态代码块后,才能调用构造方法。

   static型成员变量与static代码块是按照它们在类中定义的先后顺序依次执行的。

 

5、单态设计模式(Singleton)

    所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。  

     Singlton模式主要作用是保证在java应用程序中,一个类class只有一个实例存在。

     在很多操作中,比如建立目录、数据库连接都需要这样的单线程操作。还有,Singleton能够被状态化;这样,多个单态类在一起就可以作为一个状态库一样想外提供服务。

 

6、内部类

     嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。 

n在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。
    如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,非static的内部类中的成员是不能声明static的。static的内部类不能再使用外层封装类的static的成员变量,这个道理不难想象!所以static嵌套类很少使用。
       如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。
public class Outer
{
 private int size;
 public class Inner
{
     private int size;
     public void doStuff( int size)
{
      size++; // 引用的是doStuff函数的形参
    this.size++; //引用的是Inner类中的成员变量
    Outer.this.size++; // 引用的Outer类中的成员变量
  }
}
}

原创粉丝点击