Sobes.tech
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.

  1. public

    • Visibility: Everywhere (within the package and outside).
    • Applicability: Classes, interfaces, members, constructors.
  2. protected

    • Visibility: Within the package and in all subclasses (even in another package).
    • Applicability: Members, constructors.
  3. (No modifier) or default / package-private

    • Visibility: Only within the package.
    • Applicability: Classes, interfaces, members, constructors.
  4. 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();
    }
}