Some years back when I was learning Java, I got to know that Java follows Object Oriented Programming paradigm and everything in Java is an object either it is a String (which was a char array in C) or an array itself.
But later on I found on the internet, people are saying that Java is actually not a purely object-oriented because everything in Java is not an object, for example:
But later on, I found that for every object JVM creates two objects
One is
That's the reason why static variables get changed for every object even if we change it for a single
Now 2nd point got canceled because the static content does belong to an object. But the 1st point is still there and we still have primitive data types which are not objects in Java. However wrapper classes are there and due to autoboxing (automatic unboxing-boxing, boxing-unboxing), we can directly assign a primitive literal to its Wrapper class reference.
But still, we can’t perform object related operations on primitives variables we always need to create objects of the respective wrapper class, for example
And due to these reasons, we say primitive types are not objects but what if that’s actually an elusion and it is end-user perspective (Java developers are end user to Java because we are using it not creating it).
If we dig down deep into the Java source codes we can find that JVM internally treats all primitive types as objects and proof of this can be found in source code or Javadoc of class Class, according to source code class
And Javadoc code of Class.isPrimitive() method says
If we open source code of class Class and do a
Also if we open source of the
And if we write below the line in your program in eclipse
We get a compilation error saying
If JVM creates objects for all primitive types then why do we need to use primitive types instead of creating an object of its respective wrapper classes. That’s because JVM creates these native objects for primitive types internally and those objects are very lightweight and optimized than their respective wrapper class objects and due to this, they have less functionality e.g. we can’t call methods on them because they don’t have any.
We should use primitive types because:
4th statement gives false because the 256 integers closest to zero [-128; 127] are cached by the JVM, so they return the same object for those. Beyond that range, they aren't cached, so a new object is created.
So there are enough reasons to say JVM treats all primitive types as objects internally, however, we can’t use them in that way and we have got Wrapper classes for that.
This is why Java is purely Object Oriented Language, Please mention in comments what do you think Java is a purely Object Oriented Language or not.
But later on I found on the internet, people are saying that Java is actually not a purely object-oriented because everything in Java is not an object, for example:
- All primitive types (char, boolean, byte, short, int, long, float, double) are not objects because we can not perform any object related operation (using . and calling methods) on them.
- I have seen some people some saying that all the static content (variables and methods) does not belong to any object so they are non-object things.
But later on, I found that for every object JVM creates two objects
- The object itself.
- And one Class level object which gets created only once when classloader loads the class into memory. And all static content of that class belongs to this Class object and all other objects of that class refer to this class level object for all static content.
Employee emp = new Employee();
One is
emp
itself and another one is the class level object of employee class. If we are accessing any static content through the emp
object it points to the class level object to access that.That's the reason why static variables get changed for every object even if we change it for a single
emp
object because all objects are pointing to the same copy of that variable from class level object.Now 2nd point got canceled because the static content does belong to an object. But the 1st point is still there and we still have primitive data types which are not objects in Java. However wrapper classes are there and due to autoboxing (automatic unboxing-boxing, boxing-unboxing), we can directly assign a primitive literal to its Wrapper class reference.
But still, we can’t perform object related operations on primitives variables we always need to create objects of the respective wrapper class, for example
Integer obj = new Integer(5); // here we can do obj.toString()
int i = 5; // but we can't do i.toString() here
And due to these reasons, we say primitive types are not objects but what if that’s actually an elusion and it is end-user perspective (Java developers are end user to Java because we are using it not creating it).
If we dig down deep into the Java source codes we can find that JVM internally treats all primitive types as objects and proof of this can be found in source code or Javadoc of class Class, according to source code class
Class
Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects
And Javadoc code of Class.isPrimitive() method says
public boolean isPrimitive()
Determines if the specified Class object represents a primitive type.
There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types that they represent, namely boolean,byte, char, short, int, long, float, and double.
These objects may only be accessed via the following public static final variables, and are the only Class objects for which this method returns true.
Returns:
true if and only if this class represents a primitive type
Since:
JDK1.1
See Also:
Boolean.TYPE, Character.TYPE, Byte.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE, Void.TYPE
If we open source code of class Class and do a
CTRL + F
for "primitive” word we will find lots of reason to believe that JVM treats all primitive types as objects internally.Also if we open source of the
Integer
class search for Integer.TYPE entry, we will findpublic static final Class[Integer](https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html) TYPE
The Class instance representing the primitive type int.
And if we write below the line in your program in eclipse
Integer.TYPE i = 5;
We get a compilation error saying
Integer.TYPE cannot be resolved to a type
with a hint from eclipse to change it to int.So if all primitive types are objects for JVM then why should we use primitive types
If JVM creates objects for all primitive types then why do we need to use primitive types instead of creating an object of its respective wrapper classes. That’s because JVM creates these native objects for primitive types internally and those objects are very lightweight and optimized than their respective wrapper class objects and due to this, they have less functionality e.g. we can’t call methods on them because they don’t have any.
We should use primitive types because:
- They are fast e.g. below program takes 9 seconds to run on my machine while it takes 0 seconds if I convert
Long sum
tolong sum
.
public static void main(String[] args) {
long millis = System.currentTimeMillis();
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
System.out.println((System.currentTimeMillis() - millis) / 1000);
- They allow us to use native equality operator ==
new Integer(3) == new Integer(3); // false
new Integer(100) == new Integer(100); // false
Integer.valueOf(5) == Integer.valueOf(5); //true
Integer.valueOf(100) == Integer.valueOf(100); //false
4th statement gives false because the 256 integers closest to zero [-128; 127] are cached by the JVM, so they return the same object for those. Beyond that range, they aren't cached, so a new object is created.
So there are enough reasons to say JVM treats all primitive types as objects internally, however, we can’t use them in that way and we have got Wrapper classes for that.
This is why Java is purely Object Oriented Language, Please mention in comments what do you think Java is a purely Object Oriented Language or not.