接口是几天前看的了,内部类貌似也看了有三天了,趁着砖还没有烧好,我来写个流水账:
关于接口:
抽象版的抽象类,更加纯粹,用起来也很舒服。我不想在这罗列接口的特性啊、用法啊什么的,因为我实在记不住,个人始终觉得现在之所以搞出之么多高级编程语言,不过是为了想更接近人的思维方式,更接近世界的真实存在,更接近大自然的客观霍规律。因此,当你觉得在某个地方用某个东西看起来自然而和谐,那就基本以概率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:第一次在技术论坛写文,欢迎拍砖。
分享到:
相关推荐
Java语言中的内部类根据定义的位置和访问权限可以分为四类:成员...匿名内部类是没有命名的内部类,通常用于实现接口或继承父类;静态内部类是定义在类的内部且与类的实例无关的类。以上是对内部类的简要分类和认识。
- 匿名内部类通常用于简洁地实现一个接口或继承一个类,常用于事件监听器或回调函数的定义。 内部类的应用场景广泛,如在设计模式中的单例模式、工厂模式,以及Swing组件的事件处理等。它们提供了更灵活的封装和...
Java编程语言以其面向对象特性,包括接口、继承、多态性等核心概念,为开发者提供了强大的设计和实现能力。在本实例中,我们将探讨这些关键概念,并通过具体代码示例来展示它们的实际应用。 首先,**接口...
匿名内部类必须继承一个父类或实现一个接口。 ##### 格式 ```java new 父类或者接口() { /* 执行代码 */ }; ``` ##### 示例 ```java class Outer { public void print() { new Runnable() { // 匿名内部类实现...
- 内部类可以继承其他类或实现接口,这为实现复杂的继承结构提供了可能。 3. **子类与父类的内部类同名** - 如果子类和父类都有内部类同名的情况,子类的内部类会覆盖父类的内部类,访问时需明确指出是父类的内部...
- 内部类可以继承抽象类或实现接口,这使得内部类可以作为实现复杂逻辑或功能的工具。 10. **内部类与事件处理**: - 在GUI编程中,内部类常用于实现事件监听器,如按钮点击事件的处理,通过匿名内部类简化代码。...
是个很麻烦,很纠结的问题 内部类基本语法 内部类继承 子类与父类的内部类同名 匿名类 内部接口及接口中的内部类 内部类的类文件 为什么需要内部类--内部类用途
- **匿名内部类**:没有名字的内部类,通常用于实现接口或继承类时简化代码,主要应用在事件监听器等场景。 #### 二、内部类的创建与使用 1. **成员内部类的创建**: - 创建成员内部类的对象时,需要先创建外部类...
接口则强调对象间的交互协议,允许类实现多个接口达到多继承效果;内部类则提供了一种更灵活的封装机制,可以用来解决复杂的设计问题。在实际编程中,开发者应根据需求选择合适的设计模式,合理利用这些特性。
- **接口多重继承**:对于接口类(纯虚函数类),多重继承是一种合理且常见的使用方式。 - **深入理解多重继承的工作原理**:掌握多重继承的底层实现机制,有助于更好地处理复杂情况。 #### 三、内部类机制及其应用...
- 内部类可以继承其他类或者实现接口。 - 在内部类中实现接口时,可以使用接口方法来实现具体的功能。 6. 内部类的访问权限:内部类可以使用private、protected、public等访问修饰符来限制其访问权限。 7. 匿名...
- 接口支持多重继承,一个类可以实现多个接口,从而支持多种行为规范的组合。 - **基本功能是否稳定**: - 如果基本功能相对稳定,变化不大,使用接口更为合适。 - 如果基本功能经常变动,使用抽象类更有利于管理...
- 一个接口定义了若干方法,然后有两个或更多类实现这个接口,显示接口如何用于规范不同类的行为。 - 使用内部类的场景,如一个外部类定义了一个成员内部类,用于处理特定的逻辑,这可能是一个事件处理器或某种辅助...
- 可以直接继承一个类或实现一个接口,其定义包含在单个方法或表达式中。 5. **内部类与多线程**: - 内部类可以作为线程的实现,提供了一种实现并发执行的方法。 - 每个内部类对象都可以拥有自己的独立线程,...
- 创建匿名内部类时,必须继承一个父类或实现一个接口。 - **示例**: ```java Runnable r = new Runnable() { @Override public void run() { // 实现run方法 } }; ``` #### 三、总结 内部类提供了强大的...
- **实现多态**:内部类可以实现接口,从而创建多重继承的效果,尽管Java不支持类的多继承。 - **作为回调机制**:内部类常用于实现事件监听器等回调机制,因为它们可以轻松地访问外部类的成员。 3. **示例解析**...