一、访问控制修饰符

  Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限。

  访问控制分4种级别:

  public:公开级别,对外公开。

  ptotected:受保护级别,向子类及同一个包中的类公开。

  默认级别:没用访问控制修饰符,向同一个包中的类公开。

  private:私有级别,只有类本身可以访问,不对外公开。

  

  成员变量、成员方法和构造方法可以处于4个访问级别中的一个:公开、受保护、默认或私有。顶层类只可以处于公开或默认访问级别,因此顶层类不能用private和protected来修饰。

二、abstract修饰符

abstract修饰符可用来修饰类和成员方法。

  (1)用abstract修饰的类表示抽象类,抽象类不能被实例化。

  (2)用abstact修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。

1 public atstract class Base{        //Base是抽象类
2       abstract void method1();      //抽象方法
3       void method2(){                    //具体方法
4               System.out.println("method2");
5 }  
6 }

  使用abstract修饰符需要遵守以下语法规则。

  (1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。

  (2)abstract 和static修饰符不能连用。

  (3)抽象类及抽象方法不能被final修饰符修饰。

 

  抽象类的一个重要特征是不允许实例化。

三、final修饰符

  final具有“不可改变的”含义,它可以修饰非抽象类、非抽象成员方法和变量。

  (1)用final修饰的类不能被继承,没有子类。

  (2)用final修饰的方法不能被子类的方法覆盖。

  (3)用final修饰的变量表示常量,只能被赋一次值。

final变量

  用final修饰的变量表示取值不会改变的常量。fianl变量具有以下特征:

  (1)final修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量、实例常量和局部常量。

  (2)final变量必须显示初始化。

  (3)final变量只能赋一次值。

  (4)如果将引用类型的变量用final修饰,那么该变量只能始终应用一个对象,但可以改变对象的内容。

四、static修饰符

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

  (1)用static修饰的成员变量表示静态变量,可以直接通过类名来访问。

  (2)用static修饰的成员方法表示静态方法,可以直接通过类名来访问。

  (3)用static修饰的程序代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块

static变量

  类的成员变量有两种:一种是被static修饰的变量,叫类变量或静态变量;另一种是没有被static修饰的变量,叫实例变量。

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

  (1)静态变量在内存中只有一个拷贝,运行时Java虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。可以直接通过类名访问静态变量。

  (2)对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以再内存中有多个拷贝,互不影响。

  static变量的作用:

  (1)能被类的所有实例共享,可作为实例之间进行交流的共享数据。

  (2)如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间。

static方法

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

  1.静态方法可访问的内容

  静态方法不需要通过它所属的类的任何实例就会被调用,因此,在静态方法中不能使用this关键字,也不能直接访问所属类的实例变量和实例方法,可以直接访问所属类的静态变量和静态方法。

  2.实例方法可访问的内容

  如果一个方法没有用tatic修饰,那么它就是实例方法。在实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法。

static代码块

  类中可以包含静态代码块,它不存在于任何方法体中。在Java虚拟机加载类时会执行这些静态代码块。每个静态代码块只会被执行一次。

1 public class Sample {
 2     static int i = 5;
 3     static{
 4         System.out.println("First Static code i = "+ i++);
 5     }
 6     static{
 7         System.out.println("second static code i = "+ i++);
 8     }
 9     public static void main(String args[]){
10         Sample s1 = new Sample();
11         Sample s2 = new Sample();
12         System.out.println("At last,i = "+ i);
13     }
14 }

结果

First Static code i = 5
second static code i = 6
At last,i = 7

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

  作为普通遵守的编程规范,通常把访问控制修饰符放在首位,其次是static或abstract修饰符,接着是其他修饰符。