Extensible Python: Robustness through Addition - PyCon 2024
Inner classes
1. NESTED CLASSES
A class declared within another class is called a
Nested Class
Outer class
Inner class
2. l Kinds Of Classes
l
--- Top level classes
l - declared inside package
l - visible throughout package.
l - public classes must be defined in their own file.
l
--- Nested and inner classes
l - declared inside class (or method).
l - can be visible only to outer class, or have wider
visibility.
3. Types Of Nested Classes
l 1. Non-Static Nested Classes
l i. Member inner class
l ii. Local inner class
l Iii. Anonymous inner class
l 2. Static Nested Classes
l
l
l
4. Kinds of inner/nested class
--- Inner class
l - defined inside another class.
l - but each instance of an inner class is transparently associated
with an instance of the outer class.
--- Anonymous inner classes
l - unnamed inner classes.
--- Nested class
l - defined inside another class.
l - has access to private members of enclosing class.
l
5. l Member Inner Class example:
l class Outer{
l private int data=30;
l class Inner{
l void msg(){
l System.out.println("data is "+data);}
l } //close inner class
l public static void main(String args[]){
l Outer obj=new Outer();
l Outer.Inner in=obj.new Inner();
l in.msg();
l }
l }
l
6. l Local Inner Class example:
l public class localInner{
l private int data=30;//instance variable
l void display(){
l class Local{
l void msg(){System.out.println(data);}
l }
l Local l=new Local();
l l.msg();
l } //close method
l public static void main(String args[]){
l localInner obj=new localInner();
l obj.display();
l }
l }
7. l Anonymous Inner Class:(using Interface)
l
l interface Eatable{
l void eat();
l }
l class TestAnnonymousInner1{
l public static void main(String args[]){
l Eatable e=new Eatable(){
l public void eat(){System.out.println("nice fruits");}
l };
l e.eat();
l }
l }
8. l Anonymous Inner Class(using Class):
l
l abstract class Person{
l abstract void eat();
l }
l class TestAnonymousInner{
l public static void main(String args[]){
l Person p=new Person(){
l void eat(){System.out.println("nice fruits");}
l };
l p.eat();
l }
l }
l
9. l Static Nested Class example:(for instance
method)
l class TestOuter{
l static int data=30;
void m1() {
System.out.println(“instance method”);}
l static class Inner{
l void msg(){System.out.println("data is "+data);}
l }
l public static void main(String args[]){
l TestOuter t = new TestOuter();
l t.m1();
l TestOuter.Inner obj=new TestOuter.Inner();
l obj.msg();
l }
l }
10. l Static Nested Class(for static method):
l
l class TestOuter{
l static int data=30;
l static class Inner{
l static void msg(){System.out.println("data is "+data);}
l }
l public static void main(String args[]){
l TestOuter.Inner.msg();//no need to create the instance of
static nested class
l }
l }
11. l Nested Interface example:
l interface Showable{
l void show();
l interface Message{
l void msg(); }
l }
l class TestNestedInterface implements Showable.Message{
l public void msg(){System.out.println("Hello nested
interface");}
l public static void main(String args[]){
l Showable.Message message=new
TestNestedInterface(); //upcasting here
l message.msg();
l }
l }
12. l Nested Interface:
l interface Room{
l void show();
l interface Almarah{
l void msg(); }
l }
l class TestNestedInterface implements Room,Room.Almarah{
l public void msg(){System.out.println("Hello nested
interface");}
l public void show(){System.out.println(“show method”);}
l public static void main(String args[]){
l Room room = new TestNestedInterface ();
l Room.Almarah roomAlmarah = new TestNestedInterface1();
l room.show();
l roomAlmariah.msg();
l }
l }
13. l Interface within a class:
l class Chat{
l void classMethod() {System.out.println(“Class Method”);}
l interface Message{
l void msg(); }
l }
l class TestNestedInterface extends Chat implements
Chat.Message{
l public void msg(){System.out.println("Hello nested interface");}
l public static void main(String args[]){
l Chat chat = new TestNestedInterface();
l Chat.Message message=new TestNestedInterface();
l chat.classMethod();
l message.msg();
l }
l }
14. l Class within interface:
l interface Message{
l void msg(); }
l class Chat{
l void classMethod() {System.out.println(“Class Method”);}
l }
l class TestNestedInterface extends Message.Chat
implements Message{
l public void msg(){System.out.println("Hello nested
interface");}
l public static void main(String args[]){
l Message message = new TestNestedInterface();
l Message.Chat chat=new TestNestedInterface();
l chat.classMethod();
l message.msg();
l }
l }
15. l
l Uses of Nested Classes:
l
l 1. it can access all the members (data members and methods) of
outer class including private.
l
l 2. to develop more readable and maintainable code .
l
l 3. Code Optimization.
l