Java 修饰符

Java 修饰符

到目前为止,你可能对public关键字已经非常熟悉了,它几乎出现在所有示例中:

public class MyClass

public关键字是一个访问修饰符,用于设置类、属性、方法和构造函数的访问级别。

Java中,修饰符可以分为两组:

  • 访问修饰符 控制访问级别
  • 非访问修饰符 不控制访问级别,但提供其他功能

访问修饰符

对于类,可以使用public或者缺省值(不指定):

修饰符 描述
public 任何其他类都可以访问该类
缺省值(不指定) 该类只能由同一包中的类访问。当不指定修饰符时,将使用此选项。

对于属性、方法和构造函数,可以使用以下修饰符:

修饰符 描述
public 代码对所有类都是可访问的
private 代码只能在本类中访问
缺省值(不指定) 代码只能在同一个包中访问。当不指定修饰符时,将使用此选项
protected 代码可以在同一个包和子类中访问。

非访问修饰符

对于类,可以使用finalabstract:

修饰符 描述
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(); // 调用抽象方法
  }
}


浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载