I took these examples from Vinod Pillai lecture on youtube but I think there may be mistakes in his explanations
Inner classes
package main;
public class Main {
public static void main(String[] args) {
// TODO code application logic here
OuterClass outObj = new OuterClass();
// to access the Inner class, we must use the OuterClass object
OuterClass.InnerClass inObj=outObj.new InnerClass();
inObj.getValue();
outObj.accessInner();
}
}
class OuterClass
{
private int x=200;
// the INNER CLASS //////////////////////////////////
public class InnerClass
{
private int ans;
public void getValue()
{
display();
System.out.println("Outer class value= "+x);
}
public void display()
{
System.out.println("Inner class display");
OuterClass.this.display();
}
}
/////////////////////////////////////////////////////
public void display(){
System.out.println("Outer class display");
}
public void accessInner()
{
InnerClass obj = new InnerClass();
obj.ans=300;
System.out.println("Inner class value= "+obj.ans);
}
}
Outputs:
Inner class display
Outer class display
Outer class value= 200
Inner class value= 300
Modifiers
Inner classes, unlike the outer class, CAN have modifiers:
final / abstract/ public/ private/ protected & static
Inner classes within methods
package main;
public class Main {
public static void main(String[] args) {
// TODO code application logic here
OuterClass outObj = new OuterClass();
outObj.methodContainingInnerClass();
}
}
class OuterClass
{
private int x=200;
public void methodContainingInnerClass()
{
int rel=800;
// inner class in a method can only be final or abstract
class InnerClass{
private int ans;
public void getValue()
{
// the inner class within a method, CAN access
// the variables and methods of the outer class
System.out.println("Outer class value= "+x);
printSomething();
}
}
// to access an inner class in a method, you HAVE to
// so this within the method itself, there is no
// other way of accessing it as it's scope belongs in the
// method
new InnerClass().getValue();
}
public void printSomething()
{
System.out.println("Here's something "+ (x+50));
}
}
Outputs:
Outer class value= 200
Here’s something 250
Anonymous inner classes
public class Main {
public static void main(String[] args) {
InnerClass inObj = new InnerClass();
inObj.obj.display();
}
}
class OuterClass
{
public void display()
{
System.out.println("Outer class");
}
}
class InnerClass
{
OuterClass obj=new OuterClass()
{
public void display()
{
System.out.println("Anonymous class");
}
};
}
Outputs:
Anonymous class
However if we change line 24 to
public void display1() , we are no longer overriding the display() method and the OuterClass display() method is called, e.g.
public class Main {
public static void main(String[] args) {
InnerClass inObj = new InnerClass();
inObj.obj.display();
}
}
class OuterClass
{
public void display()
{
System.out.println("Outer class");
}
}
class InnerClass
{
OuterClass obj=new OuterClass()
{
public void display1()
{
System.out.println("Anonymous class");
}
};
}
Outputs:
Outer class
What about another method in the anonymous class, how do we call it??
e.g.
package main;
public class Main {
public static void main(String[] args) {
InnerClass inObj = new InnerClass();
inObj.obj.display();
inObj.obj.display1(); // THIS WON'T WORK !!!!!!!!!!!!
}
}
class OuterClass
{
public void display()
{
System.out.println("Outer class");
}
}
class InnerClass
{
OuterClass obj=new OuterClass()
{
public void display()
{
System.out.println("Anonymous class");
// display1(); // this COULD call the other method though
}
// IF we have another method in the anonymous class
// as below, (see also !!!!!!!!!!!! in main method
public void display1()
{
System.out.println("display1 method in anonymous class");
}
};
}
Here we get a compilation error, we CANNOT access display1() in the anonymous method
using:
inObj.obj.display1();
because
inObj.obj will reference the parent class (OuterClass) (polymorphism)
However we could call it from line 31 (commented out currently)
Static modifier with inner classes
package main;
public class Main {
public static void main(String[] args) {
OuterClass.InnerClass obj = new OuterClass.InnerClass();
obj.display();
}
}
class OuterClass
{
int rel=800;
static class InnerClass
{
public void display()
{
System.out.println("InnerClass (static) ");
// However the following line won't now be able to access rel
//System.out.println("InnerClass (static) "+rel);
}
}
}