- 浏览: 542880 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
wenming6688:
垃圾。。。。。。
Java中的this和super[转] -
yingjianxuehun:
gszp852 写道请问下,服务器的字符编码在哪设置,我也遇到 ...
ognl.MethodFailedException: Method "setEndtime" failed for object -
zxjlwt:
有在osgi中用过吗?http://surenpi.com
no security manager: RMI class loader disabled -
samuce:
谢谢,终于找到问题结果!
taglib prefix="s" uri="/struts-tags" -
gszp852:
请问下,服务器的字符编码在哪设置,我也遇到了这个问题。不知道是 ...
ognl.MethodFailedException: Method "setEndtime" failed for object
简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
加上一条,如果传到匿名内部类的参数如果是被直接使用的,必须是final类型。
下面的例子看起来有点奇怪:
//在方法中返回一个匿名内部类
public class Parcel6 {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() {
return i;
}
}; // 在这里需要一个分号
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
}
cont()方法将下面两个动作合并在一起:返回值的生成,与表示这个返回值的类的定义!进一步说,这个类是匿名的,它没有名字。更糟的是,看起来是你正要创建一个Contents对象:
return new Contents()
但是,在到达语句结束的分号之前,你却说:“等一等,我想在这里插入一个类的定义”:
return new Contents() {
private int i = 11;
public int value() { return i; } [Page]
};
这种奇怪的语法指的是:“创建一个继承自Contents的匿名类的对象。”通过new 表达式返回的引用被自动向上转型为对Contents的引用。匿名内部类的语法是下面例子的简略形式:
class MyContents implements Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
在这个匿名内部类中,使用了缺省的构造器来生成Contents。下面的代码展示的是,如果你的基类需要一个有参数的构造器,应该怎么办:
public class Parcel7 {
public Wrapping wrap(int x) {
// Base constructor call:
return new Wrapping(x) { // Pass constructor argument.
public int value() {
return super.value() * 47;
}
}; // Semicolon required
}
public static void main(String[] args) {
Parcel7 p = new Parcel7();
Wrapping w = p.wrap(10);
}
}
只需简单地传递合适的参数给基类的构造器即可,这里是将x 传进new Wrapping(x)。在匿名内部类末尾的分号,并不是用来标记此内部类结束(C++中是那样)。实际上,它标记的是表达式的结束,只不过这个表达式正巧包含了内部类罢了。因此,这与别的地方使用的分号是一致的。
如果在匿名类中定义成员变量,你同样能够对其执行初始化操作:
public class Parcel8 {
// Argument must be final to use inside
// anonymous inner class:
public Destination dest(final String dest) {
return new Destination() {
private String label = dest;
public String readLabel() { return label; }
};
}
public static void main(String[] args) {
Parcel8 p = new Parcel8();
Destination d = p.dest(\"Tanzania\");
}
}
如果你有一个匿名内部类,它要使用一个在它的外部定义的对象,编译器会要求其参数引用是final 型的,就像dest()中的参数。如果你忘记了,会得到一个编译期错误信息。如果只是简单地给一个成员变量赋值,那么此例中的方法就可以了。但是,如果你想做一些类似构造器的行为,该怎么办呢?在匿名类中不可能有已命名的构造器(因为它根本没名字!),但通过实例初始化,你就能够达到为匿名内部类“制作”一个构造器的效果。像这样做:
abstract class Base { [Page]
public Base(int i) {
System.out.println(\"Base constructor, i = \" + i);
}
public abstract void f();
}
public class AnonymousConstructor {
public static Base getBase(int i) {
return new Base(i) {
{
System.out.println(\"Inside instance initializer\");
}
public void f() {
System.out.println(\"In anonymous f()\");
}
};
}
public static void main(String[] args) {
Base base = getBase(47);
base.f();
}
}
在此例中,不要求变量i 一定是final 的。因为i 被传递给匿名类的基类的构造器,它并不会在匿名类内部被直接使用。下例是带实例初始化的“parcel”形式。注意dest()的参数必须是final,因为它们是在匿名类内被使用的。
public class Parcel9 {
public Destinationdest(final String dest, final float price) {
return new Destination() {
private int cost;
// Instance initialization for each object:
{
cost = Math.round(price);
if(cost > 100)
System.out.println(\"Over budget!\");
}
private String label = dest;
public String readLabel() { return label; }
};
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest(\"Tanzania\", 101.395F);
}
}
在实例初始化的部分,你可以看到有一段代码,那原本是不能作为成员变量初始化的一部分而执行的(就是if 语句)。所以对于匿名类而言,实例初始化的实际效果就是构造器。当然它受到了限制:你不能重载实例初始化,所以你只能有一个构造器。
发表评论
-
深入探讨Java类型提升的约定[转]
2010-09-30 10:28 967转: http://doc.chinaunix.net ... -
java 条件表达式(即三元操作符)的陷阱[转]
2010-09-30 10:22 8418转: http://apps.hi.baidu.com/s ... -
response的 encodeUrl方法的使用[转]
2010-09-29 11:17 1363转自 :http://edu.codepub.com/2009 ... -
java序列化的作用[转]
2010-09-20 11:31 1171转: http://hi.baidu.com/springwu ... -
java transient简介[转]
2010-09-20 11:22 1422转:http://blog.csdn.net/zxl315 ... -
Collection和Collections的区别[转]
2010-09-17 15:37 1455转: http://hanhongke123.blog.163 ... -
HashMap和HashTable的区别[转]
2010-09-17 15:24 1054转: Hashtable和HashMap类有三个重要的不同 ... -
Java 中Vector、ArrayList和LinkedList 的区别[转]
2010-09-17 14:43 1600转:http://pterodactyl.iteye.com/ ... -
Java中ArrayList和LinkedList区别[转]
2010-09-17 12:01 1112转:http://pengcqu.iteye.com/bl ... -
String 中的split()[转]
2010-09-12 22:38 649转:http://www.iteye.com/topic/32 ... -
Java中的this和super[转]
2010-09-09 16:41 1234转自:http://student.csdn.ne ... -
java继承容易犯的错误[转]
2010-09-09 09:32 1061在网上看见一个关于java ... -
Java内部类与匿名内部类
2010-09-08 15:19 972定义在类中方法之外的内部类分为实例内部类和静态内部 ... -
javap的使用
2010-09-08 14:48 1203javap是jdk自带的一个工具,可以反编译,也可以查看jav ... -
Java内部类
2010-09-05 17:32 1410在一个类内部定义类,这就是嵌套类(nested classes ... -
java 静态块 非静态块
2010-08-22 16:41 1878转自:http://blog.sina.com.cn/s/bl ... -
java static
2010-08-22 16:20 998请先看下面这段程序:public class Hello{ p ... -
JNDI API
2010-08-20 14:40 1078JNDI API由5个包组成: 1、Javax.nami ... -
理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc/datas
2010-08-20 14:34 972http://futureinhands.iteye.com/ ... -
InitialContext 和 Context 的区别
2010-08-20 11:33 1534Context是接口,InitialContext是这个接口的 ...
相关推荐
thinking in java 3th
《Thinking in Java》是Bruce Eckel的经典编程教材,第三版主要涵盖了Java编程语言的核心概念和技术。这本书深入浅出地介绍了面向对象编程的思想,是初学者和有经验的程序员理解Java的宝贵资源。以下是对该书内容的...
《Thinking in Java 3rd Edition中文版》是Java编程领域中一本备受推崇的教程,尤其适合初学者和有一定基础的开发者。这本书由Bruce Eckel撰写,深入浅出地讲解了Java语言的核心概念和技术,旨在帮助读者理解Java的...
Thinking in Java 3th Edition
thinking in java 3th 中文
《Thinking in Java》的中文翻译版本,第三版,了解Java的人应该都知道这本书的好,话不多说,看了就知道。附上习题答案,很完整的一个版本。
《Thinking in Java 3th》是一本经典的Java编程教材,由Bruce Eckel撰写,被誉为学习Java的必备之作。这本书深入浅出地介绍了Java语言的核心概念和技术,为读者提供了全面而深入的理解。书中不仅包含了基础语法,还...
本书作者有多年的教学经验,对C、C++、Java语言都有独到、深入的理解。因此他非常了解如何教授Java语言这门课程,也非常明白语言教学中的难点及人们的困惑。作者以通俗易懂及小而直接的示例解释了一个个晦涩抽象的...
教程\java\Thinking in Java 3th Edition.pdf
《Thinking in Java》是Bruce Eckel的经典编程教材,它涵盖了Java语言的核心概念和技术,深受程序员和初学者喜爱。这本书分为第三版和第四版,每个版本都有其独特的知识点和更新内容。 第三版是针对Java 2 Platform...
thinking in java 3th 汉语版,pdf 格式字迹,是Java编程人员不可缺少的必读资料
Thinking in Java 3th Edition习题及答案