JAVA修饰符详解
-
JAVA修饰符都包括哪些
访问范围修饰符:public、protected、default(默认)、private
静态修饰符 :static
最终修饰符 :final
抽象修饰符 :abstract
其他:transient:即告诉编译器,在该类的对象进行序列化的时候,这个变量不需要持久保存。这么做的主要原因是这个变量可以通过其它的变量来获取,使用它主要是从性能的角度考虑。
volatile:指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确地处理。
native:用该修饰符修饰的方法在类中并没有实现,大多数情况下这类方法的实现是由C或C++编写的。可以参见Sun的Java Native接口(JNI),JNI提供了运行时加载一个native方法的实现,并将其与一个Java类关联。
synchronized:多线程支持,当一个线程调用该方法时,就会为这个对象加一个锁,从而其它线程就不可以再次调用这个方法,直到前一个线程将其释放
-
修饰符分类
修饰符可以按好几种维度来做分类。比如:类修饰符、方法修饰符、变量修饰符。
1、类修饰符
public:控制类的访问权限。任何地方都可以访问该类。
default:控制类的访问权限。只有同包可以引用。
abstract: 抽象类。可以与控制修饰符共存。不能被实例化,abstract类可以没有抽象方法,但是有抽象方法时类一定要为抽象类。
final:终极类。不能被继承。
static:作为类修饰符只能用于修饰内部类。没有static的内部类,使用时需要先new一个外部类实例,然后利用这个实例来new内部类的实例。有static的情况下可以直接使用new 外部类.内部类的方式创建实例。
2、变量、方法 修饰符。(只有少量不同,合并来说明)
public:访问控制类修饰符。所有类中均可访问。
protected:访问控制类修饰符。本类、同包、子类可访问。(注:子类中可访问父类的变量,仅限于直接访问,不可以new一个父类的实例,通过实例调用父类的protected属性。)
default:默认访问控制类修饰符。本类、同包可访问。
private:访问控制类修饰符。本类可访问。
abstract: 只可用来修饰方法。修饰方法时,方法没有方法体。
final:修饰方法时,代表本方法不可以被子类重写,但是可以继承。修饰变量时,变量不可以被修改。
static:可以修饰方法和变量。标识方法、变量、是被绑定在类本身的,而不是实例。所以对应的方法和变量可以直接通过类名访问。所以我们就可以理解静态代码块为什么是在类加载的时候执行,而不是实例化的时候执行了。
注:局部变量只可以被final修饰。
最后放一个网上常用的关系图。
访问权限 类 包 子类 其他包
public ∨ ∨ ∨ ∨ (对任何人都是可用的)
protect ∨ ∨ ∨ × (继承的类可以访问以及和private一样的权限)
default ∨ ∨ × × (包访问权限,即在整个包内均可被访问)
private ∨ × × × (除类型创建者和类型的内部方法之外的任何人都不能访问的元素)
注:要弄清楚访问权限,一定要清除访问者,被访问者是谁,如果在A类中通过B类的实例访问B类的父类C的protected方法,这时判断的是A是否与C同包。如果A类访问的是B类的方法b(),而B类的b()方法又调用了B类父类C中的protected方法,此时只要A有权限访问B的b方法即可。