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