目录
一、访问控制符
1. 修饰符
→ 修饰符(modifiers)分为两类,可以修饰类及其成员(字段、方法)
① 访问修饰符:public,private 等等
② 其他修饰符:abstract
2. 成员的访问控制符(权限修饰符)
在同一个类中 | 在同一个包中 | 不同包中的子类 | 不同包中的非子类 | |
---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
默认(包可访问) | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
【举例】下面的例子中文件结构如下:
tree
.
├── Derived1.java
├── Main.java
└── pkg
├── Test.java
└── pkg1
└── Test1.java
2 directories, 4 files
为清晰起见,绘制 UML 图如下(图中有些类,如 Group 将在后面的笔记中出现):
代码及注释如下:
→ Main.java 中的 Base 类和 Derived 类:
class Base {
// 不能写 public class Base 因为文件名不是 base.java
private int a = 1;
int b = 2;
protected int c = 3;
public int d = 4;
Base() {
System.out.println("Base initialized.");
System.out.println("this.a = " + this.a); // 同一个类中可以访问的字段
}
}
class Derived extends Base {
Derived() {
System.out.println("Derived initialized.");
// System.out.println(a); [错误]
System.out.println(b); // 同一个包中可以访问的字段
System.out.println(c);
System.out.println(d);
}
}
→ Main.java 中的 Main 类:
public class Main {
public static void main(String[] args) {
Base base = new Base();
// System.out.println(base.a); [错误]
System.out.println(base.b);
System.out.println(base.c);
System.out.println(base.d);
Derived derived = new Derived();
System.out.println(derived);
Derived1 derived1 = new Derived1();
System.out.println(derived1.e); // 同包的非子类可以访问的字段
System.out.println(derived1.f); // 同包的非子类可以访问的字段
Person person = new Person();
// System.out.println(person.age); [错误]
System.out.println(person.getAge());
Person person1 = new Person(20);
System.out.println(person1.getAge());
if (person.setAge(18)) {
System.out.println("Success!");
} else {
System.out.println("Failed!");
}
System.out.println(person.getAge());
if (person1.setAge(300)) {
System.out.println("Success!");
} else {
System.out.println("Failed!");
}
System.out.println(person1.getAge());
}
}
→ 与 Base 类在同一个包中的 Derived1 类:
public class Derived1 extends Base {
public int e = 10;
int f = 12;
Derived1() {
System.out.println(b); // 同包的子类中可以访问的字段
System.out.println(c); // 同包的子类中可以访问的字段
}
}
→ pkg/Test1.java 中的 Test1 和 Test2 类:
package pkg.pkg1;
import pkg.Test;
public class Test1 extends Test {
public Test1() {
super();
System.out.println("test1");
// System.out.println(pri); [错误]
// System.out.println(def); [错误]
System.out.println(pro);
System.out.println(pub);
}
}
class Test2 {
public Test2() {
Test test = new Test();
System.out.println("test2");
// System.out.println(test.pri); [错误]
// System.out.println(test.def); [错误]
// System.out.println(test.pro); [错误]
System.out.println(test.pub);
}
}
3. 类的访问控制符
→ 定义类时,类的访问控制符要么是 public,要么是默认
① public:该类可以被其他类所访问
② 默认:只能被同包中的类访问
【注意】访问受两层控制:类与字段、方法
4. setter 和 getter 及其优势
① 将字段用 private 修饰,从而更好地将信息封装和隐藏
② set 和 get 都用 public 来修饰,分别用 set 和 get 方法对类的属性进行存取
③ setter 和 getter 的优势:
→ 属性用 private 更好地封装和隐藏,外部类不能随意存取和修改
→ 提供方法来存取对象的属性,在方法中可以对给定参数的合法