黑马程序员--内部类

时间:2022-07-24 00:25:48

    

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

                                         内部类
什么叫内部类?
 在一个文件夹中定义两个类,但其中任何一个类都不在另一个类的内部,而如果在类中在定义一个类,则将在类中在定义的那个类称为内部类。内部类可分为成员内部类
 ,局部内部类以及匿名类
1.成员内部类
 public class OuterClass{      //外部类
  private class InnerClass{ //内部类
   //......
  }
 }
 在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private.
 内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会帮顶在外部类对象上,内部类初始化方式与其他类初始化方式相同
 都是使用new关键字。
 public class OuterClass{
  innerClass in=new innerClass(); //在外部类实例化内部类对象引用
  public void ouf(){
   in.inf()     //在外部类方法中调用内部类方法
  }
  
  class innerClass{
   innerClass(){     //内部类构造方法
   }
   public void inf(){    //内部类成员方法
   }
   int y=0;
  }
  
  public innerClass doit(){    //外部类方法,返回值为内部类引用
   //y=4;      //外部类不可直接访问内部类成员变量
   in.y=4;
   return new innerClass();   //返回内部类引用
  }
  
  public static void main(String args[]){
   OuterClass out=new OuterClass();
   //内部类的对象实例化操作必须在外部类或外部来的非静态方法中实现
   OuterClass.innerClass in=out.doit();
   OuterClass.innerClass in2=out.new innerClass();
  }
   //如果不使用doit()方法返回内部类对象引用,可以直接使用内部类实例化内部类对象,但由于是在住方法中实例化内部类对象,必须在new操作符之前提供一个外部类的引用
 }


内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。


内部类向上转型为接口:
 如果将一个权限修饰符为private的内部类向上转型为其父类对象,或者直接向上转型为一个借口,在程序中就可以完全隐藏内部类的具体实现过程。可以在外部提供一个接口,在接口中
 中声明一个方法。如果在实现该接口的内部类中实现该接口的方法,就可以定义多个内部类以不同的方式实现接口中的同一个方法,而在一般的类中是不能多次实现接口中通一个方法的,这种技术
 经常使用在Swing编程中,可以在一个类中做出多个不同的响应事件


局部内部类:
 内部类不仅可以在类中进行定义,也可以在类的局部位置定义,如在类的方法中或任意的作用域中可以定义内部类
 interface Outlnterface2{} //定义一个接口
 class OuterClass3{
  public Outlnterface2 doit(final String x){//doit()方法参数为final类型
   //在doit()方法中的定义一个内部类
   class innerClass2 implements Outinterface2{
    innerClass2(String s){
     s=x;
     System.out.println(s);
    }
   }
   return new innerClass2("doit");
  }
 }


匿名类:0
 class OuterClass4{
  public Outerface2 doit(){ //定义doit()方法
   return new Outinterface2(){ //声明匿名内部类
    private int i=0;
    public int getValue(){
     return i;
    }
   };
  }
 }
 在doit()方法内部首先返回一个OutInterface2的引用,然后再return语句中插入一个定义内部类的代码,由于这个类没有名称,所以在这个该内部类被称为匿名内部类,实质上这种内部类的宗旨就似乎创建一个实现于OutInterface2接口的匿名类的对象
 匿名类的所有实现代码都需要在大括号之间进行编写。
 匿名类的语法如下:
 return new A(){
  ...//内部类体
 }
 A是指类名。
 由于匿名内部类没有名称,所以匿名内部类使用默认构造方法来生成OutInterface2对象,在匿名内部类定义结束后,需要加分号标识,这个分号并不是代表定义内部类结束的标识,而是代表创建OutInterface2引用表达式的标识。
 [匿名内部类编译以后,会产生以“外部类名$序号”为名称的.class文件,序号以1-n排列,分别代表1-n个匿名内部类]

 

 

 ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------