Java 修饰符
修饰符
现在,您已经非常熟悉我们几乎所有示例中出现的public
关键字:
public class MyClass
public
关键字是一个访问修饰符,这意味着它用于设置类、属性、方法和构造函数的访问级别。
我们将修饰符分为两组:
- 访问修饰符 - 控制访问级别
- 非访问修饰符 - 不控制访问级别,但提供其他功能
访问修饰符
对于 classes,可以使用 public
或 default:
修饰符 | 描述 | 试一试 |
---|---|---|
public |
该类可由任何其他类访问 | 试一试 » |
default | 该类只能由同一包中的类访问。在不指定修改器时使用此选项。您将在" Packages"一章中了解有关软件包的更多信息 | 试一试 » |
对于属性、方法和构造函数,可以使用以下选项之一:
修饰符 | 描述 | 试一试 |
---|---|---|
public |
所有类都可以访问该代码 | |
private |
代码只能在声明的类中访问 | 试一试 » |
default | 该类只能由同一包中的类访问。在不指定修改器时使用此选项。您将在" Packages"一章中了解有关软件包的更多信息 | 试一试 » |
protected |
代码可以在相同的包和子类中访问。在 继承一章中,您将了解有关子类和超类的更多信息 | 试一试 » |
非访问修饰符
对于类,可以使用final
或 abstract
:
修饰符 | 描述 | 试一试 |
---|---|---|
final |
该类不能被其他类继承(您将在 继承一章中了解有关继承的更多信息) | 试一试 » |
abstract |
该类不能用于创建对象(要访问抽象类,它必须从另一个类继承。您将在 继承和抽象章节中了解有关继承和抽象的更多信息) |
对于属性和方法,可以使用以下选项之一:
修饰符 | 描述 |
---|---|
final |
无法覆盖/修改属性和方法 |
static |
属性和方法属于类,而不是对象 |
abstract |
只能在抽象类中使用,并且只能在方法上使用。该方法没有主体,例如抽象abstract void run();。主体由子类(继承自)提供。 在继承和抽象章节中,您将了解有关继承和抽象的更多信息 |
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; // 将产生错误:无法为 final 变量赋值
myObj.PI = 25; // 将产生错误:无法为 final 变量赋值
System.out.println(myObj.x);
}
}
Static
static
静态方法意味着可以在不创建类对象的情况下访问它,这与public
不同:
实例
演示static
和 public
方法之间差异的示例:
public class MyClass {
// 静态方法
static void myStaticMethod() {
System.out.println("Static methods can be called without creating objects");
}
// 公共方法
public void myPublicMethod() {
System.out.println("Public methods must be called by creating objects");
}
// Main 方法
public static void main(String[ ] args) {
myStaticMethod(); // 调用静态方法
// myPublicMethod(); 这将输出错误
MyClass myObj = new MyClass(); // 创建一个 MyClass 的对象
myObj.myPublicMethod(); // 调用公共方法
}
}
Abstract
abstract
抽象方法属于abstract
抽象类,它没有主体。主体由子类提供:
实例
// Code from filename: Person.java
// 抽象类
abstract class Person {
public String fname = "John";
public int age = 24;
public abstract void study(); // 抽象方法
}
// 子类(从 Person 继承)
class Student extends Person {
public int graduationYear = 2018;
public void study() { // 此处提供了抽象方法的主体
System.out.println("Studying all day long");
}
}
// End code from filename: Person.java
// 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(); // 调用抽象方法
}
}