Java 修饰符

  • 修饰符

    到目前为止,您已经非常熟悉public了,几乎所有示例中出现的关键字:
    public class MyClass
    public关键字是一个访问修饰符,这意味着它是用于设置类,属性,方法和构造的访问级别。我们将修饰符分为两组:
    • 访问修饰符 - 控制访问级别
    • 非访问修饰符 - 不控制访问级别,但提供其他功能
  • 访问修饰符

    对于类,可以使用public或默认:
    修饰符 描述 尝试
    public 类可以被任何其他类访问 尝试一下
    默认 类只能由同一包中的类访问。 当您不指定修饰符时使用。 您将在“软件包”一章中了解有关软件包的更多信息。 尝试一下
    对于属性方法构造函数,可以使用以下之一:
    修饰符 描述 尝试
    public 代码可用于所有类 尝试一下
    private 代码只能在声明的类中访问 尝试一下
    默认 代码只能在同一程序包中访问。 当您不指定修饰符时使用。 您将在“软件包”一章中了解有关软件包的更多信息。 尝试一下
    protected 代码可在相同的包和子类中访问。 您将在继承一章中了解有关子类和超类的更多信息。 尝试一下
  • 非访问修饰符

    对于类,您可以使用finalabstract
    修饰符 描述 尝试
    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(); // 调用实现的抽象方法
      }
    }
    尝试一下