MST

星途 面试题库

面试题:Java中封装与访问控制之修饰符使用

请阐述Java中private、protected和public这三个访问修饰符在封装和访问控制方面的作用及使用场景,并举例说明不同修饰符修饰类成员时,在同一个包内和不同包内的访问规则。
37.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 访问修饰符的作用及使用场景

  • private
    • 作用:表示私有,修饰的类成员只能在本类内部被访问,提供了最高级别的封装。通过将类的属性设为private,外部代码无法直接访问和修改,只能通过类内部提供的公共方法(如getter和setter方法)来操作,保证了数据的安全性和一致性。
    • 使用场景:通常用于类的属性,防止外部代码随意访问和修改,确保数据的完整性。例如,一个用户类中的密码属性,应该设为private,避免被外部直接获取或修改。
  • protected
    • 作用:表示受保护,修饰的类成员可以在本类、同一个包内的其他类以及不同包的子类中被访问。它主要用于保护一些内部实现细节,同时允许子类进行扩展和访问。
    • 使用场景:当希望类的某些成员对同包的类可见,并且对不同包的子类也可见时使用。比如,一个图形绘制库中的Shape类有一些计算图形面积的方法,设为protected,这样同包的其他图形类(如CircleRectangle)可以直接使用,不同包的子类如果继承Shape类也能访问这些方法进行扩展。
  • public
    • 作用:表示公共,修饰的类成员可以在任何地方被访问,没有访问限制。
    • 使用场景:通常用于对外提供的接口方法,供其他类广泛调用。例如,一个工具类中的一些通用方法,希望在项目的任何地方都能使用,就可以设为public

2. 不同修饰符在同一个包内和不同包内的访问规则及举例

同一个包内

假设我们有两个类AB在同一个包com.example下:

package com.example;

public class A {
    private int privateField;
    protected int protectedField;
    public int publicField;

    private void privateMethod() {
        System.out.println("This is a private method.");
    }

    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }

    public void publicMethod() {
        System.out.println("This is a public method.");
    }
}

public class B {
    public void accessA() {
        A a = new A();
        // 无法访问a.privateField; 因为private修饰的成员只能在本类访问
        a.protectedField = 10; // 可以访问,同一个包内可以访问protected修饰的成员
        a.publicField = 20;    // 可以访问,public修饰的成员可以在任何地方访问

        // 无法访问a.privateMethod(); 因为private修饰的方法只能在本类访问
        a.protectedMethod();    // 可以访问,同一个包内可以访问protected修饰的方法
        a.publicMethod();       // 可以访问,public修饰的方法可以在任何地方访问
    }
}

不同包内

假设我们有一个类Acom.example包下,一个类Ccom.other包下,并且C继承自A

package com.example;

public class A {
    private int privateField;
    protected int protectedField;
    public int publicField;

    private void privateMethod() {
        System.out.println("This is a private method.");
    }

    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }

    public void publicMethod() {
        System.out.println("This is a public method.");
    }
}

package com.other;
import com.example.A;

public class C extends A {
    public void accessA() {
        C c = new C();
        // 无法访问c.privateField; 因为private修饰的成员只能在本类访问
        c.protectedField = 10; // 可以访问,不同包的子类可以访问protected修饰的成员
        c.publicField = 20;    // 可以访问,public修饰的成员可以在任何地方访问

        // 无法访问c.privateMethod(); 因为private修饰的方法只能在本类访问
        c.protectedMethod();    // 可以访问,不同包的子类可以访问protected修饰的方法
        c.publicMethod();       // 可以访问,public修饰的方法可以在任何地方访问
    }
}

如果C不继承A,则无法访问Aprotected修饰的成员,但仍然可以访问public修饰的成员。例如:

package com.other;
import com.example.A;

public class D {
    public void accessA() {
        A a = new A();
        // 无法访问a.privateField;
        // 无法访问a.protectedField; 因为D不是A的子类且不在同一个包
        a.publicField = 20;    // 可以访问,public修饰的成员可以在任何地方访问

        // 无法访问a.privateMethod();
        // 无法访问a.protectedMethod(); 因为D不是A的子类且不在同一个包
        a.publicMethod();       // 可以访问,public修饰的方法可以在任何地方访问
    }
}