注册
 找回密码
 注册
江西广告网
查看: 466|回复: 0
打印 上一主题 下一主题

Java内部类应用实践

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-2-28 11:12:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
第一种应用,简而言之可以类比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 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(); } 个性stub类,目的是能够实例化,因为接口是不能实例化的。 public class BaseMyMethod implements MyMethod { public User doMyMethod() { // TODO Auto-generated method stub return null; } }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表