普通内部类的字段与方法, 只能放在类的外部层次上,
所以普通的内部类不能有static数据和static字段,
也不能包含嵌套类。但是嵌套类可以包含所有这些东西
使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经
继承了某个(接口的)实现,对于内部类都没有影响。
情况1:
必须在一个类中以某种方式实现2个接口,由于接口的灵活性。有2中选择
使用单一类, 或者使用内部类。 interface A{}
interface B{} class X implements A, B{} class Y implements B{ B makesB(){ return new B(){}; } } public class MultiInterfaces{ static void takesA(A a){} static void takesB(B b){} public static void main(String[] args){ X x = new X(); Y y = new Y(); takesA(x); takesA(y); takesB(x); takesB(y.makeB()); } }
从实现的观点来看,上面的例子并没有区别,都能正常运作。
如果拥有的是抽象类和具体的类,而不是接口,那就只能使用内部类
才能实现多重继承。
class D{} abstract class E{} class Z extends D{ E makesE(){ return new E(){}; } } public class MultiImplementation{ static void takesD(D d){} static void takesE(E e){} public static void main(String[] args){ Z z = new Z(); takesD(z); takesE(z.makeE()); } }
如果使用内部类,还可以获得其他一些特性:
1 内部类可以有多个实例,每个实例都有自己的状态信息,并且与外围类
对象的信息相互独立。
2 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或
继承同一个类。
3 创建内部类对象的时刻并不依赖于外围类对象的创建。
4 内部类并没有令人迷惑的"is-a"关系,他就是一个独立的实体。
内部类与框架
public abstract class Event { private long eventTime; protected final long delayTime; public Event(long delayTime){ this.delayTime = delayTime; start(); } public void start(){ eventTime = System.nanoTime() + delayTime; } public boolean ready(){ return System.nanoTime() >= eventTime; } public abstract void action(); } public class Controller { private List<Event> eventList = new ArrayList<Event>(); public void addEvent(Event e){ eventList.add(e); } public void run(){ while(eventList.size() > 0){ for(Event e : new ArrayList<Event>(eventList)){ if(e.ready()){ System.out.println(e); e.action(); eventList.remove(e); } } } } }
注意: 在目前的设计中并不知道Event到底做了上面。这证是次设计的光剑所在,
使变化的食物与不变的食物互相分离. 用我的话说, 变化向量,就是各种
不同的Event对象所具有的不同行为,而你通过创建不同的Event子类来表现
不同的行为。
这正是内部类要做的事情,内部类允许:
1) 控制框架的完整实现是由单个的类创建的,从而使得实现的细节被
封装了起来。内部类用来表示解决问题所必须的各种不同的action()
2) 内部类能够狠容易地访问外围类的任意成员,所以可以避免这种实现
变得笨拙。
public class GreenhouseControls extends Controller{ private boolean light = false; public class LightOn extends Event{ public LightOn(long delayTime) { super(delayTime); } public void action() { light = true; } public String toString(){ return "Light is on"; } } public class LightOff extends Event{ public LightOff(long delayTime) { super(delayTime); } public void action() { light = false; } public String toString(){ return "Light is off"; } } private boolean water = false; public class WaterOn extends Event{ public WaterOn(long delayTime){ super(delayTime); } public void action() { water = true; } public String toString(){ return "Greenhouse water is on"; } } public class WaterOff extends Event{ public WaterOff(long delayTime){ super(delayTime); } public void action() { water = false; } public String toString(){ return "Greenhouse water is off"; } } public class Bell extends Event{ public Bell(long delayTime) { super(delayTime); } public void action() { // addEvent(new Bell(dealyTime)); } } public class Restart extends Event{ private Event[] eventList; public Restart(long delayTime, Event[] eventList) { super(delayTime); this.eventList = eventList; for(Event e : eventList){ addEvent(e); } } public void action() { for(Event e : eventList){ e.start(); addEvent(e); } start(); //记录当前时间+时延时间 addEvent(this); } public String toString(){ return "Restarting system"; } } }
发表评论
-
仿真[汽车制造]
2012-02-13 01:26 678class Car{ private final i ... -
线程例子[Condition, SignlAll, await]
2012-02-09 22:05 1020package concurrency.waxomati ... -
生产者消费者[简单示例]
2012-02-09 21:38 651class Meal{ private final ... -
泛型[创建类型实例]
2012-02-06 01:01 727public Class Erased<T> ... -
多路分发3
2012-02-05 23:16 813使用常量相关的方法 常量相关的方法允许我们为每个 ... -
多路分发2[使用enum分发]
2012-02-05 18:09 1895直接将RoShamBo1.java翻译为基于enum的版 ... -
多路分发
2012-02-05 02:06 1370多路分发 Number.plus(Number) ... -
使用Enum的自动贩卖机
2012-02-04 13:52 909public enum Input { NICKEL ... -
使用enum的责任链
2012-02-04 12:39 1167package enumerated; impor ... -
枚举类Enum,EnumSet,EnumMap
2012-02-04 02:00 1407EnumSet与HashSet相比,非常快。 p ... -
枚举类enum
2012-02-03 15:00 897一般来说,我们希望每个美剧实例能够返回对自身的描述, ... -
类的简化历[从内部类到匿名内部类]
2012-02-02 12:41 626Version1: public class DirL ... -
持有引用java.lang.ref 和 WeakHashMap
2012-02-02 01:27 973Thinking in java P554 持 ... -
Collections快速报错 fial-fast
2012-02-02 00:46 774{ public static void main( ... -
散列HashCode
2012-02-01 14:04 694散列的价值在于速度: 散列使得查询快速,由于瓶颈位于键 ... -
使用散列数据结构注意点
2012-02-01 01:32 582Goundhog自动继承基类Object,所以这里使用 ... -
Set注意点
2012-02-01 01:31 296如果我们尝试着将没有恰当支持不许的操作的类型用于需要这些 ... -
享元Map
2012-01-30 00:28 374这里之所以叫享元,注意static关键字。 定制了Entry ... -
深入容器Map
2012-01-19 15:12 391Map生成器 对Map的使用相同的方式,需要一 ... -
深入容器List
2012-01-19 14:40 339一种Generator解决方案: 所有Collect ...
相关推荐
在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...
内部类是Java编程语言中的一种特性,它允许我们在一个类的内部定义另一个类。这种设计模式在Android开发中尤其常见,因为它可以有效地管理代码和实现特定的功能。本文将详细探讨内部类、匿名内部类以及内部接口的...
在Java编程语言中,内部类和匿名内部类是两种特殊类型的类,它们为代码的组织和功能实现提供了独特的灵活性。本教程"Java4Android 35_内部类和匿名内部类"深入探讨了这两个概念,旨在帮助开发者更好地理解和运用它们...
内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...
Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存,在Android中,Handler对象通常会被用来在主线程(UI线程)中处理消息,以更新UI界面。当我们在Handler对象中使用匿名内部类...
本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...
Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...
首先,内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像其他成员变量一样,可以直接访问外部类的所有成员,包括私有成员。局部内部类只存在于某个方法内,它的作用范围更小,...
内部类主要分为四种类型:静态内部类、成员内部类、局部内部类和匿名内部类。 1. 静态内部类(Static Inner Class) 静态内部类与普通的类类似,只是它们定义在外部类中,并且前面带有 `static` 关键字。它们不会...
Java 嵌套类和内部类详解 Java 中的嵌套类和内部类是指在一个类的内部定义另一个类,这种类称为嵌套类(nested classes)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称...
内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态内部类。 成员内部类,就像它的名字一样,是类的一个成员,与字段和方法处于同一级别。它可以访问外部...
内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...
Java 中的匿名内部类总结 Java 中的匿名内部类是一种特殊的内部类,它没有名字,因此也称为匿名类。匿名内部类是一种简洁的编程方式,能够简化代码编写,但它也有一些限制和特点。 匿名内部类的定义 匿名内部类是...
本示例源码提供了关于内部类的全面理解,包括它的三种形式:成员内部类、局部内部类和匿名内部类,以及它们的实现方式和使用注意事项。 首先,我们来看成员内部类。成员内部类就像普通的类成员,可以是静态的或非...
内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。 成员内部类 成员内部类是定义在外部类的成员变量中的一种内部类。它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。成员内部...
内部类可以是静态的,也可以是非静态的,而匿名内部类则是一种没有名字的内部类,通常用于快速实现简单的回调或者接口实现。这篇总结将深入探讨匿名内部类的相关知识点。 1. **匿名内部类的概念** 匿名内部类是...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不定义单独类的情况下创建对象。这种类没有名字,通常用作一次性实现某个接口或继承某个类的需求。在Java编程中,匿名内部类主要用于事件处理、回调...
1.接口-简介 2.接口-作用 3.接口-定义方式 4.接口-实现 5.接口-与抽象类之区别 6.接口-应用示例(设计模式...内部类-局部内部类 12.内部类-匿名内部类 13.内部类-静态内部类 14.综述
在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能,如事件处理或接口快速实现。在Android开发中,匿名内部类的应用尤其广泛,因为Android框架中的许多组件(如按钮、文本...