Java基础-修饰符

来源:互联网 发布:大数据的实践包括哪些 编辑:程序博客网 时间:2024/06/08 15:18

    • 一 修饰符是什么
    • 二 修饰符分类
      • 1 访问修饰符
      • 2 非访问修饰符
    • 三 修饰符的使用
      • 1 使用范围
      • 2 顺序
    • 四 参考链接


  • 2017年10月23日
    初次整理修饰符内容

一、 修饰符是什么

修饰符用来修饰类、方法或者变量。可以使用访问修饰符来保护对类、变量、方法和构造方法的访问,也可以使用其他非访问修饰符来实现一些其他功能。

二、 修饰符分类

2.1 访问修饰符

访问修饰符用于确定其他类是否可以使用特定字段或调用特定方法。

  • public:表示任何类均可访问。
  • default:缺省,即什么都不写。表示在同一个包的类均可访问。
  • protected:表示同一个包的类均可访问,其他包中该类的子类也可以访问。
  • private:表示直有该类自己可以访问。
修饰符 类 包 子类 外部 public Y Y Y Y protected Y Y Y N default Y Y N N private Y N N N

2.2 非访问修饰符

非访问修饰符用于实现一些特定的功能。
以下是非访问修饰符的一些简要介绍,*表示较少使用。

  • static

    • 静态变量
      static用来修饰一个类变量时,该类变量被称为静态变量。静态变量表示无论一个类实例化多少对象,它的静态变量只有一份拷贝。另外局部变量不能够被static修饰。

      public class StaticTest1 {    public static int DEFAULT_VALUE = 1;    public static void main(String[] args) {        //[out]: 1        System.out.println(StaticTest1.DEFAULT_VALUE);        //[error]: modifier 'static' not allowed here        //static int i = 1;    }}
    • 静态方法
      static用来修饰一个类方法时,该类方法被称为静态方法。静态方法表示该方法属于声明它的类。

      public class StaticTest2 {    public static String staticMethodName() {        return "static method";    }    public static void main(String[] args) {        //[out]: static method        System.out.println(StaticTest2.staticMethodName());        StaticTest2 s = new StaticTest2();        //[out]: static method        //[hint]: static member accessed via instance reference        System.out.println(s.staticMethodName());    }}
  • final

    • final变量
      final 变量能被显式地初始化并且只能初始化一次。被声明为 final 的对象的引用不能指向不同的对象。但是 final 对象里的数据可以被改变。也就是说 final 对象的引用不能改变,但是里面的值可以改变。

      public class FinalTest1 {    public static void main(String[] args) {        final int i = 1;        //[error]: cannot assign a value to final variable 'i'        //i = 2;    }}
    • final方法
      final方法可以被子类继承,但是不能被子类修改。

    • final类
      final类不能够被继承。
  • abstract

    • 抽象方法
      抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。

      public abstract class AbstractTest1 {    public void nonAbstractMethod() {}    public abstract void abstractMethod();}
    • 抽象类
      抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。另外抽象类中允许存在非抽象的方法。

  • synchronized
    • synchronized声明的方法同一时间只能被一个线程访问。也就是说如果某一个任务处于对一个synchronized方法的调用中,那么在这个线程从该方法返回前,其他所有调用该类中任何标记为synchronized方法的线程都会被阻塞。
  • volatile
    • volatile确保了应用中的可视性,如果一个域被声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改。
      但是值得注意的是,使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变域。所以第一选择应该是synchronized,这是最安全的方式。
  • transient*
    • 序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
      简而言之就是被transient修饰的实例变量,不会被序列化与反序列化。
  • native*
    • native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。
  • strictfp*
    • strictfp代表FP-strict,表明精确浮点数。
      使用了strictfp来声明一个 类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确, 而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。

三、 修饰符的使用

3.1 使用范围

- public protected private static final abstract synchronized volatile transient native strictfp 类 Y Y Y Y Y Y Y 接口 Y Y Y Y Y 构造方法 Y Y Y 其他方法 Y Y Y Y Y Y Y Y Y field Y Y Y Y Y Y Y 参数 Y

注:
1. 对类使用static的情况仅在内部类中出现。
2. 对接口使用abstract并没有什么实际意义,因为接口中的方法默认为public abstract的。

3.2 顺序

修饰符的顺序并没有强制要求,但是有一定的习惯顺序,形成了现在的规范。
在google的习惯用法中有如下顺序:

public / protected / private
abstract
static
final
transient*
volatile
synchronized
native*
strictfp*

四、 参考链接

  1. JavaTree
    http://javatree.cn/chapter/e4f0c1e42cab4801898a39f15c034b8e?roadmapId=b316fff599244da3864913bb064f90b5
  2. 《Google Java Style Guide》
    https://google.github.io/styleguide/javaguide.html#s4.8.7-modifiers