Java 非访问修饰符
非访问修饰符
非访问修饰符不控制可见性(例如 public 或 private),而是为类、方法和属性添加其他特性。
最常用的非访问修饰符是 final、static 和 abstract。
Final
如果您不希望能够覆盖现有属性值,请将属性声明为 final:
示例
public class Main {
final int x = 10;
final double PI = 3.14;
public static void main(String[] args) {
Main myObj = new Main();
myObj.x = 50; // 会产生错误:无法为 final 变量赋值
myObj.PI = 25; // 会产生错误:无法为 final 变量赋值
System.out.println(myObj.x);
}
}
Static
static 方法意味着无需创建类的对象即可访问它,这与 public 方法不同:
示例
以下示例演示了 static 方法和 public 方法之间的区别:
public class Main {
// Static 方法
static void myStaticMethod() {
System.out.println("Static methods can be called without creating objects");
}
// Public 方法
public void myPublicMethod() {
System.out.println("Public methods must be called by creating objects");
}
// Main 方法
public static void main(String[ ] args) {
myStaticMethod(); // 调用静态方法
// myPublicMethod(); This would output an error
Main myObj = new Main(); // 创建一个 Main 对象
myObj.myPublicMethod(); // 调用公共方法
}
}
Abstract
一个 abstract 方法属于一个 abstract 类,它没有方法体。方法体由子类提供:
// abstract class
abstract class Main {
public String fname = "John";
public int age = 24;
public abstract void study(); // 抽象方法
}
// 子类(继承自 Main)
class Student extends Main {
public int graduationYear = 2018;
public void study() { // 抽象方法的主体部分如下所示。
System.out.println("Studying all day long");
}
}
// 文件名中的代码:Second.java
class Second {
public static void main(String[] args) {
// 创建一个 Student 类的对象(该类继承了 Main 类的属性和方法)。
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(); // 调用抽象方法
}
}
非访问修饰符列表
对于类,您可以使用final或abstract:
| 修饰符 | 描述 | 试一试 |
|---|---|---|
final |
该类不能被其他类继承(您将在继承章节中了解更多关于继承的内容) | 试一试 » |
abstract |
该类不能用于创建对象(要访问抽象类,必须从另一个类继承。您将在继承和抽象章节中了解更多关于继承和抽象的内容。 | 试一试 » |
对于属性和方法,您可以使用以下方式之一:
| 修饰符 | 描述 |
|---|---|
final |
属性和方法不能被重写/修改 |
static |
属性和方法属于类,而不是对象。这意味着所有对象都共享相同的static属性,并且无需创建对象即可调用static方法。 |
abstract |
只能在抽象类中使用,且只能用于方法。该方法没有方法体,例如abstract void run();。方法体由子类(继承自的类)提供。您将在继承和抽象章节中了解更多关于继承和抽象的内容。 |
transient |
序列化包含属性和方法的对象时,会跳过这些属性和方法。 |
synchronized |
方法一次只能由一个线程访问。 | volatile |
属性的值不会在线程本地缓存,而是始终从"主内存"读取。 |

