接口是几天前看的了,内部类貌似也看了有三天了,趁着砖还没有烧好,我来写个流水账:
关于接口:
抽象版的抽象类,更加纯粹,用起来也很舒服。我不想在这罗列接口的特性啊、用法啊什么的,因为我实在记不住,个人始终觉得现在之所以搞出之么多高级编程语言,不过是为了想更接近人的思维方式,更接近世界的真实存在,更接近大自然的客观霍规律。因此,当你觉得在某个地方用某个东西看起来自然而和谐,那就基本以概率1收敛于正确。人法地,地法天,天法自然,在接口中定义一些常量的做法,或许就是这个道理。
关于内部类:
内部类名字起的不错,让工友听起来就很有食欲,然而这种内部类的具大作用却不是一口两口吃的消的。其实设计的精巧性,让人叹服,那种微小的变化却引起巨大的效应,化腐朽为神奇的力量让程序猿啼鸣不住啊。
创建一个内部类,很容易,用过类似javascript的动态语言的人,都很容易理解,觉得自然而然就是该这么作。然而,仔细考虑之后,却让人叹服:
1、与组合不同,内部类(非static时)只是其名字的作用域在实例化它的外部类的实例之中,而其生命周期却与外部类的实例无关;
2、与组合不同,内部类从实例化一开始就与外部类实例有了一种联系,这使得内部类实例可以自由的实例化它的外部类的实例的所有属性和方法,就好像拥有它们一样;
3、这种联系实际上就是在内部类实例化的时候偷偷地保存了实例化它的外部类实例的引用。下面是一个演示程序:
控制台的输出:
从演示中可以看到内部类的命名和它内部声明的一个变量final Outer Outer%Inner.this$0
4、对于精巧的.this和.new的设计使得这种联系完善起来。
关于内部类更多的精彩还是请大家看那些经典的书籍,关于内部类的强大可以想一想迭代器的实现,可以想想利用接口与内部类解决多继承的问题。另外java的反射机制让我们有机会看到内部类的全貌。
ps:第一次在技术论坛写文,欢迎拍砖。
关于接口:
抽象版的抽象类,更加纯粹,用起来也很舒服。我不想在这罗列接口的特性啊、用法啊什么的,因为我实在记不住,个人始终觉得现在之所以搞出之么多高级编程语言,不过是为了想更接近人的思维方式,更接近世界的真实存在,更接近大自然的客观霍规律。因此,当你觉得在某个地方用某个东西看起来自然而和谐,那就基本以概率1收敛于正确。人法地,地法天,天法自然,在接口中定义一些常量的做法,或许就是这个道理。
关于内部类:
内部类名字起的不错,让工友听起来就很有食欲,然而这种内部类的具大作用却不是一口两口吃的消的。其实设计的精巧性,让人叹服,那种微小的变化却引起巨大的效应,化腐朽为神奇的力量让程序猿啼鸣不住啊。
创建一个内部类,很容易,用过类似javascript的动态语言的人,都很容易理解,觉得自然而然就是该这么作。然而,仔细考虑之后,却让人叹服:
1、与组合不同,内部类(非static时)只是其名字的作用域在实例化它的外部类的实例之中,而其生命周期却与外部类的实例无关;
2、与组合不同,内部类从实例化一开始就与外部类实例有了一种联系,这使得内部类实例可以自由的实例化它的外部类的实例的所有属性和方法,就好像拥有它们一样;
3、这种联系实际上就是在内部类实例化的时候偷偷地保存了实例化它的外部类实例的引用。下面是一个演示程序:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
*
* @ClassName Outer
* @Description 展示内部类实例对外部类实例的访问权限
* @author BUPTLXB
* @TimeStamp 2012-7-7下午9:24:55
*/
public class Outer {
private String str1="I am a private.";
public String str2="I am public.";
protected String str3="I am protected";
private int var;
public Outer(){}
public Outer(int var){
this.var = var;
}
private class Inner{
public String dispaly(){
return str1 + "\n" + str2 + "\n" + str3 + "\n" + var;
}
}
public Inner inner(){
return new Inner();
}
public static void display(Object o){
System.out.println(o.getClass()+""+o.hashCode());
System.out.println("============methods============");
for(Method m : o.getClass().getDeclaredMethods()){
System.out.println(m);
}
System.out.println("==============================");
System.out.println("============fields============");
for(Field f : o.getClass().getDeclaredFields()){
System.out.println(f);
}
System.out.println("==============================");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer o1 = new Outer();
Outer.Inner i1 = o1.new Inner();
Outer.display(i1);
System.out.println(i1.dispaly());
Outer.Inner i2 = new Outer(1).new Inner();
Outer.display(i2);
System.out.println(i2.dispaly());
}
}
控制台的输出:
class Outer$Inner11383252
============methods============
public java.lang.String Outer$Inner.dispaly()
==============================
============fields============
final Outer Outer$Inner.this$0
==============================
I am a private.
I am public.
I am protected
0
class Outer$Inner23110255
============methods============
public java.lang.String Outer$Inner.dispaly()
==============================
============fields============
final Outer Outer$Inner.this$0
==============================
I am a private.
I am public.
I am protected
1
从演示中可以看到内部类的命名和它内部声明的一个变量final Outer Outer%Inner.this$0
4、对于精巧的.this和.new的设计使得这种联系完善起来。
关于内部类更多的精彩还是请大家看那些经典的书籍,关于内部类的强大可以想一想迭代器的实现,可以想想利用接口与内部类解决多继承的问题。另外java的反射机制让我们有机会看到内部类的全貌。
ps:第一次在技术论坛写文,欢迎拍砖。