作者:fbysss
msn:jameslastchina@hotmail.com
blog:blog.youkuaiyun.com/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:Java 内部类平日里,Java内部类很少在项目中使用,看了《幕后英雄的用武之地——浅谈Java内部类的四个应用场景》,有一些启发。但是该文说实话太长,也有点乱,而且代码走不通,粗看了前三种应用,做了几个实例,先总结一下,第四种日后补上。
第一种应用,简而言之可以类比c语言里面的struct,方便,而且还可以对外部隐藏(通过private)。
说明:我习惯使用Container来命名inner class外部的class,以区别该Java文件以外的class,感觉这样更贴切。
- package com.sss.exam.inner;
- /**
- * <p>标题: OutterApp1.java</p>
- * <p>功能描述:内部类应用场景1:
- * 相当于delphi的记录类型,或者c的结构体
- *
- * <p>版权: Copyright (c) 2007</p>
- * <p>公司: </p>
- * @author fbysss
- * @version 1.0
- */
- public class Container1 {
- private class PrivateParams{//私有是针对外部其他类的访问是私有的。即外部的其他类不能访问
- public int id ;
- public String name;
- }
- public class PublicParams{
- public int id ;
- public String name;
- }
- /*本方法可以访问私有内部类
- * */
- public void testParams(){
- PrivateParams params = new PrivateParams();
- params.id = 1;
- params.name = "sss";
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- Container1 out = new Container1();
- //Container1可以访问public内部类和private内部类
- PublicParams pp = out.new PublicParams();
- pp.id = 2;
- pp.name = "sss2";
- PrivateParams params = out.new PrivateParams();
- params.id = 3;
- pp.name = "sss3";
- }
- }
其他类访问:
- public class JustTest {
- public static void main(String[] args) {
- Container1 out = new Container1();
- //Container1可以访问public内部类和private内部类
- PublicParams pp = out.new PublicParams();
- //compile error .不能访问私有内部类PrivateParams params = out.new PrivateParams();
- }
- }
第二种和第三种应用,我认为差别不大,可以理解为一种情况,不过是解决不同的问题罢了。
- package com.sss.exam.inner;
- /**
- * <p>标题: Container2.java</p>
- * <p>功能描述: <br>
- *
- * </p>
- * <p>版权: Copyright (c) 2007</p>
- * <p>公司: </p>
- * @author fbysss
- * @version 1.0
- */
- /***
- * 同一个类里面定义非public的类,不能加final abstract 之外的modifier
- * 其modifier 值为0,不在Modifier的定义里面。有人称之为friendly修饰符
- *这里的User跟单独写一个User类的区别仅仅在于modifier.编译出来的class都是单独存在的。
- */
- class User{
- int id;
- String name;
- }
- public class Container2 {
- private User user = null;
- //一个对象是可以这样的,解决了try catch的问题。
- //但是如果是一个String,则不行,问题就在Java的传值和传引用的问题。String相当于就是传值的。
- /**
- * @param args
- */
- public static void main(String[] args) {
- /*背景:catch和finally都相同,只是try部分不同
- * 传统方法:每次都需要写try,catch,finally
- *
- */
- /*
- String user = null;
- try{
- user = "fbysss";
- }catch(Exception e){
- user = "error.";
- }finally{
- user += "'s work finished.";
- }*/
- Container2A c2a = new Container2A();
- c2a.newMethod();
- }
- //使用了内部类的调用方法:
- public void newMethod(){
- Container2Common c2c = new Container2Common();
- c2c.execute(new MyMethod(){//BaseMyMethod(){ 这里不必如此,匿名内部类可以通过这种方法直接实现接口
- public User doMyMethod(){//必须要有返回值,否则通用处理方法得不到user
- //error.无法访问user变量,必须声明为成员变量,user = "fbysss";
- user = new User();
- user.name = "fbysss";
- System.out.println(user.name);
- return user;
- }
- });
- System.out.println("old user is:"+user.name);
- }
- }
公共处理类:
- public class Container2Common {
- public void execute(MyMethod mm){
- User user = null;
- try{
- //通用接口方法,但是具体代码不一样
- user = mm.doMyMethod();
- }catch(Exception e){
- user.name = "error.";
- }finally{
- user.name += "'s work finished.";
- System.out.println(user.name);
- }
- }
- }
个性方法接口:
- public interface MyMethod {
- public User doMyMethod();
- }
上面实际上是一个Java匿名内部类的编写过程。人们常说的Java 回调机制,一般也是通过匿名内部类来实现的。
相关文章: http://blog.youkuaiyun.com/hivon/archive/2006/02/22/606312.aspx