Java学习个人备忘录之内部类

来源:互联网 发布:陕西大数据集团张鹏 编辑:程序博客网 时间:2024/06/05 21:15
内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类.  

class Outer  {      private int num = 3;      class Inner //它想访问Outer中的num, 如果在外面就需要创建一个对象,然后通过公开的接口访问,但是现在Outer内部, 就可以直接访问了.这样方便      {          void show()          {              System.out.println("show run..." + num);          }      }      //如果现在想访问Inner就需要这样      public void method()      {          Inner in = new Inner();          in.show();      }      //内部类由于在内部, 相当于定义在了成员的位置上, 所以可以用成员修饰符, 如:      //private class Test{}      static class Inner      {          static void function()          {              System.out.println("function run......"+num);          }      }  }

 

内部类访问特点:
1. 内部类可以直接访问外部类中的成员.
2. 外部类要访问内部类, 必须建立内部类的对象.

一般用于类的设计。

分析事物时, 发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。
这时就把还有的事物定义成内部类来描述。

class InnerClassDemo  {      public static void main(String[] args)      {          Outer out  = new Outer();          out.method();          //直接访问外部类中的内部类中的成员.          Outer.Inner in = new Oouter().new Inner();          in.show();          //如果内部类是静态, 那就相当于一个外部类了.          Outer.Inner in = new Outer.Inner();          in.show();          //如果内部类是静态的,成员是静态的.          Outer.Inner.function();           //如果内部类中定义了静态成员,该内部类也必须是静态的.        }  }  

 

细节

class Outer  {      int num = 3;      class Inner      {          int num = 4;          void show()          {              int num = 5;              System.out.println(num);//5              System.out.println(this.num);//4              System.out.println(Outer.this.num);//3          }      }      void method()      {          new Inner().show();      }  }  class InnerClassDemo2  {      public static void main(String[] args)      {          new Outer().method();      }  }  

为什么内部类能直接访问外部类中成员呢?
那是因为内部类持有了外部类的引用-----外部类名.this

 

内部类可以存放在局部位置上

class Outer  {      int num = 3;      Object method()      {          final int x = 9;          class Inner          {              void show()              {                  System.out.println("show..."+num);              }          }          Object in = new Inner();          return in;//0x0045      }  }  class InnerClassDemo3  {      public static void main(String[] args)      {          Outer out = new Outer();          Object obj = out.method();//0x0045      }  }

内部类在局部位置上只能访问局部中被final修饰的局部变量。

 

匿名内部类, 就是内部类的简写格式.
必须有前提:
内部类必须继承或者实现一个外部类或者接口.

匿名内部类: 其实就是一个匿名子类对象.

格式: new 父类or接口(){子类内容}

abstract class Demo  {      abstract void show();  }  class Outer  {      int num = 4;      class Inner extends Demo //这是正常情况      {          void show()          {              System.out.println("show...."+num);          }      }      public void method()      {          new Demo()//这个就叫匿名内部类          {              void show()              {                  System.out.println("show...."+num);              }          }      }  }

 

匿名内部类的应用

interface Inter  {      void show1();      void show2();  }  class Outer  {      public void method()      {          new Inter()          {              public void show1()              {}              public void show2()              {}          }.show1();  //调用了show1的方法, 相当于  new Inner().show1();                    //或者用下面的方法          Inter in = new Inter()          {              public void show1()              {}              public void show2()              {}          }          in.show1();          in.show2();      }  }  

 

通常的使用场景之一:
当函数参数是接口类型时,而且接口中的方法不超过三个.
可以用匿名内部类作为实际参数进行传递.

class InnerClassDemo5  {      public static void main(String[] args)      {          show(new InterImpl());      }      public static void show(Inter in)      {          in.show1();          in.show2();      }  }  class InterImpl implements Inter  {}  

 

对象的初始化过程

class Fu  {      int num = 9;      {          System.out.println("Fu");      }          Fu()      {          super();          //显示初始化          //构造代码块初始化          show();      }      void show()      {          System.out.println("fu show..."+num); //被覆盖,运行子类      }  }  class Zi extends Fu  {      int num = 8;      {          System.out.println("Zi");      }      Zi()      {          super();          //显示初始化          //构造代码块初始化          show();      }      void show()      {          System.out.println("zi show..."+num);      }  }      class Inner  {      public static void main(String[] args)      {          new Zi();      }  }
/*
Fu
zi show...0
Zi
zi show...8
*/

 

原创粉丝点击