Java 修饰符
-
修饰符
到目前为止,您已经非常熟悉public了,几乎所有示例中出现的关键字:public class MyClass
public关键字是一个访问修饰符,这意味着它是用于设置类,属性,方法和构造的访问级别。我们将修饰符分为两组:- 访问修饰符 - 控制访问级别
- 非访问修饰符 - 不控制访问级别,但提供其他功能
-
访问修饰符
对于类,可以使用public或默认:修饰符 描述 尝试 public 类可以被任何其他类访问 尝试一下 默认 类只能由同一包中的类访问。 当您不指定修饰符时使用。 您将在“软件包”一章中了解有关软件包的更多信息。 尝试一下 对于属性,方法和构造函数,可以使用以下之一:修饰符 描述 尝试 public 代码可用于所有类 尝试一下 private 代码只能在声明的类中访问 尝试一下 默认 代码只能在同一程序包中访问。 当您不指定修饰符时使用。 您将在“软件包”一章中了解有关软件包的更多信息。 尝试一下 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 method static void myStaticMethod() { System.out.println("可以在不创建对象的情况下调用static方法"); } // Public method public void myPublicMethod() { System.out.println("public方法必须通过创建对象来调用"); } // Main method public static void main(String[ ] args) { myStaticMethod(); // 调用 static 方法 // myPublicMethod(); 这会产生错误 MyClass myObj = new MyClass(); // 建立一个 MyClass 对象 myObj.myPublicMethod(); // 调用 public 方法 } }
-
abstract
abstract方法属于一个abstract类,并且它不具有主体。主体由子类提供:
尝试一下// 文件名: 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"); } } // Person.java 文件结束 // 文件名: MyClass.java public 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(); // 调用实现的抽象方法 } }