What is the difference between public, protected, package-private and private in Java?

 

In Java, access modifiers (public, protected, package-private/default, and private) control the visibility and accessibility of classes, methods, and fields within different scopes. Here's an explanation of each modifier with examples:

  1. public:

    • Members declared as public are accessible from any class and package.
    • There are no restrictions on access.
    java
  • public class PublicExample { public int publicVar = 10; public void publicMethod() { System.out.println("This is a public method."); } }
  • protected:

    • Members declared as protected are accessible within the same package and subclasses (even if the subclass is in a different package).
    • Subclasses can access protected members of their superclass.
    java
  • class Parent { protected int protectedVar = 20; } public class Child extends Parent { public void accessProtectedVar() { System.out.println("Protected var from Child: " + protectedVar); } }
  • Package-Private (Default):

    • If no access modifier is specified, the member is package-private (default).
    • Members are accessible only within the same package.
    java
  • class PackagePrivateExample { int packagePrivateVar = 30; }
  • private:

    • Members declared as private are accessible only within the same class.
    • They are not visible or accessible from any other class or package.
    java
    1. public class PrivateExample { private int privateVar = 40; private void privateMethod() { System.out.println("This is a private method."); } }

    Remember, access modifiers apply not only to classes and methods but also to fields. The access level of a member affects where it can be accessed from and provides encapsulation by restricting direct access.

    Example: Putting It All Together:

    java
    package com.example; class Parent { int packagePrivateVar = 20; protected int protectedVar = 30; private int privateVar = 40; } public class Child extends Parent { public void accessMembers() { System.out.println("Package-Private Var: " + packagePrivateVar); // Accessible because in the same package System.out.println("Protected Var: " + protectedVar); // Accessible because it's a subclass // System.out.println("Private Var: " + privateVar); // Not accessible from Child } public static void main(String[] args) { Child child = new Child(); child.accessMembers(); } }

    In this example, the Child class inherits the protected member from its Parent class and can access it. The package-private member is also accessible because the classes are in the same package. However, the private member is not accessible from Child.

    Comments