编程自学指南:java程序设计开发,Java 四种访问修饰符详解
一、课程信息
学习目标
- 理解 Java 中四种访问修饰符(
public
、private
、protected
、默认)的概念和作用。 - 掌握不同访问修饰符对类、属性和方法的访问权限控制。
- 能够根据实际需求合理使用访问修饰符,提高代码的安全性和可维护性。
课程重点
- 四种访问修饰符的访问权限范围。
- 不同访问修饰符在类、属性和方法上的应用。
课程难点
- 理解
protected
访问修饰符的特殊访问规则。 - 合理运用访问修饰符进行类的设计。
二、课程导入
生活中的访问控制实例
在生活中,我们经常会遇到访问控制的场景。比如,家里的客厅是公共区域,任何人(家人、客人)都可以自由进入,这就类似于 public
访问权限;而卧室通常是私人空间,只有主人可以随意进出,其他人未经允许不能进入,这类似于 private
访问权限;小区的花园是受保护的区域,小区内的居民可以自由使用,外来人员需要经过一定的许可才能进入,这类似于 protected
访问权限;自己房间的抽屉,没有明确说明是否可以让其他家庭成员使用,一般默认只有自己使用,这类似于默认访问权限。
编程中的访问控制需求
在 Java 编程中,我们也需要对类、属性和方法的访问进行控制。例如,一个类的某些属性可能不希望被外部类直接访问和修改,以保证数据的安全性;而有些方法可能需要被其他类调用,就需要提供相应的访问权限。Java 提供了四种访问修饰符来满足这些需求。
三、public
访问修饰符
概念
public
是最宽松的访问修饰符,被 public
修饰的类、属性和方法可以被任何类访问,无论这些类是否在同一个包中。
示例代码
// 定义一个公共类
public class PublicClass {
// 公共属性
public String publicField = "This is a public field.";
// 公共方法
public void publicMethod() {
System.out.println("This is a public method.");
}
}
// 另一个类,可在不同包中
public class AccessPublicClass {
public static void main(String[] args) {
PublicClass obj = new PublicClass();
// 访问公共属性
System.out.println(obj.publicField);
// 调用公共方法
obj.publicMethod();
}
}
使用场景
- 当一个类、属性或方法需要被其他任何类使用时,通常使用
public
修饰符。例如,Java 标准库中的很多类和方法都是public
的,方便开发者使用。
四、private
访问修饰符
概念
private
是最严格的访问修饰符,被 private
修饰的属性和方法只能在本类中访问,其他类无法直接访问。
示例代码
class PrivateClass {
// 私有属性
private String privateField = "This is a private field.";
// 私有方法
private void privateMethod() {
System.out.println("This is a private method.");
}
// 公共方法,用于间接访问私有属性和方法
public void accessPrivateMembers() {
System.out.println(privateField);
privateMethod();
}
}
public class AccessPrivateClass {
public static void main(String[] args) {
PrivateClass obj = new PrivateClass();
// 不能直接访问私有属性和方法
// System.out.println(obj.privateField);
// obj.privateMethod();
// 通过公共方法间接访问
obj.accessPrivateMembers();
}
}
使用场景
- 当一个属性或方法是类的内部实现细节,不希望被外部类访问时,使用
private
修饰符。例如,类的一些辅助方法或内部状态变量可以使用private
修饰,以提高类的封装性和安全性。
五、默认访问修饰符
概念
默认访问修饰符是指在定义类、属性或方法时不使用任何访问修饰符。被默认访问修饰符修饰的类、属性和方法只能在同一个包中的其他类访问。
示例代码
// 同一个包中的类
package com.example.package1;
// 默认访问修饰符的类
class DefaultClass {
// 默认访问修饰符的属性
String defaultField = "This is a default field.";
// 默认访问修饰符的方法
void defaultMethod() {
System.out.println("This is a default method.");
}
}
// 同一个包中的另一个类
class AccessDefaultClass {
public static void main(String[] args) {
DefaultClass obj = new DefaultClass();
// 可以访问默认访问修饰符的属性和方法
System.out.println(obj.defaultField);
obj.defaultMethod();
}
}
使用场景
- 当一个类、属性或方法只需要在同一个包内使用时,可以使用默认访问修饰符。例如,在一个包中实现一组相关的功能,这些功能之间的类和方法可以使用默认访问修饰符进行封装。
六、protected
访问修饰符
概念
protected
访问修饰符的访问权限介于 private
和 public
之间。被 protected
修饰的属性和方法可以在本类、同一个包中的其他类以及不同包中的子类中访问。
示例代码
// 父类,在包 com.example.package2 中
package com.example.package2;
public class ParentClass {
// 受保护的属性
protected String protectedField = "This is a protected field.";
// 受保护的方法
protected void protectedMethod() {
System.out.println("This is a protected method.");
}
}
// 同一个包中的类
package com.example.package2;
class SamePackageClass {
public static void main(String[] args) {
ParentClass obj = new ParentClass();
// 可以访问受保护的属性和方法
System.out.println(obj.protectedField);
obj.protectedMethod();
}
}
// 不同包中的子类
package com.example.package3;
import com.example.package2.ParentClass;
class ChildClass extends ParentClass {
public void accessParentProtectedMembers() {
// 可以访问受保护的属性和方法
System.out.println(protectedField);
protectedMethod();
}
}
// 不同包中的非子类
package com.example.package3;
import com.example.package2.ParentClass;
class NonChildClass {
public static void main(String[] args) {
ParentClass obj = new ParentClass();
// 不能访问受保护的属性和方法
// System.out.println(obj.protectedField);
// obj.protectedMethod();
}
}
使用场景
- 当一个属性或方法需要在同一个包内的类以及不同包的子类中使用时,使用
protected
修饰符。例如,在设计一个类库时,一些基础类的部分属性和方法希望子类可以继承和扩展,但又不希望被其他无关类随意访问,就可以使用protected
修饰符。
七、四种访问修饰符的访问权限总结
访问修饰符 | 本类 | 同一个包中的类 | 不同包中的子类 | 不同包中的非子类 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
默认 | √ | √ | × | × |
private | √ | × | × | × |
八、课堂练习
练习 1
创建一个 BankAccount
类,包含 accountNumber
(账号)、balance
(余额)属性。将 accountNumber
设为 private
,balance
设为 protected
。提供公共的 getAccountNumber
和 deposit
方法,deposit
方法用于向账户存钱。创建一个 SavingsAccount
类继承自 BankAccount
类,在 SavingsAccount
类中创建一个方法,用于访问 balance
属性并输出余额。
练习 2
创建一个 Shape
类,包含一个默认访问修饰符的 draw
方法。在同一个包中创建 Circle
类和 Rectangle
类,分别继承自 Shape
类,并在子类中重写 draw
方法。在 main
方法中创建 Circle
和 Rectangle
对象,调用 draw
方法。
九、课程总结
重点回顾
- 四种访问修饰符(
public
、private
、protected
、默认)的概念和访问权限范围。 - 不同访问修饰符在类、属性和方法上的应用场景。
注意事项
- 在设计类时,要根据实际需求合理选择访问修饰符,尽量遵循封装原则,将不需要对外暴露的属性和方法设为
private
或默认访问修饰符。 - 使用
protected
修饰符时,要注意其特殊的访问规则,确保只有合适的类可以访问受保护的成员。
十、课后作业
作业 1
设计一个 Employee
类,包含 employeeId
(员工编号)、name
(姓名)、salary
(工资)属性。将 employeeId
设为 private
,name
设为默认访问修饰符,salary
设为 protected
。提供公共的 getEmployeeId
和 setName
方法,以及受保护的 adjustSalary
方法用于调整工资。创建一个 Manager
类继承自 Employee
类,在 Manager
类中创建一个方法,用于调用 adjustSalary
方法调整员工工资。
作业 2
创建一个 Vehicle
类,包含一个 public
的 start
方法和一个 private
的 checkEngine
方法。在 start
方法中调用 checkEngine
方法。创建一个 Car
类继承自 Vehicle
类,在 Car
类中创建一个 main
方法,创建 Car
对象并调用 start
方法。