面试题答案
一键面试1. 访问修饰符修饰类时的可见性规则
- public:被
public
修饰的类具有最大的访问权限,对所有包中的所有类都可见。任何其他类,无论在同一个包还是不同包中,只要能找到该类的字节码文件,就可以访问它。 - protected:
protected
不能修饰顶级类(即直接定义在包下的类),只能修饰内部类。如果修饰内部类,它的访问权限比包访问权限(default)更宽泛一些,除了同包内的类可以访问,不同包中该类的子类也可以访问。 - default(包访问权限):当类没有显式使用任何访问修饰符时,就具有包访问权限。具有包访问权限的类只能被同一个包中的其他类访问,不同包中的类无法访问。
- private:
private
同样不能修饰顶级类,只能修饰内部类。被private
修饰的内部类只能在其外部类内部被访问,其他任何类(包括同一个包中的其他类)都无法访问。
2. 不同包结构下的访问示例
假设我们有以下包结构:
com
├── example
│ ├── ParentPackage
│ │ ├── ParentClass.java
│ │ └── OtherClassInSamePackage.java
│ └── ChildPackage
│ └── ChildClass.java
2.1 public修饰的类
ParentClass.java
package com.example.ParentPackage;
public class ParentClass {
public void publicMethod() {
System.out.println("This is a public method in ParentClass.");
}
}
ChildClass.java
package com.example.ChildPackage;
import com.example.ParentPackage.ParentClass;
public class ChildClass {
public static void main(String[] args) {
ParentClass parent = new ParentClass();
parent.publicMethod();
}
}
在上述示例中,ChildClass
在不同包com.example.ChildPackage
中可以通过导入com.example.ParentPackage.ParentClass
来访问public
修饰的ParentClass
及其public
方法。
2.2 default修饰的类(包访问权限)
OtherClassInSamePackage.java
package com.example.ParentPackage;
class OtherClassInSamePackage {
void accessDefaultClass() {
ParentClass parent = new ParentClass();
parent.publicMethod();
}
}
如果ParentClass
没有public
修饰符,而是默认的包访问权限,OtherClassInSamePackage
在同一个包com.example.ParentPackage
中可以访问ParentClass
及其public
方法。但ChildClass
在不同包中就无法访问ParentClass
。
2.3 protected修饰内部类的示例
ParentClass.java
package com.example.ParentPackage;
public class ParentClass {
protected static class InnerProtectedClass {
void innerMethod() {
System.out.println("This is an inner method of InnerProtectedClass.");
}
}
}
ChildClass.java
package com.example.ChildPackage;
import com.example.ParentPackage.ParentClass;
public class ChildClass extends ParentClass {
public static void main(String[] args) {
ParentClass.InnerProtectedClass inner = new ChildClass().new InnerProtectedClass();
inner.innerMethod();
}
}
这里InnerProtectedClass
是ParentClass
的内部类且被protected
修饰,ChildClass
作为ParentClass
的子类,虽然在不同包,但仍可以访问InnerProtectedClass
。
2.4 private修饰内部类的示例
ParentClass.java
package com.example.ParentPackage;
public class ParentClass {
private static class InnerPrivateClass {
void innerMethod() {
System.out.println("This is an inner method of InnerPrivateClass.");
}
}
public void accessInnerPrivateClass() {
InnerPrivateClass inner = new InnerPrivateClass();
inner.innerMethod();
}
}
在ParentClass
外部,即使在同一个包中,其他类也无法访问InnerPrivateClass
。只有ParentClass
自身的方法accessInnerPrivateClass
可以访问InnerPrivateClass
。