Java内部类应用实践(修正版)

作者:fbysss
msn:[email protected] 
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:Java 内部类平日里,Java内部类很少在项目中使用,看了《幕后英雄的用武之地——浅谈Java内部类的四个应用场景》,有一些启发。但是该文说实话太长,也有点乱,而且代码走不通,粗看了前三种应用,做了几个实例,先总结一下,第四种日后补上。

第一种应用,简而言之可以类比c语言里面的struct,方便,而且还可以对外部隐藏(通过private)。

 

说明:我习惯使用Container来命名inner class外部的class,以区别该Java文件以外的class,感觉这样更贴切。

  1. package com.sss.exam.inner;
  2. /**
  3.  * <p>标题: OutterApp1.java</p>
  4.  * <p>功能描述:内部类应用场景1:
  5.  * 相当于delphi的记录类型,或者c的结构体 
  6.  * 
  7.  * <p>版权: Copyright (c) 2007</p>
  8.  * <p>公司: </p>
  9.  * @author fbysss 
  10.  * @version 1.0
  11.  */
  12. public class Container1 {
  13.     private class PrivateParams{//私有是针对外部其他类的访问是私有的。即外部的其他类不能访问
  14.         public int id ;
  15.         public String name;
  16.     }
  17.     
  18.     public class PublicParams{
  19.         public int id ;
  20.         public String name;
  21.     }   
  22.     /*本方法可以访问私有内部类
  23.      * */
  24.     public void testParams(){
  25.         PrivateParams params = new PrivateParams();
  26.         params.id = 1;
  27.         params.name = "sss";
  28.     }
  29.     /**
  30.      * @param args
  31.      */
  32.     public static void main(String[] args) {
  33.         Container1 out = new Container1();
  34.         //Container1可以访问public内部类和private内部类
  35.         PublicParams pp = out.new PublicParams();
  36.         pp.id = 2;
  37.         pp.name = "sss2";
  38.         
  39.         PrivateParams params = out.new PrivateParams();
  40.         params.id = 3;
  41.         pp.name = "sss3";
  42.     }
  43. }

其他类访问:

  1. public class JustTest {
  2.     public static void main(String[] args) {
  3.         Container1 out = new Container1();
  4.         //Container1可以访问public内部类和private内部类
  5.         PublicParams pp = out.new PublicParams();
  6.         //compile error .不能访问私有内部类PrivateParams params = out.new PrivateParams();
  7.     }
  8. }

第二种和第三种应用,我认为差别不大,可以理解为一种情况,不过是解决不同的问题罢了。

 

  1. package com.sss.exam.inner;
  2. /**
  3.  * <p>标题: Container2.java</p>
  4.  * <p>功能描述: <br>
  5.  *
  6.  * </p>
  7.  * <p>版权: Copyright (c) 2007</p>
  8.  * <p>公司: </p>
  9.  * @author fbysss 
  10.  * @version 1.0
  11.  */
  12. /***
  13.  * 同一个类里面定义非public的类,不能加final abstract 之外的modifier
  14.  * 其modifier 值为0,不在Modifier的定义里面。有人称之为friendly修饰符
  15. *这里的User跟单独写一个User类的区别仅仅在于modifier.编译出来的class都是单独存在的。
  16.  */
  17. class User{ 
  18.     int id;
  19.     String name;
  20. }
  21. public class Container2 {
  22.     private User user = null;
  23.     //一个对象是可以这样的,解决了try catch的问题。
  24.     //但是如果是一个String,则不行,问题就在Java的传值和传引用的问题。String相当于就是传值的。
  25.     /**
  26.      * @param args
  27.      */
  28.     public static void main(String[] args) {
  29.         /*背景:catch和finally都相同,只是try部分不同
  30.          * 传统方法:每次都需要写try,catch,finally
  31.          * 
  32.          */
  33.         /*
  34.         String user = null;
  35.         try{
  36.             user = "fbysss";
  37.         }catch(Exception e){
  38.             user = "error.";
  39.         }finally{
  40.             user += "'s work finished.";
  41.         }*/
  42.         Container2A c2a = new Container2A();
  43.         c2a.newMethod();
  44.         
  45.     }
  46.     //使用了内部类的调用方法:
  47.     public void newMethod(){
  48.         Container2Common c2c = new Container2Common();
  49.         c2c.execute(new MyMethod(){//BaseMyMethod(){ 这里不必如此,匿名内部类可以通过这种方法直接实现接口
  50.             public User doMyMethod(){//必须要有返回值,否则通用处理方法得不到user
  51.                 //error.无法访问user变量,必须声明为成员变量,user = "fbysss";               
  52.                 user = new User();
  53.                 user.name = "fbysss";
  54.                 System.out.println(user.name);
  55.                 return user;
  56.                 
  57.             }
  58.         });
  59.         System.out.println("old user is:"+user.name);
  60.     }
  61. }

公共处理类:

  1. public class Container2Common {
  2.     public void execute(MyMethod mm){
  3.         User user = null;
  4.         try{
  5.             //通用接口方法,但是具体代码不一样
  6.             user = mm.doMyMethod();
  7.         }catch(Exception e){
  8.             user.name = "error.";
  9.         }finally{
  10.             user.name += "'s work finished.";
  11.             System.out.println(user.name);
  12.         }
  13.     }
  14. }

个性方法接口:

  1. public interface MyMethod {
  2.     public User doMyMethod();
  3. }

上面实际上是一个Java匿名内部类的编写过程。人们常说的Java 回调机制,一般也是通过匿名内部类来实现的。

相关文章: http://blog.csdn.net/hivon/archive/2006/02/22/606312.aspx

 

你可能感兴趣的:(Java内部类应用实践(修正版))