在java编程语言里,修饰符是出现在类的定义、属性、方法、构造器、初始化块等定义时的修饰。修饰符有分为访问修饰符和可选修饰符,他们基本都是关键字,有一个例外,就是访问修饰符除了public/protected/private之外还有一个默认访问修饰符,共4种。而可选修饰符则有abstract/const/default/final/native/static/strictfp/synchronized/transient/volatile。

 

 

修饰符

 

修饰场景

成员方法

构造方法

成员变量

局部变量

abstract(抽象的)

static (静态的)

public(公共的)

protected(受保护的)

private(私有的)

synchronized(同步的)

native(本地的)

transient(暂时的)

volatile(易失的)

final(不要改变的)

无访问修饰符(默认,同包访问)

 -

   

  由上表可以明显地看出各修饰符可出现的位置。

  const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。java中保留了此关键字,但是编者并没有发现它在java中的用法。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

  下面将按位置,对修饰符进行分析:

  1.

  类一般情况下只有public/abstract/final和默认修饰符是被允许的,但是有一个例外,那就是在内部类中,是允许static修饰的。

  public:表示该类可以被任意位置的类访问,默认(不写)表示该类被同包中的其他类访问。

  abstract:表明该类为抽象类,不能被实例化。应注意类为abstract修饰时,不要求其中有抽象abstract方法,而类中有抽象方法时,该类就必须成为抽象类。

  final:表明该类为最终类,不能被继承(扩展)。应注意类为final修饰时,依然可以继承其他类和实现接口。

  static:外部类是不允许static修饰的,但是内部类却允许:class Outter{ static class Inner{} } 此时 可以直接通过外部类的类名产生一个内部类的实例:new Outter.Inner(); 而不需要先产生一个外部类的实例 class Outter{ class Inner{} },

  Outter outter = new Outter();
  outter.new Inner();

  当内部类不是static时,只能通过外部类的实例产生内部类对象。

  2.成员变量

  一个类的成员变量的声明必须在类体中,而不能在方法中,方法中声明的是局部变量。

  访问修饰符可以是4种中的任意一种。

   static:类变量:一个类所拥有的变量,该类型的变量与类的实例对象无关,不管类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量,因此可以通过类本身(类名)或者某个对象来访问类变量。

  final:常量。成员变量定义时一般可以不初始化(给变量赋初值),但是final修饰成员变量时,必须在定义时就初始化,如: final int age = 20;这里的“=20”不能不写,否则编译就会报错。

  volatile:声明一个可能同时被并存运行的几个线程所控制和修改的变量。

  transient:声明一个该值不能被序列化的变量(对象被序列化后,该变量仍然存在,值以该类型的默认值来保存,如整型为0,String类型为null,boolean类型为false)。

  3.方法

  访问修饰符可以是4种中的任意一种。

  abstract:抽象方法:只有声明部分,方法体为空,具体在子类中完成。

  static:类方法、静态方法:

    1) 调用时,可以直接使用类名调用,也可以类的某个实例对象名调用

    2)不能被单独对象拥有,属于整个类共享。

    3) 不能处理非static修饰的成员变量。

  final:最终方法,不能被子类重写的方法。

  native:本地方法,表示用其他语言书写的特殊方法,包括C,C++,FORTRAN,汇编语言等。

  synchronized:多线程调用时同步,当此方法被调用时,其他线程不能够调用该方法,直到该方法返回,用于避免在多线程操作时,数据的结果出现不一致。

  4.局部变量

  只能有final修饰,不能够有访问修饰符修饰。

  5.接口

  接口的访问修饰符只能有public/默认不写(同包) 两种,其可选修饰符只能为abstract(abstract也可以不写,接口默认即为抽象)。

  接口中的变量只能为 public static final 联合修饰的公共静态常量(这三个修饰符可以不写,接口中变量为默认有这三个修饰符,此外 final 类型的变量必须 在定义时初始化(赋初值),这点在上文的【变量】中已经说过 )

  接口中的方法访问修饰符只能为public,一般情况下可选修饰符为abstract,即接口中的方法为默认抽象方法,不能有方法体。

  此外,还可以有strictfp/static/default修饰(其中static和default只能二者选其一,strictfp必须与static和default中的一个配合使用)

  static:静态方法 必须有方法体。

  default:修饰的方法 必须有方法体。

  strictfp:strict floatpoint 精确浮点 

  注意:类与接口的关系为多实现,当类实现的多个中有同名、同参、同返回类型的 抽象方法或者default方法时(包括两个都为抽象、两个都为default 和 一个为抽象一个为default ),实现类必须重写该方法。

  而接口中的方法为静态(static)方法时,可以直接用接口名调用该方法,与实现类无关。实现类可以有与之相同的静态或非静态方法。

6.构造方法

  构造方法前不能有返回类型,但是有一个例外:可以有一个void返回类型,一般默认不写,但是写上这个void(无返回值)修饰也不会有错。