I was reading about Inner class in Learning Java. I found this code
class Animal{
class Brain{
}
}
After compiling, javap 'Animal$Brain'
gives output as
Compiled from "Animal.java"class
Animal$Brain {
final Animal this$0;
Animal$Brain(Animal);
}
which explains how the inner class gets the reference to its enclosing instance in the inner class constructor. But when I define the inner class as private like this
class Animal{
private class Brain{
}
}
then after compiling, javap 'Animal$Brain'
gives the output as
Compiled from "Animal.java"
class Animal$Brain {
final Animal this$0;
}
So why is the output different? Why is the inner class constructor not shown? In the latter case also, the inner class is getting the reference of enclosing class instance.
In Java, inner class refers to the class that is declared inside class or interface which were mainly introduced, to sum up, same logically relatable classes as Java is purely object-oriented so bringing it closer to the real world.
Inner classes are a security mechanism in Java. We know a class cannot be associated with the access modifier private, but if we have the class as a member of other class, then the inner class can be made private. And this is also used to access the private members of a class.
There are two types of nested classes non-static and static nested classes. The non-static nested classes are also known as inner classes. A class created within class and outside method. A class created for implementing an interface or extending class.
Java inner class is defined inside the body of another class. Java inner class can be declared private, public, protected, or with default access whereas an outer class can have only public or default access. Java Nested classes are divided into two types.
Good question. According to this,
If no options are used, javap prints out the package, protected, and public fields and methods of the classes passed to it
Since you have declared Brain
as a private inner class, its default constructor will be implicitly made private and hence it will not be visible outside the Animal
class.
Ref: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9
By default, javap prints non private members of the classes.
You can use -p option to shows all classes and members.
//javap -p 'Animal$Brain.class'
Compiled from "Animal.java"
class Animal$Brain {
final Animal this$0;
private Animal$Brain(Animal);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With