Java 修饰符
到目前为止,你可能对public
关键字已经非常熟悉了,它几乎出现在所有示例中:
public class MyClass
public
关键字是一个访问修饰符,用于设置类、属性、方法和构造函数的访问级别。
Java中,修饰符可以分为两组:
- 访问修饰符 控制访问级别
- 非访问修饰符 不控制访问级别,但提供其他功能
访问修饰符
对于类,可以使用public
或者缺省值(不指定):
修饰符 | 描述 |
---|---|
public |
任何其他类都可以访问该类 |
缺省值(不指定) | 该类只能由同一包中的类访问。当不指定修饰符时,将使用此选项。 |
对于属性、方法和构造函数,可以使用以下修饰符:
修饰符 | 描述 |
---|---|
public |
代码对所有类都是可访问的 |
private |
代码只能在本类中访问 |
缺省值(不指定) | 代码只能在同一个包中访问。当不指定修饰符时,将使用此选项 |
protected |
代码可以在同一个包和子类中访问。 |
非访问修饰符
对于类,可以使用final
或abstract
:
修饰符 | 描述 |
---|---|
final |
该类不能被其他类继承 |
abstract |
该类不能用于创建对象(要访问抽象类,必须使用抽象类的子类)。 |
对于属性和方法,可以使用以下修饰符:
修饰符 | 描述 |
---|---|
final |
不能重写/修改属性和方法 |
static |
属性和方法属于类,而不是对象 |
abstract |
只能在抽象类中使用,并且只能用于方法。抽象方法定义时没有主体,例如 abstract void run(); 抽象方法主体由抽象类的子类实现。 |
transient |
transient修饰的属性和方法,在对象序列化时将跳过 |
synchronized |
方法同时只能由一个线程访问 |
volatile |
属性值不是线程本地缓存的,而是始终从“主内存”中读取。 |
final
如果希望属性值是不可变的,将属性声明为final
:
示例
public class MyClass {
final int x = 10;
final double PI = 3.14;
public static void main(String[] args) {
MyClass myObj = new MyClass();
myObj.x = 50; // 将生成一个错误: 无法为最终变量赋值
myObj.PI = 25; // 将生成一个错误: 无法为最终变量赋值
System.out.println(myObj.x);
}
}
static
不需要创建类的对象,就可以访问静态方法或属性,这与public
不同:
示例
举例说明,静态方法和公共方法的区别:
public class MyClass {
// Static 方法
static void myStaticMethod() {
System.out.println("调用静态方法无需创建对象");
}
// Public 方法
public void myPublicMethod() {
System.out.println("调用公共方法需创建对象");
}
// Main 方法
public static void main(String[ ] args) {
myStaticMethod(); // 调用静态方法
// myPublicMethod(); 这将报错
MyClass myObj = new MyClass(); // 创建MyClass的对象
myObj.myPublicMethod(); // 调用公共方法
}
}
abstract
抽象方法属于抽象类,它没有主体。主体由子类提供:
示例
// 抽象类
abstract class Person {
public String fname = "Kevin";
public int age = 35;
public abstract void study(); // 抽象方法
}
// 子类(从Person继承)
class Student extends Person {
public int graduationYear = 2008;
public void study() { // 这里提供了抽象方法的主体
System.out.println("整天学习");
}
}
// Code from filename: MyClass.java
class MyClass {
public static void main(String[] args) {
// 创建Student类的对象(它继承Person的属性和方法)
Student myObj = new Student();
System.out.println("Name: " + myObj.fname);
System.out.println("Age: " + myObj.age);
System.out.println("Graduation Year: " + myObj.graduationYear);
myObj.study(); // 调用抽象方法
}
}