Junior
Tell us about access modifiers in Java.
sobes.tech AI
Answer from AI
In Java, there are four access modifiers that determine the visibility of classes, members (fields and methods), and constructors.
-
public- Visibility: Everywhere (within the package and outside).
- Applicability: Classes, interfaces, members, constructors.
-
protected- Visibility: Within the package and in all subclasses (even in another package).
- Applicability: Members, constructors.
-
(No modifier) or
default/ package-private- Visibility: Only within the package.
- Applicability: Classes, interfaces, members, constructors.
-
private- Visibility: Only within the same class.
- Applicability: Members, constructors.
Summary table of visibility:
| Modifier | Inside class | Inside package | Subclasses (other package) | All classes (other package) |
|---|---|---|---|---|
private |
Yes | No | No | No |
default |
Yes | Yes | No | No |
protected |
Yes | Yes | Yes | No |
public |
Yes | Yes | Yes | Yes |
Example usage:
// In package: com.example.package1
package com.example.package1;
public class ClassA {
private int privateVar;
int defaultVar; // default (package-private)
protected int protectedVar;
public int publicVar;
private void privateMethod() {}
void defaultMethod() {}
protected void protectedMethod() {}
public void publicMethod() {}
}
// In package: com.example.package1 (same package)
package com.example.package1;
public class ClassB {
public void accessClassA() {
ClassA objA = new ClassA();
// objA.privateVar = 10; // Error: private
objA.defaultVar = 20;
objA.protectedVar = 30;
objA.publicVar = 40;
// objA.privateMethod(); // Error: private
objA.defaultMethod();
objA.protectedMethod();
objA.publicMethod();
}
}
// In package: com.example.package2 (another package)
package com.example.package2;
import com.example.package1.ClassA;
public class ClassC extends ClassA { // Subclass of ClassA
public void accessClassA() {
// Through inherited object (this or an object of type ClassC)
// privateVar is not accessible
// defaultVar is not accessible in another package
protectedVar = 50; // Accessible protected from subclass
publicVar = 60;
// privateMethod() not accessible
// defaultMethod() not accessible in another package
protectedMethod(); // Accessible protected from subclass
publicMethod();
}
public void accessClassAFromOtherInstance() {
ClassA objA = new ClassA();
// privateVar not accessible
// defaultVar not accessible
// objA.protectedVar = 70; // Error: protected is only accessible in subclass through inheritance, not through another instance
objA.publicVar = 80;
// privateMethod() not accessible
// defaultMethod() not accessible
// objA.protectedMethod(); // Error
objA.publicMethod();
}
}
// In package: com.example.package2 (another package)
package com.example.package2;
import com.example.package1.ClassA;
public class ClassD { // Not a subclass of ClassA
public void accessClassA() {
ClassA objA = new ClassA();
// privateVar not accessible
// defaultVar not accessible
// protectedVar not accessible
objA.publicVar = 90;
// privateMethod() not accessible
// defaultMethod() not accessible
// protectedMethod() not accessible
objA.publicMethod();
}
}