java修饰符

Java修饰符

主要分为以下两类:

  1. 访问修饰符
  2. 非访问修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端

1
2
3
4
5
6
7
8
9
public class className {
// ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// 方法体
}

访问控制修饰符

默认访问修饰符-不使用任何关键字

使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为public static final,而接口里的方法默认情况下访问权限为public。

1
2
3
4
String version = "1.5.1";
boolean processOrder() {
return true;
}

私有访问修饰符-private

私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private。

声明为私有访问类型的变量只能通过类中公共的getter方法被外部类访问。

Private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。

1
2
3
4
5
6
7
8
9
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}

公有访问修饰符-public

被声明为public的类、方法、构造方法和接口能够被任何其他类访问。

如果几个相互访问的public类分布在不同的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。

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

受保护的访问修饰符-protected

被声明为protected的变量、方法和构造器能被同一个包中的任何其他类访问,也能够被不同包中的子类访问。

Protected访问修饰符不能修饰类和接口,方法和成员变量能够声明为protected,但是接口的成员变量和成员方法不能声明为protected。

子类能访问Protected修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。

下面的父类使用了protected访问修饰符,子类重载了父类的openSpeaker()方法

1
2
3
4
5
6
7
8
9
10
11
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 实现细节
}
}

class StreamingAudioPlayer {
boolean openSpeaker(Speaker sp) {
// 实现细节
}
}

如果把openSpeaker()方法声明为private,那么除了AudioPlayer之外的类将不能访问该方法。如果把openSpeaker()声明为public,那么所有的类都能够访问该方法。如果我们只想让该方法对其所在类的子类可见,则将该方法声明为protected。

访问控制和继承

请注意以下方法继承的规则:

  1. 父类中声明为public的方法在子类中也必须为public。
  2. 父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。
  3. 父类中声明为private的方法,不能够被继承。

    非访问修饰符

static : 用来创建类方法和类变量。

final : 用来修饰类、方法和变量,final修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

abstract : 用来创建抽象类和抽象方法。

synchronizedvolatile : 主要用于线程的编程。

static修饰符

  1. 静态变量 : 也被称为类变量。用来声明独立于对象的静态变量,局部变量不能被声明为static变量
  2. 静态方法 : 来声明独立于对象的静态方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class InstanceCounter {
    private static int numInstances = 0;
    protected static int getCount() {
    return numInstances;
    }

    private static void addInstance() {
    numInstances++;
    }

    InstanceCounter() {
    InstanceCounter.addInstance();
    }

    public static void main(String[] arguments) {
    System.out.println("Starting with " + InstanceCounter.getCount() + " instances");
    for (int i = 0; i < 500; ++i){
    new InstanceCounter();
    }
    System.out.println("Created " + InstanceCounter.getCount() + " instances");
    }
    }

final修饰符

final变量:

1
2
3
4
5
6
7
8
9
10
public class Test{
final int value = 10;
// 下面是声明常量的实例
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";

public void changeValue(){
value = 12; //将输出一个错误
}
}

final方法:
类中的Final方法可以被子类继承,但是不能被子类修改。

声明final方法的主要目的是防止该方法的内容被修改

1
2
3
4
5
public class Test{
public final void changeName(){
// 方法体
}
}

final类: 不能被继承

1
2
3
public final class Test {
// 类体
}