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),它们彼此之间能不能相互访问,就是通过修饰符决定的。
访问控制修饰符一览表,从上往下,访问权限越来越小:
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
修饰变量,变量每次被线程访问时,都强制从共享内存中重新读取值,当变量发生变化时,会强制线程将变化值写入共享内存。这样两个线程在任何时候都能看到变量的同一个值。
参考资料:
所有文章公众号【测试开发刚哥】首发!
版权申明:本文为博主原创文章,转载请保留原文链接及作者。