Java中的修饰符

  在java中,修饰符分为访问权限修饰符和非访问权限修饰符。可以被修饰符修饰的java语言元素有类,变量,方法和接口。下面分别描述在这四个元素上使用修饰符的作用。

  java中声明类的格式为:

访问修饰符 修饰符 class 类名 extends 父类名称 implements 接口名称{}

  其中访问修饰符和修饰符可以互换位置,可以应用于类的访问修饰符为public和package,public表明类可以被任何类使用。package表示包访问权限,它是默认的访问权限,可以省略这个修饰符,使用package修饰符表示类可以被同一个包中的所有类访问。另外,一旦在类的声明中使用了public修饰符,那么源文件名必须与public类的类名相同。一个java源文件中只能有一个public类。

  可以使用于类的非访问控制修饰符为final和abstract。final表明类不可以被继承(当类的构造器方法为被private修饰时,类也不能被继承。因为在子类实例化的时候会调用父类的构造器,即使没有显示调用super(),编译器也会默认使用super()来调用父类的构造器,如果父类的构造器方法被设置为private,则它不能被子类所访问,因此子类无法实例化。另外,如果子类实例化时是编译器默认调用的super,则会调用无参数构造器,如果父类没有无参构造器,那么会报错)。abstract表明类是一个抽象类,抽象类无法被实例化,它是作为被继承的基类来使用的。另外类中只要有函数被abstract修饰,这个类必须被声明为抽象类。

变量

  java中没有全局变量,只有方法变量(局部变量),实例变量(类中的非静态变量)和类变量(类中的静态变量)。其中方法变量不能被修饰符修饰,因此这里讨论的变量都是类中定义的变量。在类实例化时,类中的变量如果没有被初始化,就会被默认初始化为null(引用类型),0和false(基本类型)。局部变量不会被初始化,需要手动初始化,如果不初始化则不允许使用变量,如果使用没有初始化的局部变量编译器会报错。另外,也可以使用初始化器来初始化类中的变量,分为静态变量初始化器和实例变量初始化器,分别使用static{}和{}定义。静态变量初始化器只会被使用一次,就是在类的第一个实例构造时使用。另外初始化器先于构造器执行,静态初始化器运行的话会先于实例变量初始化器执行。下面讨论可以用于变量的修饰符。

  首先来看访问控制修饰符,包括public,private,protected,以及默认控制修饰符。public表示可以被所有类访问,private表示只能在类中被访问,protected表示可以被同一个包中的类访问,或者可以被不同包中的子类访问,默认访问权限表示只能被同一个包中的类访问,即使是不同包中的子类也不可以访问。

  可以修饰变量的非访问修饰符有四种,分别是final,static,volatile和transient。其中final表示常量,被final修饰的变量变为常量,值只能被分配一次,然后就不能改变。final变量可以在定义时就初始化,也可以在构造函数或者初始化器中分配值,一旦对象构造结束,final变量的值就不能再改变。(另外,静态变量只能在静态初始化器中初始化。)static表示变量是类变量,类变量不属于任意一个类实例,它是类的变量,所有同一个类的实例共享一个static变量。transient告诉编译器在类序列化时不需要将这个变量持久保存,因为这个变量的值可以使用其他的值获得。Volatile指出可能有多个线程修改此变量,因此需要编译器优化以保证对此变量的修改能够被正确处理。

方法

  方法的定义形式如下所示:

访问修饰符 修饰符 返回类型 方法名称 (参数列表) throws 违例列表

  java中的方法与变量类似,也没有全局方法,java中的方法都是在类或者接口中定义或者声明的。另外类中的构造器方法比较特别,它不能使用普通修饰符修饰(可以使用访问修饰符),没有返回类型,同时不能有throw子句,而且必须与类名相同。当构造器方法被调用时,它的父类的构造器先被调用,然后运行静态变量和实例变量的初始化器,最后构造器方法才被执行。如果显示调用了父类构造器,那么super应该是构造器的第一条语句。

  修饰方法的访问修饰符与修饰变量的访问修饰符含义基本相同,可以看下表:

访问修饰符

名称

说明

备注

public

可以从所有类访问

 

protected

可以被同一包中的所有类访问

可以被所有子类访问

子类没有在同一包中也可以访问

private

只能够被当前类的方法访问

 

缺省

无访问修饰符

可以被同一包中的所有类访问

如果子类没有在同一个包中,也不能访问

       可以看到,这些规定与修饰变量的访问修饰符功能上并没有什么区别。

       修饰方法的非访问修饰符有5种,分别是final,static,abstract,native和synchronized。final描述一个方法不能被覆写,即override,子类可以继承父类的final方法,但是不能覆写这个方法。另外,在一定情况下,编译器有可能将使用final修饰的方法作为内联(inline)函数处理。即在调用这个方法时不使用普通的函数调用机制,即出栈压栈等传统的调用函数的方法。而是将函数的主体插入调用处。这样做可以省掉函数调用的开销,但是可能造成代码膨胀等问题,因此是否将其作为内联函数处理需要编译器的判断。static表明修饰的方法是静态方法,不是实例方法。类的实例方法可以调用静态方法和静态变量,但是静态方法不能调用非静态方法和实例变量,因为静态方法是所有实例共享的方法,使用静态方法调用非静态方法无法确定是对哪个实例进行的处理。abstract表明方法是抽象方法,只声明而不定义方法。拥有抽象方法的类必须是抽象类。native修饰的方法不在类中进行定义,而且一般都是由c/c++来实现的。(JNI机制。)synchronized表示对于多线程的支持,当一个方法被其修饰时,如果这个方法在一个线程中被调用,它就不能在其他线程中被调用,直到这个方法返回。

接口

接口的定义形式如下:

访问修饰符 interface 接口名称 extends 接口列表

   接口不能定义其声明的方法的任何实现,接口中的变量总是需要定义为public static final,即时不这么声明默认也是这样。接口的访问修饰符有pulic和默认访问修饰符,就是包修饰符。

posted @ 2016-03-10 20:00  libs5510  阅读(264)  评论(0编辑  收藏  举报