Access Modifiers in Java


In Java, access modifiers control the visibility and accessibility of classes, methods, and fields. There are four types of access modifiers in Java:

  • public
  • private
  • protected
  • default (no modifier)

1. Public Access Modifier

The public access modifier makes a class, method, or field accessible from anywhere in the program. It has the widest scope and can be accessed by any other class, regardless of the package it belongs to.

Example 1: Using the public Access Modifier

In this example, the class MyClass and the method displayMessage() are declared public. This means they can be accessed from any other class:

    public class MyClass {
        // Public method
        public void displayMessage() {
            System.out.println("Hello, this is a public method!");
        }
    }
        

We can call the displayMessage() method from any other class:

    public class Main {
        public static void main(String[] args) {
            // Create an object of MyClass
            MyClass myObject = new MyClass();
            
            // Call the public method
            myObject.displayMessage();
        }
    }
        

Output:

    Hello, this is a public method!
        

2. Private Access Modifier

The private access modifier restricts access to the class, method, or field to only within the class where it is declared. It is the most restrictive access modifier.

Example 2: Using the private Access Modifier

In this example, the field num and the method setNum() are declared private. They cannot be accessed outside of the MyClass class:

    public class MyClass {
        // Private field
        private int num;
    
        // Private method
        private void setNum(int num) {
            this.num = num;
        }
    
        // Public method to access the private field
        public void displayNum() {
            System.out.println("Number: " + num);
        }
    }
        

We cannot access num or setNum() directly from outside the class. However, we can use a public method like displayNum() to access the private fields indirectly:

    public class Main {
        public static void main(String[] args) {
            // Create an object of MyClass
            MyClass myObject = new MyClass();
            
            // We cannot directly access setNum() or num here
            // myObject.setNum(10); // This would cause a compile-time error
    
            // Use a public method to display the private field
            myObject.displayNum();
        }
    }
        

Output:

    Number: 0
        

3. Protected Access Modifier

The protected access modifier allows access within the same package and also to subclasses (even if they are in different packages). This is less restrictive than private but more restrictive than public.

Example 3: Using the protected Access Modifier

In this example, the field num is declared protected, so it can be accessed within the same package or by subclasses:

    public class MyClass {
        // Protected field
        protected int num;
    
        // Protected method
        protected void setNum(int num) {
            this.num = num;
        }
    
        // Public method to display the protected field
        public void displayNum() {
            System.out.println("Number: " + num);
        }
    }
        

Accessing protected Members in a Subclass

In the following code, we create a subclass of MyClass and access the protected field num:

    public class SubClass extends MyClass {
        public void setNumInSubClass(int num) {
            // Accessing protected field from superclass
            this.num = num;
        }
    }
        

In this case, the SubClass can directly access the num field because it is declared protected in the superclass.

Example: Using the SubClass

    public class Main {
        public static void main(String[] args) {
            // Create an object of SubClass
            SubClass myObject = new SubClass();
            
            // Set the protected field using subclass method
            myObject.setNumInSubClass(100);
    
            // Display the value of protected field
            myObject.displayNum();
        }
    }
        

Output:

    Number: 100
        

4. Default Access Modifier

If no access modifier is specified, Java uses the default access modifier. The default access modifier allows access only within the same package.

Example 4: Using the Default Access Modifier

In this example, no access modifier is specified, so the field num has default access:

    public class MyClass {
        // Default access field
        int num;
    
        // Default access method
        void setNum(int num) {
            this.num = num;
        }
    
        // Public method to display the default access field
        public void displayNum() {
            System.out.println("Number: " + num);
        }
    }
        

We can access the default access field num only within the same package:

    public class Main {
        public static void main(String[] args) {
            // Create an object of MyClass
            MyClass myObject = new MyClass();
            
            // Set the default access field
            myObject.setNum(200);
    
            // Display the value of the field
            myObject.displayNum();
        }
    }
        

Output:

    Number: 200
        

5. Comparison of Access Modifiers

Access Modifier Class Package Subclass World
public Yes Yes Yes Yes
private Yes No No No
protected Yes Yes Yes (if subclass) No
default Yes Yes No No

6. Conclusion

Access modifiers in Java play a crucial role in controlling the visibility of classes, methods, and fields. By using public, private, protected, and default access modifiers appropriately, you can implement proper encapsulation, improving the security and maintainability of your code.





Advertisement