Public vs Protected vs Package vs Private Access Modifier in Java
Last Updated :
06 Sep, 2023
Whenever we are writing our classes we have to provide some information about our classes to the JVM like whether this class can be accessible from anywhere or not, whether child class creation is possible or not, whether object creation is possible or not etc. we can specify this information by using an appropriate keyword in java called access modifiers. So access modifiers are used to set the accessibility of classes, methods, and other members.
Modifier 1: Public Access Modifiers
If a class is declared as public then we can access that class from anywhere.
In the below example we are creating a package pack1 inside that package we declare a class A which is public and inside that class, we declare a method m1 which is also public. Now we create another package pack2 and inside that pack2 we import pack1 and declare a class B and in class B’s main method we create an object of type class A and trying to access the data of method m1.
Example:
Java
package pack1;
import java.io.*;
import java.util.*;
public class A {
public void m1() { System.out.println( "GFG" ); }
}
|
Compiling and saving the above code by using the below command line:
Java
package pack2;
import java.io.*;
import java.util.*;
import pack1.A;
class B {
public static void main(String[] args)
{
A a = new A();
a.m1();
}
}
|
If class A is not public while compiling B class we will get a compile-time error saying pack1. A is not public in pack1 and can’t be accessed from the outside package.
Similarly, a member or method, or interface is declared as public as we can access that member from anywhere.
Modifier 2: Protected Access Modifier
This modifier can be applied to the data member, method, and constructor, but this modifier can’t be applied to the top-level classes and interface.
A member is declared as protected as we can access that member within the current package and only in the child class of the outside package.
Implementation:
Example
Java
import java.io.*;
import java.util.*;
class A {
protected void m1() { System.out.println( "GFG" ); }
}
class B extends A {
public static void main(String[] args)
{
A a = new A();
a.m1();
B b = new B();
b.m1();
A a1 = new B();
a1.m1();
}
}
|
Output explanation:
In the above example, we create three objects using parent reference and child reference and call m1() method on it, and it successfully executed so from the above example we can say that we can access the protected method within the current package anywhere either by using parent reference or by child reference. We can access protected method outside the package only by child reference.
Modifier 3: Private Access Modifiers
This modifier is not applicable for top-level classes or interfaces. It is only applicable to constructors, methods, and fields inside the classes.
If a variable or methods or constructor is declared as private then we can access them only from within the class i.e from outside the class we can’t access them.
Example:
Java
import java.io.*;
import java.util.*;
class A {
private void m1() { System.out.println( "GFG" ); }
}
class B {
public static void main(String[] args)
{
A a = new A();
a.m1();
}
}
|
Modifier 4: Package(Default) Access Modifier
A class or method or variable declare without any access modifier then is considered that it has a package(default)access modifier The default modifier act as public within the same package and acts as private outside the package. If a class is declared as default then we can access that class only within the current package i.e from the outside package we can’t access it. Hence, the default access modifier is also known as the package–level access modifier. A similar rule also applies for variables and methods in java.
Example:
Java
import java.io.*;
import java.util.*;
class GFG {
String s = "Geeksfor" ;
String s1 = "Geeks" ;
String fullName()
{
return s + s1;
}
public static void main(String[] args)
{
GFG g = new GFG();
System.out.println(g.fullName());
}
}
|
Finally, after getting it done with all four access modifiers let us conclude the evident differences between them
This modifier is applicable for both top-level classes and interfaces. |
This modifier is not applicable for both top-level classes and interfaces. |
This modifier is not applicable for both top-level classes and interfaces. |
This modifier is applicable for both top-level classes and interfaces. |
Public members can be accessed from the child class of the same package. |
Private members cannot be accessed from the child class of the same package. |
Protected members can be accessed anywhere from the same package and only by child classes outside the package. |
Package members can be accessed from the child class of the same package. |
Public member can be accessed from non-child classes of the same package. |
Private members cannot be accessed from non-child classes of the same package. |
Protected member can be accessed from non-child classes of the same package. |
Package member can be accessed from non-child class of the same package. |
Public members can be accessed from the child class of outside package. |
Private members cannot be accessed from the child class of outside package. |
Protected members can be accessed from the child class of the outside package, but we should use child reference only. |
Package members cannot be accessed from the child class of outside package. |
Public members can be accessed from non-child class of outside package. |
Private members cannot be accessed from non-child class of outside package. |
Protected members cannot be accessed from the non-child class of outside package. |
Package members cannot be accessed from non-child class of outside package. |
Public modifier is the most accessible modifier among all modifiers. |
Private modifier is the most restricted modifier among all modifiers. |
Protected modifier is more accessible than the package and private modifier but less accessible than public modifier. |
Package modifier is more restricted than the public and protected modifier but less restricted than the private modifier. |