|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
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;
}
} |
|