public vs private java

Java has 4 access modifiers:
1. public
2. private
3. protected
4. default.
In this article, we will understand the difference between public and private access modifiers in java with example code and explanation.

public

public access specifier can be applied before a class, method and instance variables with public keyword. It is the least restrictive in terms of visibility.

A class, method or variable with public access is visible everywhere. Everywhere means,
1. Outside the class,
2.Outside the package,
3. Outside the application(to the JVM)

This is the reason why main method is public, so that it can be invoked by the JVM at application startup.
Below is an example of a class with public access, having public field and public method.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Employee {
public String name;
public String getName() {
return name;
}
}
public class Employee { public String name; public String getName() { return name; } }
public class Employee {
   public String name;

   public String getName() {
      return name;
   }
}

Note that class fields or instance variables should not be public as it violates encapsulation and data hiding.

private

private is the most restrictive access modifier. It may be applied to
1. Inner classes,
2. Fields,
3. Constructor,
4. Methods.

Anything marked private is accessible only within the same class, not even to the child class. Example,

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Person {
private String name;
public String getName() {
return name;
}
}
public class Person { private String name; public String getName() { return name; } }
public class Person {
  private String name;

  public String getName() {
    return name;
  }
}

Above class defines a private field. This field is directly accessible within the same class only.

Consider a child class of the above class.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class EmployeeDetail extends Employee {
void printName() {
// COMPILER ERROR: name is not visible
super.name;
}
}
public class EmployeeDetail extends Employee { void printName() { // COMPILER ERROR: name is not visible super.name; } }
public class EmployeeDetail extends Employee {
  void printName() {
    // COMPILER ERROR: name is not visible
    super.name;
  }
}

When it tries to access parent class field directly, a compiler error is raised. Same applies to private methods.

Private class

A top level class can not be marked private. Top level class means a class which is defined in its own file.
So, below class definitions are valid.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// Top Level Class
public class Employee {
// Inner Class
private class EmployeeDetail {
}
}
class Shape {
}
// Top Level Class public class Employee { // Inner Class private class EmployeeDetail { } } class Shape { }
// Top Level Class
public class Employee {

  // Inner Class
  private class EmployeeDetail {

  }
}

class Shape {

}

private is valid for inner classes.

Private constructor

A constructor in java is used when creating object of a class. Constructor is implicitly invoked when an object of a class is created.
So, if a constructor of a class is marked private, you can not create its object outside the class. Example,

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class PrivateConstructorDemo {
// private constructor
private PrivateConstructorDemo() {
}
public PrivateConstructorDemo getObject() {
// allowed
return new PrivateConstructorDemo();
}
}
// other class
class Driver {
void testMethod() {
// error
new PrivateConstructorDemo();
}
}
public class PrivateConstructorDemo { // private constructor private PrivateConstructorDemo() { } public PrivateConstructorDemo getObject() { // allowed return new PrivateConstructorDemo(); } } // other class class Driver { void testMethod() { // error new PrivateConstructorDemo(); } }
public class PrivateConstructorDemo {
  
  // private constructor
  private PrivateConstructorDemo() {
  }

  public PrivateConstructorDemo getObject() {
    // allowed
    return new PrivateConstructorDemo();
  }
}

// other class
class Driver {
  void testMethod() {
    // error
    new PrivateConstructorDemo();
  }
}

When trying to create an object of a class with private constructor outside the class, the compiler will complain.

public vs private

From the discussion till now, it is clear that the difference between public and private access modifiers lies in the visibility.
Below is a table which summarizes the difference between the visibility of these two.

Comparison Basis Public Private
Applicable To Classes, Interfaces, Fields, Methods, Constructor Can not be applied to top level Classes and Interfaces.
Can be applied to Fields, Methods, Constructor
Visible in same package Yes No
Visible to other package Yes No
Visible to child class in same package Yes No
Visible to child class in different package Yes No
Recommended for class fields No
Violates encapsulation and data hiding.
Yes

That is all on public vs private access modifier in java.

Hope the article was useful.

Categorized in:

Java Concepts,