Java修饰符详解
Java修饰符用于定义类、方法或者变量,修改其行为的关键字。Java语言主要提供了两类修饰符:
- 访问权限修饰符:
default
,public
,protected
,private
- 非访问权限修饰符:
final
,abstract
,static
,synchronized
,volatile
等
下面分别来详细介绍。
一、访问权限修饰符
Java定义了四种访问权限,分别是:默认(缺省)、公共(public)、保护(protected)和私有(private)。
1、default (缺省)
在同一包内可被访问,超出该包范围就不可访问。
class MyClass { String name; // 缺省的访问权限 }
2、public
被修饰的类、方法、属性可以在任何地方被访问。
public class MyPublicClass { public String name; // 公共的访问权限 }
3、protected
被其修饰的类、方法、属性可以被同一个包内的其他类、该类的子类以及其他包中的子类访问。
public class MyProtectedClass { protected String name; // 保护的访问权限 }
4、private
被其修饰的类、方法、属性只能被自己访问和修改。
public class MyPrivateClass { private String name; // 私有的访问权限 }
二、非访问权限修饰符
1、final
用于修饰类、方法和变量,final修饰的类不能被继承,修饰的方法不能被覆盖,修饰的变量为常量,必须初始化且不能改变。
public final class MyFinalClass { public final void myMethod() { final int num = 10; } }
2、abstract
用于创建抽象类和抽象方法。抽象类不能实例化,抽象方法只有方法名,没有方法体,由子类提供方法实现。
public abstract class MyAbstractClass { public abstract void myMethod(); }
3、static
主要用于修饰类属性和类方法,可直接通过类调用,无需创建类的实例。
public class MyStaticClass { public static int count; public static void myMethod(){} }
4、synchronized
在多线程环境下,用synchronized修饰的方法或者代码块可以保证同一时间只有一个线程实例执行,保证了线程的安全性。
public synchronized void show() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " : " + i); } }
volatile
volatile
修饰符用于修饰变量,主要用于保证多线程操作中变量的可见性,即一个线程修改了某个变量的值,新值对于其他线程来说是可以立即得知的。
public class MyVolatileClass { public volatile int count; }
关键字volatile的内存语义是:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存;当读一个volatile变量时,JMM会把这个线程对应的本地内存中的共享变量置为无效,线程接下来将从主内存中读取共享变量。
在实际编程中,对于多线程,我们还应配合synchronized
关键字,或者java.util.concurrent
包下的类库进行使用。