`
howarezhao
  • 浏览: 7286 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于内部类的整理

 
阅读更多
   刚刚学习完java编程思想的内部类,以xmind软件做了一下整理,顺便生成了总结文档.但是做来给自己看的.非常的业余.所以如果有理解错误的地方,请大家指出,在下会随时更新和完善~:)~
   ps:附件为xmind的整理文件~可以用xmind软件打开,另外xmind图上的注释代码也在文档中~
  


   内部类
1. 内部类特性
1.1 能够调用外部类的所有成员
1.1.1 使用.this
public class DotThis{
      void f(){
      System.out.println("DotThis.f()");
		}
      public class Inner{
        public DotThis outer(){
          return DotThis.this; //此处返回外部类的对象
       	} 
 		public Inner inner() {
          return new Inner(); //此处返回内部类本身
        }
       public static void main(String[] args){
        	DotThis dt =new DotThis();
            DotThis.Inner dti = dt.inner();
            dti.out().f();
       }
      }
}


1.2 能够继承类和实现接口,能够向上转型
1.3 能够覆盖
1.4 生成内部类对象

1.4.1 使用.new

public class DotNew{
       public class Inner{};
       public static void main(String[] args){
               DotNew dn = new DotNew();
               DotNew.Inner dni = dn.new Inner();
       }
}

//通过调用外部类对象.new来返回一个内部类对象,在拥有外部类对象之前是不可能创建内部类对象的,因为内部类对象会暗暗链接到外部类对象上,但如果是静态内部类,则不需要对外部类对象的引用


2. 内部类分类
2.1 匿名内部类
2.1.1 可以不定义名字而返回所实现的接口
public Interface Contents{
    public int value();
}
//这个匿名内部类是放在contents方法里的内部类,return new Contents()是返回一个实现了Contents接口的内部类,这里并没有给类定义名字.这一般是内部类不需要名字的情况下,比如事件响应后应该执行的代码.
public Class Parcel7{
     public Contents contents(){
              return new Contents(){
                     private int i =11;
                     public int value(){ return 1;}
             }
     }
    public static void main(String[] args){
         Parcel7 p =new Parcel7();
        Contents c = p.contents();
    }       
}
2.2 嵌套内部类
2.2.1 嵌套在内部类的内部类,感觉这特性比较少用
2.3 作用域里内部类
2.3.1 包含在作用域或方法里的内部类,能够通过调用方法或判断域来定义内部类,在作用域以外是不可用的

public class Parcel6{
         private void internalTracking(boolean b){
              if(b){
                 class TrackingSlip{
                      .........
                }
             }
         }
         public void track(){internalTracking(true);}
         public static void main(String[] args){
            Parcel6 p = new Parcel6();
            p.track(); //如果不调用这个方法,TrackingSlip类是不存在的,但是一样会编译出class。
         }
}
2.4 接口内部类
2.4.1 能够在接口定义内部类,甚至在内部类实现外围接口

public interface ClassInInterface{
          void howdy();
          //内部类test实现了外围接口ClassInInterface
          Class Test implements ClassInInterface{
                   public void howdy(){
                       System.out.println("howdy in classininterface!");
                   }
                  public static void main(String[] args){
                       new Test().howdy();
                  }
          } 
}
2.5 静态内部类
2.5.1 静态内部类不能调用外部类的非静态成员
这一点其实很好理解,因为static静态属性的代码是预先在内存中分配空间的,静态内部类的话也是预先在内存中分配空间,而非静态的方法属性是动态生成的,所以不能调用非静态的方法成员
3. 内部类的意义
3.1 多重继承
3.2 内部类代替主类用main方法测试
3.2.1 嵌套内部类测试
public class TestBed{
   public void f(){System.out.println("f()");}
   public static class Tester{
        public static void main(String[] args){
           TestBed t =new TestBed();
           t.f();
        }
   }
}
//通过编译会生成一个独立的类TestBed$Tester.class,可以使用这个类测试,而不需要包含它,只需要在产品打包前简单删除TestBed$Tester.class
4. 内部类的实际应用
主要用于java的GUI编程中,常见有按键事务管理.
可以用于程序控制框架,参加java编程思想《内部类与控制框架》的例子.

4.1 事件适配器(匿名内部类)
  • 大小: 65.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics