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
包下的类库进行使用。