Non-Access Modifiers in Java
Last Updated :
23 Jul, 2025
Modifiers are specific keywords present in Java using which we can make changes to the characteristics of a variable, method, or class and limit its scope. Java programming language has a rich set of Modifiers.
Modifiers in Java are divided into two types - Access Modifiers and Non-Access modifiers.
Access Modifiers in Java help restrict the scope of a variable, method, class, or constructor. Public, Private, Protected, and Default these four access modifiers are present in Java.
Non-Access modifiers
Non-access modifiers provide information about the characteristics of a class, method, or variable to the JVM. Seven types of Non-Access modifiers are present in Java. They are -
- static
- final
- abstract
- synchronized
- volatile
- transient
- native
The static keyword means that the entity to which it is applied is available outside any particular instance of the class. That means the static methods or the attributes are a part of the class and not an object. The memory is allocated to such an attribute or method at the time of class loading. The use of a static modifier makes the program more efficient by saving memory. A static field exists across all the class instances, and without creating an object of the class, they can be called.
Example 1:
Java
import java.io.*;
// static variable
class static_gfg {
static String s = "GeeksforGeeks";
}
class GFG {
public static void main(String[] args)
{
// No object required
System.out.println(
static_gfg.s);
}
}
In this above code sample, we have declared the String as static, part of the static_gfg class. Generally, to access the string, we first need to create the object of the static_gfg class, but as we have declared it as static, we do not need to create an object of static_gfg class to access the string. We can use className.variableName for accessing it.
Example 2:
Java
import java.io.*;
class static_gfg {
// static variable
static int count = 0;
void myMethod()
{
count++;
System.out.println(count);
}
}
class GFG {
public static void main(String[] args)
{
// first object creation
static_gfg obj1 = new static_gfg();
// method calling of first object
obj1.myMethod();
// second object creation
static_gfg obj2
= new static_gfg();
// method calling of second object
obj2.myMethod();
}
}
In the above code, the count variable is static, so it is not tied to a specific instance of the class. So, while obj1.myMethod() is called it increases the value of count by 1 and then obj2.myMethod() again increases it . If it was not a static one, then we will get output as 1 in both cases, but as it is a static variable so that count variable will be increased twice, and we will get 2 as an output the second time.
The final keyword indicates that the specific class cannot be extended or a method cannot be overridden. Let's understand that with an example -
Example 1:
Java
import java.io.*;
class final_gfg {
String s1 = "geek1";
}
class extended_gfg extends final_gfg {
String s2 = "geek2";
}
class GFG {
public static void main(String[] args)
{
// creating object
extended_gfg obj = new extended_gfg();
System.out.println(obj.s1);
System.out.println(obj.s2);
}
}
In this above code, the final_gfg class is extended by the extended_gfg class, and the code is working fine and producing output.
But after using the final keyword with the final_gfg class. The code will produce an error. Below is the implementation for the same -
Java
import java.io.*;
// This class is final
final class final_gfg {
String s1 = "geek1";
}
// We are trying to inherit a final
class extended_gfg extends final_gfg {
String s2 = "geek2";
}
class GFG {
public static void main(String[] args)
{
// creating object
extended_gfg obj
= new extended_gfg();
System.out.println(obj.s1);
System.out.println(obj.s2);
}
}
Error :
Screenshot of Error
Here we are getting errors in the compilation as we are trying to extend the final_gfg class, which is declared as final. If a class is declared as final, then we cannot extend it or inherit from that class.
Example 2:
Java
import java.io.*;
class final_gfg{
void myMethod(){
System.out.println("GeeksforGeeks");
}
}
class override_final_gfg extends final_gfg{
void myMethod(){
System.out.println("Overrides GeeksforGeeks");
}
}
class GFG{
public static void main(String[] args) {
override_final_gfg obj=new override_final_gfg();
obj.myMethod();
}
}
OutputOverrides GeeksforGeeks
In the above code, we are overriding myMethod(), and the code is working fine.
Now we are going to declare the myMethod() in superclass as final. Below is the implementation for the same -
Java
import java.io.*;
class final_gfg{
final void myMethod(){
System.out.println("GeeksforGeeks");
}
}
class override_final_gfg extends final_gfg{
// trying to override the method available on final_gfg class
void myMethod(){
System.out.println("Overrides GeeksforGeeks");
}
}
class GFG{
public static void main(String[] args) {
override_final_gfg obj=new override_final_gfg();
obj.myMethod();
}
}
Error:
Screenshot of Error
The above code is producing an error because here, we are trying to override a method that is declared as final. myMethod() in the final_gfg class is declared as final, and we are trying to override that from the override_final_gfg class. A final method cannot be overridden; thus, the code snippet is producing an error here.
abstract keyword is used to declare a class as partially implemented means an object cannot be created directly from that class. Any subclass needs to be either implement all the methods of the abstract class, or it should also need to be an abstract class. The abstract keyword cannot be used with static, final, or private keywords because they prevent overriding, and we need to override methods in the case of an abstract class.
Java
// abstract class
abstract class abstract_gfg{
abstract void myMethod();
}
//extending abstract class
class MyClass extends abstract_gfg{
// overriding abstract method otherwise
// code will produce error
void myMethod(){
System.out.println("GeeksforGeeks");
}
}
class GFG{
public static void main(String[] args) {
MyClass obj=new MyClass();
obj.myMethod();
}
}
In the above code, abstract_gfg is an abstract class, and myMethod() is an abstract method. So, we first need to extend the abstract_gfg class that we have done here using MyClass. After extending, we also need to override the abstract method otherwise, the code will produce errors.
synchronized keyword prevents a block of code from executing by multiple threads at once. It is very important for some critical operations. Let us understand by an example -
Java
import java.io.*;
class Counter{
int count;
void increment(){
count++;
}
}
class GFG{
public static void main(String[] args) throws InterruptedException {
Counter c=new Counter();
// Thread 1
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
for(int i=1;i<=10000;i++){
c.increment();
}
}
});
// Thread 2
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
for(int i=1;i<=10000;i++){
c.increment();
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(c.count);
}
}
Output

The above code should be an output value of 20000 as two threads increment it 10000 times each, and the main is waiting for Thread1, and Thread2 to finish. Sometimes it may not be true. Depending upon the system, it may not give 20000 as output. As both threads are accessing the value of count, it may happen that Thread1 fetches the value of count, and before it could increment it, Thread2 reads the value and increments that. So thus, the result may be less than 20000. To solve this issue, we use the synchronized keyword. If the synchronized keyword is used while declaring the increment() method, then a thread needs to wait for another thread to complete the operation of the method then only another one can work on it. So we can get guaranteed output of 20000.
Below is the synchronized code:
Java
import java.io.*;
class Counter{
int count;
synchronized void increment(){
count++;
}
}
class GFG{
public static void main(String[] args) throws InterruptedException {
Counter c=new Counter();
// Thread 1
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
for(int i=1;i<=100000;i++){
c.increment();
}
}
});
// Thread 2
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
for(int i=1;i<=100000;i++){
c.increment();
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(c.count);
}
}
volatile keyword only and only ensures that changes that are made to variables are reflected across all threads that are accessing the same variable/thread. The usage of volatile keywords does not guarantee thread safety for class but it does not ensure thread safety and concurrency issues. Hence if we want our class to be thread-safe then we need to invoke it via the below technologies:
- Using synchronized keyword
- Using monitors
- using concurrency techniques (language dependent)
Tip: The volatile keyword is only applicable to a variable.
Usage and Application: volatile keyword reduces the chance of memory inconsistency. The value of a volatile variable is always read from the main memory and not from the local thread cache, and it helps to improve thread performance.
Let us understand by an example:
Java
// Java Program to Illustrate volatile keyword
import java.io.*;
import java.util.*;
// Class 1
class Geeks extends Thread {
boolean running = true;
@Override public void run()
{
while (running) {
System.out.println("GeeksforGeeks");
}
}
public void shutDown() { running = false; }
}
// Class 2
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating object of above class
// which is extending Thread class
Geeks obj = new Geeks();
// start() method invoke run() method
obj.start();
Scanner input = new Scanner(System.in);
input.nextLine();
obj.shutDown();
}
}
Output

In the above code, the program should ideally stop if Return Key/Enter is pressed, but in some machines, it may happen that the variable running is cached, and we are not able to change its value using the shutdown() method. In such a case, the program will execute infinite times and cannot be exited properly. To avoid caching and make it Thread-safe, we can use volatile keywords while declaring the running variable.
Java
import java.io.*;
import java.util.*;
class Geeks extends Thread
{
volatile boolean running = true;
@Override public void run()
{
while (running) {
System.out.println("GeeksforGeeks");
}
}
public void shutDown() { running = false; }
}
class GFG {
public static void main(String[] args)
{
Geeks obj = new Geeks();
obj.start();
Scanner input = new Scanner(System.in);
input.nextLine();
obj.shutDown();
}
}
Output:

In the above code, after using the volatile keyword, we can stop the infinite loop using the Return key, and the program exited properly with exit code 0.
This needs prior knowledge of serialization in Java. You can refer to the following article for that:- serialization in java.
The transient keyword may be applied to member variables of a class to indicate that the member variable should not be serialized when the containing class instance is serialized. Serialization is the process of converting an object into a byte stream. When we do not want to serialize the value of a variable, then we declare it as transient. To make it more transparent, let's take an example of an application where we need to accept UserID and Password. At that moment, we need to declare some variable to take the input and store the data, but as the data is susceptible, we do not want to keep it stored after the job is done. To achieve this, we can use the transient keyword for variable declaration. That particular variable will not participate in the serialization process, and when we deserialize that, we will receive the default value of the variable.
Let us see a sample code for the same as follows:
Java
import java.io.*;
class transient_gfg implements Serializable {
// normal variable
int a = 10;
// Transient variables
transient String UserID = "admin";
transient String Password = "tiger123";
}
class GFG {
public static void main(String[] args)
throws IOException, ClassNotFoundException
{
transient_gfg obj = new transient_gfg();
// printing the value of transient
// variable before serialization process
System.out.println("UserID :" + obj.UserID);
System.out.println("Password: " + obj.Password);
System.out.println("a = " + obj.a);
// serialization
FileOutputStream fos
= new FileOutputStream("abc.txt");
ObjectOutputStream oos
= new ObjectOutputStream(fos);
oos.writeObject(obj);
// de-serialization
FileInputStream fis
= new FileInputStream("abc.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
transient_gfg output
= (transient_gfg)ois.readObject();
// printing the value of transient
// variable after de-serialization process
System.out.println("UserID :" + output.UserID);
System.out.println("Password: " + output.Password);
System.out.println("a = " + obj.a);
}
}
Output:

As you see from the output, after serialization, the values of UserID and Password are no longer present. However, the value of 'a', which is a normal variable, is still present.
The native keyword may be applied to a method to indicate that the method is implemented in a language other than Java. Using this java application can call code written in C, C++, or assembler language. A shared code library or DLL is required in this case.
Let us see an example first -
Java
import java.io.*;
class GFG {
// native method
public native void printMethod();
static
{
// The name of DLL file
System.loadLibrary("LibraryName");
}
public static void main(String[] args)
{
GFG obj = new GFG();
obj.printMethod();
}
}
Output:

In the above code, we have a native method. The method is defined in any other language and loaded by a java application using the shared DLL file. Implementation of the DLL file is out of the scope of this article, so if you want to know more about it, you can refer to this article.
Multi-Language Programming – Java Process Class, JNI, and IO.
Similar Reads
Java Tutorial Java is a high-level, object-oriented programming language used to build web apps, mobile applications, and enterprise software systems. Known for its Write Once, Run Anywhere capability, which means code written in Java can run on any device that supports the Java Virtual Machine (JVM).Syntax and s
10 min read
Basics
Introduction to JavaJava is a high-level, object-oriented programming language developed by Sun Microsystems in 1995. It is platform-independent, which means we can write code once and run it anywhere using the Java Virtual Machine (JVM). Java is mostly used for building desktop applications, web applications, Android
4 min read
Java Programming BasicsJava is one of the most popular and widely used programming language and platform. A platform is an environment that helps to develop and run programs written in any programming language. Java is fast, reliable and secure. From desktop to web applications, scientific supercomputers to gaming console
4 min read
Java MethodsJava Methods are blocks of code that perform a specific task. A method allows us to reuse code, improving both efficiency and organization. All methods in Java must belong to a class. Methods are similar to functions and expose the behavior of objects.Example: Java program to demonstrate how to crea
7 min read
Access Modifiers in JavaIn Java, access modifiers are essential tools that define how the members of a class, like variables, methods, and even the class itself, can be accessed from other parts of our program. They are an important part of building secure and modular code when designing large applications. In this article
6 min read
Arrays in JavaIn Java, an array is an important linear data structure that allows us to store multiple values of the same type. Arrays in Java are objects, like all other objects in Java, arrays implicitly inherit from the java.lang.Object class. This allows you to invoke methods defined in Object (such as toStri
9 min read
Java StringsIn Java, a String is the type of object that can store a sequence of characters enclosed by double quotes and every character is stored in 16 bits, i.e., using UTF 16-bit encoding. A string acts the same as an array of characters. Java provides a robust and flexible API for handling strings, allowin
8 min read
Regular Expressions in JavaIn Java, Regular Expressions or Regex (in short) in Java is an API for defining String patterns that can be used for searching, manipulating, and editing a string in Java. Email validation and passwords are a few areas of strings where Regex is widely used to define the constraints. Regular Expressi
7 min read
OOPs & Interfaces
Classes and Objects in JavaIn Java, classes and objects are basic concepts of Object Oriented Programming (OOPs) that are used to represent real-world concepts and entities. A class is a template to create objects having similar properties and behavior, or in other words, we can say that a class is a blueprint for objects.An
10 min read
Java ConstructorsIn Java, constructors play an important role in object creation. A constructor is a special block of code that is called when an object is created. Its main job is to initialize the object, to set up its internal state, or to assign default values to its attributes. This process happens automaticall
10 min read
Java OOP(Object Oriented Programming) ConceptsBefore Object-Oriented Programming (OOPs), most programs used a procedural approach, where the focus was on writing step-by-step functions. This made it harder to manage and reuse code in large applications.To overcome these limitations, Object-Oriented Programming was introduced. Java is built arou
10 min read
Java PackagesPackages in Java are a mechanism that encapsulates a group of classes, sub-packages and interfaces. Packages are used for: Prevent naming conflicts by allowing classes with the same name to exist in different packages, like college.staff.cse.Employee and college.staff.ee.Employee.They make it easier
8 min read
Java InterfaceAn Interface in Java programming language is defined as an abstract type used to specify the behaviour of a class. An interface in Java is a blueprint of a behaviour. A Java interface contains static constants and abstract methods. Key Properties of Interface:The interface in Java is a mechanism to
11 min read
Collections
Exception Handling
Java Exception HandlingException handling in Java is an effective mechanism for managing runtime errors to ensure the application's regular flow is maintained. Some Common examples of exceptions include ClassNotFoundException, IOException, SQLException, RemoteException, etc. By handling these exceptions, Java enables deve
8 min read
Java Try Catch BlockA try-catch block in Java is a mechanism to handle exceptions. This make sure that the application continues to run even if an error occurs. The code inside the try block is executed, and if any exception occurs, it is then caught by the catch block.Example: Here, we are going to handle the Arithmet
4 min read
Java final, finally and finalizeIn Java, the keywords "final", "finally" and "finalize" have distinct roles. final enforces immutability and prevents changes to variables, methods or classes. finally ensures a block of code runs after a try-catch, regardless of exceptions. finalize is a method used for cleanup before an object is
4 min read
Chained Exceptions in JavaChained Exceptions in Java allow associating one exception with another, i.e. one exception describes the cause of another exception. For example, consider a situation in which a method throws an ArithmeticException because of an attempt to divide by zero.But the root cause of the error was an I/O f
3 min read
Null Pointer Exception in JavaA NullPointerException in Java is a RuntimeException. It occurs when a program attempts to use an object reference that has the null value. In Java, "null" is a special value that can be assigned to object references to indicate the absence of a value.Reasons for Null Pointer ExceptionA NullPointerE
5 min read
Exception Handling with Method Overriding in JavaException handling with method overriding in Java refers to the rules and behavior that apply when a subclass overrides a method from its superclass and both methods involve exceptions. It ensures that the overridden method in the subclass does not declare broader or new checked exceptions than thos
4 min read
Java Advanced
Java Multithreading TutorialThreads are the backbone of multithreading. We are living in the real world which in itself is caught on the web surrounded by lots of applications. With the advancement in technologies, we cannot achieve the speed required to run them simultaneously unless we introduce the concept of multi-tasking
15+ min read
Synchronization in JavaIn multithreading, synchronization is important to make sure multiple threads safely work on shared resources. Without synchronization, data can become inconsistent or corrupted if multiple threads access and modify shared variables at the same time. In Java, it is a mechanism that ensures that only
10 min read
File Handling in JavaIn Java, with the help of File Class, we can work with files. This File Class is inside the java.io package. The File class can be used to create an object of the class and then specifying the name of the file.Why File Handling is Required?File Handling is an integral part of any programming languag
6 min read
Java Method ReferencesIn Java, a method is a collection of statements that perform some specific task and return the result to the caller. A method reference is the shorthand syntax for a lambda expression that contains just one method call. In general, one does not have to pass arguments to method references.Why Use Met
9 min read
Java 8 Stream TutorialJava 8 introduces Stream, which is a new abstract layer, and some new additional packages in Java 8 called java.util.stream. A Stream is a sequence of components that can be processed sequentially. These packages include classes, interfaces, and enum to allow functional-style operations on the eleme
15+ min read
Java NetworkingWhen computing devices such as laptops, desktops, servers, smartphones, and tablets and an eternally-expanding arrangement of IoT gadgets such as cameras, door locks, doorbells, refrigerators, audio/visual systems, thermostats, and various sensors are sharing information and data with each other is
15+ min read
JDBC TutorialJDBC stands for Java Database Connectivity. JDBC is a Java API or tool used in Java applications to interact with the database. It is a specification from Sun Microsystems that provides APIs for Java applications to communicate with different databases. Interfaces and Classes for JDBC API comes unde
12 min read
Java Memory ManagementJava memory management is the process by which the Java Virtual Machine (JVM) automatically handles the allocation and deallocation of memory. It uses a garbage collector to reclaim memory by removing unused objects, eliminating the need for manual memory managementJVM Memory StructureJVM defines va
4 min read
Garbage Collection in JavaGarbage collection in Java is an automatic memory management process that helps Java programs run efficiently. Java programs compile to bytecode that can be run on a Java Virtual Machine (JVM). When Java programs run on the JVM, objects in the heap are created, which is a portion of memory dedicated
7 min read
Memory Leaks in JavaIn programming, a memory leak happens when a program keeps using memory but does not give it back when it's done. It simply means the program slowly uses more and more memory, which can make things slow and even stop working. Working of Memory Management in JavaJava has automatic garbage collection,
3 min read
Practice Java
Java Interview Questions and AnswersJava is one of the most popular programming languages in the world, known for its versatility, portability, and wide range of applications. Java is the most used language in top companies such as Uber, Airbnb, Google, Netflix, Instagram, Spotify, Amazon, and many more because of its features and per
15+ min read
Java Programs - Java Programming ExamplesIn this article, we will learn and prepare for Interviews using Java Programming Examples. From basic Java programs like the Fibonacci series, Prime numbers, Factorial numbers, and Palindrome numbers to advanced Java programs.Java is one of the most popular programming languages today because of its
8 min read
Java Exercises - Basic to Advanced Java Practice Programs with SolutionsLooking for Java exercises to test your Java skills, then explore our topic-wise Java practice exercises? Here you will get 25 plus practice problems that help to upscale your Java skills. As we know Java is one of the most popular languages because of its robust and secure nature. But, programmers
7 min read
Java Quiz | Level Up Your Java SkillsThe best way to scale up your coding skills is by practicing the exercise. And if you are a Java programmer looking to test your Java skills and knowledge? Then, this Java quiz is designed to challenge your understanding of Java programming concepts and assess your excellence in the language. In thi
1 min read
Top 50 Java Project Ideas For Beginners and Advanced [Update 2025]Java is one of the most popular and versatile programming languages, known for its reliability, security, and platform independence. Developed by James Gosling in 1982, Java is widely used across industries like big data, mobile development, finance, and e-commerce.Building Java projects is an excel
15+ min read