以前学的时候,没怎么看内部类,觉得这个东西很少用到,就先跳过了。现在发现,是时候拾起来了。工作中,逐步的都用到了。所以,就想写个HelloWorld内部类版。
最初想写的是:用Java实现闭包,写了半路,发现不对了,今天的代码不是闭包了。也懒着改了,先发出来吧。
先定义了一个接口:
package com.lippeng;
/**
* 随便定义一个接口,里面有个方法
*
* @author lippeng
*
*/
public interface Isayer {
public void say();
}
然后,是 HelloWorld类:
package com.lippeng;
public class HelloWorld {
// 看好了,这个东西,是HelloWorld的属性
private String word;
/**
* Constructor
*
* @param word
*/
public HelloWorld(String word) {
this.word = word;
}
private class Recorder implements Isayer {
@Override
public void say() {
// 打出 外部类的属性
System.out.println(word);
}
}
private class Recorder2 implements Isayer {
@Override
public void say() {
// 倒序打出外部类的属性
System.out.println(new StringBuffer(word).reverse().toString());
}
}
/**
* 这个方法,只是得到一个内部类对象
*
* @return
*/
public Isayer getSayer() {
return new Recorder();
}
public Isayer getReverseSayer() {
return new Recorder2();
}
}
写个类,测试一下:
package com.lippeng;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// 先创建一个对象
HelloWorld helloWorld = new HelloWorld("Hello World");
// 得到 接口:它的好处是,helloWorld对象完全可见
Isayer recorder = helloWorld.getSayer();
recorder.say();// 这里说出来的东西,来自 helloWorld 对象
// 只是这样,好处还不明显,看下面的
// 想说的是,同一个接口,同一个类内部,实现不同的功能
// 如果不是接口,是抽象类,也是一样的
Isayer reverseSayer = helloWorld.getReverseSayer();
reverseSayer.say();
}
}
要说的都在代码中,就不废话了。