访问性修饰符
# 访问性修饰符
Java 语言提供了很多修饰符,主要分为以下两类:
- 访问修饰符
- 非访问修饰符
修饰符用来修饰类、方法或者变量的访问权限或特性,通常放在语句的最前端。
举例:
public class className {
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// 方法体
}
}
2
3
4
5
6
7
8
# 访问修饰符介绍
访问控制修饰符,也叫可见性修饰符。
可见性修饰符的作用:可以用于确定一个类以及它的成员(变量、方法和构造方法)的可见性,即类和成员能否在该类之外被访问。
注意,可见性修饰符是限制其他类访问本类的权限的,但如果是在类里面,成员是可以任意访问其他成员的。
Java 支持 4 种可见性修饰符:public、protected、default(无修饰符,也叫包访问)和 private
每个修饰符的简介:
- public 修饰符:可以应用在类或类的成员上,表示它们可以被任何其他的类访问
- protected 修饰符: 只能用于类的成员,对同一包内的类和所有子类可见。
- default:可以应用在类或类的成员上,只能在同一个包内被访问。
- private 修饰符:只能用于类的成员上,限定方法和数据域只能在它自己的类中被访问
在局部变量上使用修饰符 public 和 private 都会导致编译错误。
列个表格:
类中成员的修饰符 | 在同一类内可访问 | 在同一包内可访问 | 在子类内可访问 | 在不同包可访问 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | -- |
default | √ | √ | -- | -- |
private | √ | -- | -- | -- |
因此,论可见性, 私有 < 默认(无修饰符) < protected < public。我们依次来讲解
# 公有访问修饰符-public
被声明为 public
的类、方法、构造方法和接口能够被任何其他类访问。但是如果几个相互访问的 public
类分布在不用的包中,则需要导入相应 public 类所在的包。
另外还有一些注意点:
- Java 程序的
main()
方法必须设置成公有的,否则,Java 解释器将不能运行该类。 - 一个
.java
文件中,一定得有一个public
的类,并且类名和文件名相同。 - 使用
public
修饰的类,其所有的公有方法和变量都能被其子类继承。 public
可以用在类、变量、方法和构造方法上,但不能在局部变量上使用。
# 受保护的访问修饰符-protected
被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问,也能够被不同包中的子类访问,但其他不相关的类不能访问。
protected 访问修饰符不能修饰类和接口,方法和成员变量能够声明为 protected,但是接口的成员变量和成员方法不能声明为 protected。
下面的父类使用了 protected 访问修饰符,子类重载了父类的 openSpeaker()方法。
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 实现细节
}
}
class StreamingAudioPlayer extends AudioPlayer {
boolean openSpeaker(Speaker sp) {
// 实现细节
}
}
2
3
4
5
6
7
8
9
10
11
# 默认修饰符-default
不使用任何关键字,就是使用默认访问修饰符,变量和方法对同一个包内的类是可见的。
如下例所示,变量和方法的声明可以不使用任何修饰符。
String version = "1.5.1";
boolean processOrder() {
return true;
}
2
3
4
注意:即使是在不使用修饰符的情况下,接口里的变量都隐式声明为 public static final
,接口里的方法默认情况下访问权限为 public
。
# 私有访问修饰符-private
私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,注意类和接口不能声明为 private。
声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。
private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
# 继承与访问性
有时候,子类想要修改继承的方法的可访问性,但也不是随便都能修改的,有一个原则:子类不能削弱父类中定义的方法的可访问性。举例来说就是:
- 如果一个方法在父类中定义为 public, 在子类中也必须定义为 public。
- 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,但不能声明为 private。
- 父类中默认修饰符声明的方法,能够在子类中声明为 private。
- 父类中声明为 private 的方法,不能够被继承。
# 小结
本文介绍了 Java 中的用于控制可访问性的修饰符,共 4 个,并依次介绍了它们的特点,最后介绍了继承和访问性的注意点。
可访问性修饰符是非常基础重要的概念,请读者务必牢记。