Java修饰符是最直白的表述

Java修饰符是让Java变得啰嗦的罪魁祸首之一。其他很多语言并没有这么多修饰符,取而代之的是语法规则,比如Python下划线开头的变量是私有变量,Golang小写字母开头的变量是私有变量。但是,正因为Java有着明确的修饰符,所以Java代码看起来是最直白的表述。

修饰符概览

Java修饰符有两大类,它们分别如下:

访问控制修饰符

  • default(什么都不写)
  • private
  • public
  • protected

非访问控制修饰符

  • static
  • final
  • abstract
  • synchronized
  • transient
  • volatile

修饰符通常是放在一行代码最前面的,起到修饰作用,比如:

public class ClassName {
   // ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
   // 方法体
}

访问控制修饰符

访问控制,指的是对Java类、接口、变量、方法的访问权限的控制。我们知道Java每个文件是一个类(Class),每个文件夹是一个包(Package),它们彼此之间能不能相互访问,就是通过修饰符决定的。

访问控制修饰符一览表,从上往下,访问权限越来越小:

image-20210828224707518

default

什么都不写,不使用任何修饰符,默认为包访问权限,即同一个包内都是可以访问的

Java有个很棒的设计:同一个包里面的类不需要import就能直接使用。

示例:

String version = "1.5.1";
boolean processOrder() {
   return true;
}

private

意思就像它的名字一样,私有的,只有当前类的内部才可以访问。private用来保护类的隐私,如果外部类想访问private的变量,那么只能通过public的getter方法暴露出去。需要注意的是,private可以用到变量、方法上,但是不能用到类和接口上(这么做没有意义,类总是要被外部调用的,接口总是要被外部实现的)。

示例:

public class Logger {
   private String format;
   public String getFormat() {
      return this.format;
   }
   public void setFormat(String format) {
      this.format = format;
   }
}

public

公开的,所有都能访问,没有任何限制

示例:

public static void main(String[] arguments) {
   // ...
}

protected

当前类可以访问,子类有可能可以访问。子类有两种情况:

  • 子类与父类在同一个包中:子类可以访问父类的protected。
  • 子类与父类在不同的包中:子类可以访问,非子类内部的子类实例不能访问。

示例:

package test1;


public class Base {
    int defaultInt;
    protected int protectedInt;
}
// 不同的包
package test2;


// 子类
public class Test extends Base {
    public void test(){       
         Test t = new Test();
         //t.defaultInt = 2; 不可见
         t.protectedInt = 3;
    }
}


// 非子类
class TestNotSub{
    public void test(){
          Test t = new Test();
          //t.defaultInt = 2; 不可见
          //t.protectedInt = 3; 不可见
    }
}

需要注意的是,protected可以用到变量、方法上,但是不能用到类(内部类除外)和接口上。

非访问控制修饰符

static

static用来修饰变量和方法。修饰的变量叫做静态变量/类变量,修饰的方法叫做静态方法或/类方法。

静态的含义是,无论实例化多少个对象,静态变量或静态方法只有一份。作为类变量或类方法,static的用法是可以直接通过ClassName.varName访问类变量,或直接通过ClassName.methodName()访问类方法,无需实例化对象。

需要注意的是,静态方法里面不能使用类的非静态变量。

我以Python举例可以更好说明这一点,Python的类方法第一个入参是cls,如果想访问非类变量,那么入参必须是self。

final

  • final修饰变量:通常和static一起用来声明常量,比如static final String TITLE = "Manager";
  • final修饰方法:父类的final方法可以被子类继承,但是不能被重写,防止该方法的内容被篡改。
  • final修饰:final类不能被继承。

abstract

  • abstract修饰:抽象类。
  • abstract修饰方法:抽象方法。

抽象意味着它们只定义了一个形式,没有具体内容,一定会由其他的类或方法进行具体实现。如果类中有抽象方法,那么这个类必须要定义为抽象类,否则会编译报错。

synchronized

用于修饰方法,这个方法同一时间只能被一个线程访问。

transient

修饰变量,用的很少,我也看不懂。

volatile

修饰变量,变量每次被线程访问时,都强制从共享内存中重新读取值,当变量发生变化时,会强制线程将变化值写入共享内存。这样两个线程在任何时候都能看到变量的同一个值。

参考资料:

https://www.runoob.com/java/java-modifier-types.html

https://blog.csdn.net/qq_32635069/article/details/79837059

posted @ 2021-09-03 09:20  测试开发刚哥  阅读(52)  评论(0编辑  收藏  举报