Java修饰符大全
- 访问修饰符
- 非访问修饰符
访问修饰符
- public:公有访问。对所有类都可见。
- protected:保护型访问,对同一个包可见,对不同的包的子类可见。
- default:默认访问权限。只对同一个包可见,注意对不同的包的子类不可见。
- private:私有访问。只对同一个类可见,其余都不可见。
这里也就注意一下default默认和protected对不同包的子类是否可见。
| 修饰符 | 同类 | 同包 | 子类 | 其它包 |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| default | √ | √ | × | × |
| private | √ | × | × | × |
非权限访问修饰符
static
static关键字可以用来修饰类(静态内部类)、方法(静态方法)、变量(静态变量)和代码块(静态代码块)。
修饰类
修饰方法
- 静态方法可以直接通过类名调用,任何的实例也都可以调用。
new 一个对象的实例同样可以调用这个静态方法。
- 静态方法中不能用this和super关键字。
学过jvm的就知道,静态方法的局部变量表中都没有this,所以不能使用。
this表示这个类的当前实例,super表示父类的当前实例,static修饰的是类的一个级别的,肯定不能用this,和super。
这个原因和jvm具体的类加载内存分配有关,可以看我写的jvm那些,或者百度。
- 不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。
- 修饰变量
- 对于静态变量在内存中只有一个拷贝(节省内存),JVM只分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问,当然也可以通过对象来访问。
这个就像HashSet底层是HashMap的key来存储元素的吗,它的value是一个默认的值,这个PRESENT声明为静态类型,所有的value共用这个变量。不这样做的话也太浪费空间了。
1 private static final Object PRESENT = new Object();
修饰代码块
final
- final修饰类、方法、属性!不能修饰抽象类,因为抽象类一般都是需要被继承的,final修饰后就不能继承了。
- final修饰的方法不能被重写而不是重载!
- final修饰属性,此属性就是一个常量,不能被再次赋值!
- final也不能修饰接口,接口可以只能被public&abstract修饰
- final如果修饰的是基本类型的变量,那么这个变量就表示为一个常数,只能赋值一次,要么在定义时赋值,要么在初始化时赋值;final修饰应用类型的变量是,变量不能再次被赋值意思是变量的地址(引用)不可以被改变,当变量所指向的内容可以被改变。
final关键字不能用来抽象类和接口(这个很重要)
final关键字可以用来修饰类、方法、变量。
- 修饰类(class)。
- 该类不能被继承。
- 类中的方法不会被覆盖,因此默认都是final的。
- 用途:设计类时,如果该类不需要有子类,不必要被扩展,类的实现细节不允许被改变,那么就设计成final类
- 修饰方法(method)
- 该方法可以被继承,但是不能被覆盖。
- 用途:一个类不允许子类覆盖该方法,则用final来修饰
- 好处:可以防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用final方法转入内嵌机制,提高了执行效率。
- 注意:父类中的private成员方法不能被子类覆盖,因此,private方法默认是final型的(可以查看编译后的class文件)
- 修饰变量(variable)
- 用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。
- 特点:可以先声明,不给初值,这种叫做final空白。但是使用前必须被初始化。一旦被赋值,将不能再被改变。
final修饰基本数据类型那基本数据类型的值就不能修改,要是引用数据类型指的是指向这个引用数据类型的地址不能被修改,但是这个引用数据类型中的数据是可以被修改的。
- 修饰参数(arguments)
- 用final修饰参数时,称为最终参数,可以读取该参数,但是不能对其作出修改。
abstract
abstract可以用来修饰类(抽象类),和方法(抽象方法)。
- 修饰类
- 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
抽象类不能实例化!!!!!!!!!!!!!!!!
- 可以被继承。可以被抽象类继承,也可以被非抽象类继承。派生类可以实现抽象方法,并且也必须实现,除非是派生类也是抽象类。
- 抽象类不一定包含抽象方法,但是有抽象方法的类必定是抽象类。抽象类中既可以有抽象方法,也可以有普通方法。
- 构造方法和类方法,不能声明为抽象方法。
- 修饰方法
- 抽象方法只包含一个方法名,而没有方法体。
- 抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
一个非抽象类继承abstract类必须实现其中的抽象方法,那么注意这个final关键字不可能和这个abstract一块使用。
synchronized
用于多线程的同步。
volatile
修饰的成员变量防止指令重排序,保持了这个变量在多线程间的可见性,不保证原子性。
synchronized保证了多线程的顺序,可见和原子性。volatile不保证原子性。这里只是十分简单的说了一下这两个关键字。
这两个关键字的区别和具体在多线程中说明。太多了。。
transient
transient只能用来修饰变量。
- 修饰变量
一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
成员变量(实例变量,属性)
局部变量(本地变量)
类变量(静态属性)
- 被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
静态变量属于类级别,不能被序列化。具体可以百度。
native
本地修饰符,指定此方法的方法体,是由其它语言在程序外部编写的。


