内部类的使用

 

package innerclass;

public class InnerTest1 {

 /**
  * @param args
  */
 public static void main(String[] args) {

 MyOuter mo=new MyOuter();
  mo.makeInner();
  MyOuter.MyInner mm=mo.new MyInner();
  mm.seeOuter();
  
  
  MyOuter2 myOuter2=new MyOuter2();
  MyOuter2.doStuff2();
 myOuter2.doStuff2();
  
  MyOuter3.MyInner mo3=new MyOuter3.MyInner();
  mo3.go();
 }

}
/*
 * 普通内部类
 */
class MyOuter{
 private int a=7;
 public void makeInner(){
  MyInner mi=new MyInner();//在外部类内实例化内部类
  mi.seeOuter();
 }
 class MyInner{
  public void seeOuter(){
   System.out.println("Outer a is"+a);
   System.out.println(this); //在内部类内引用内部实例
   System.out.println(MyOuter.this); //在内部类内引用该类的外部实例
  }
 }
}
/*
 * 局部方法内部类
 * 注意:1、必须在方法内创建实例并且创建实例的地方必须在内部类定义的后面
 *      2、内部类对象不能使用它所在的方法的局部变量,除非被声明为final
 */
class MyOuter2{
 private int x;
 public void doStuff(){
  System.out.println("create an inner class");
  final int y=9;
  class MyInner{
  
   public void seeOuter(){
    System.out.println("outer x "+x+" out y "+y);
   }
  }
  MyInner mi=new MyInner();
  mi.seeOuter();
  
 }
 public static void doStuff2(){
  final int x=2;
  int y=9;
  class MyInner{
   int z=8;
   public void seeOuter(){
    System.out.println("out x "+x);
    System.out.println("inner z "+z);
   }
  
  }
  MyInner myInner=new MyInner();
  myInner.seeOuter();
 }
}
/*
 * 静态嵌套类
 * 注意:静态嵌套类不能访问实例变量和外部类的非静态方法!
 */
class MyOuter3{
  int x=9;
 static int y;
  void goInner1(){
  System.out.println("go Inner!");
 }
  static void goInner2(){
   System.out.println("go Inner!");
  }
 static class MyInner{
  void go(){
   System.out.println("hello!");
// 编译错误  System.out.println("outer3 x"+x);
   System.out.println("outer3 y"+y);
// 编译错误  MyOuter3.goInner1();
   MyOuter3.goInner2();
  }
  
 }
}

/*
 * 匿名内部类:
 * 在涉及匿名内部类时多态性会起作用,
 * 匿名内部类可以扩展一个接口或者是一个类,但只能实现一个!
 */
class Food {
 Popcorn p=new Popcorn(){
  public void pop(){
   System.out.println(" anonymous");
  }
  //此方法不能调用,因为它没有在超类中定义!
  public void eat(){
   System.out.println("eating popcorn");
  }
 };
 Fruit f=new Fruit(){
  public void eat(){
   System.out.println("eating ");
  }
 };
 public void doIt(){
      p.pop();
// 编译错误   p.eat();
  
 }
}

阅读更多
文章标签: class go string 扩展
个人分类: JavaSE
想对作者说点什么? 我来说一句

内部类示例

2011年12月26日 22KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭