- 浏览: 401064 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
junchao_qin:
[img][flash=200,200][url][img]引 ...
MyEclipse中使用VSS插件 -
tigerwood008:
IE11不好用!!
js弹出窗口 + 获取上传文件全路径 -
TheMatrix:
$.ajaxSetup({async : false});这种 ...
jquery 中的post和get方法如何同步 -
多多成长记:
Blazeds与java通信 -
ZED.CWT:
[align=ceiinter][/align]
java中利用JFrame创建窗体 【转】
匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
?只用到类的一个实例。
?类在定义后马上用到。
?类非常小(SUN推荐是在4行代码以下)
?给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
?匿名内部类不能有构造方法。
?匿名内部类不能定义任何静态成员、方法和类。
?匿名内部类不能是public,protected,private,static。
?只能创建匿名内部类的一个实例。
?一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
?因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。
java里没有多重继承,所以为了解决多重继承的问题,你可以在外围类里面实现很多接口,但是程序看起来并不美观,
那么内部类可以独立的继承一个接口,并且实现它,使用内部类实现了多重继承。
并且外围类不能多重继承类和抽象类,但是使用内部类可以在一个类内部多次继承类和抽象类。
内部类还可以多次实现同一个接口或者继承同一个类,但是实现方法不同,这是外部类不能实现的。
匿名内部类可以实现接口,也可以继承类么?
完全可以,看下边的例子,摘自Think in Java,The 2nd Edition.
先定义一个接口:
interface Contents {
int value();
}
再定义一个类(构造函数不是默认的):
public class Wrapping {
private int i;
public Wrapping(int x) { i = x; }
public int value() { return i; }
}
先实现接口:
public class Parcel6 {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() { return i; }
}; // Semicolon required in this case
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
}
再继承类:
public class Parcel7 {
public Wrapping wrap(int x) {
// Base constructor call:
return new Wrapping(x) {
public int value() {
return super.value() * 47;
}
}; // Semicolon required
}
public static void main(String[] args) {
Parcel7 p = new Parcel7();
Wrapping w = p.wrap(10);
}
}
下面的例子看起来有点奇怪:
//在方法中返回一个匿名内部类
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; }
};
这种奇怪的语法指的是:“创建一个继承自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 {
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 语句)。所以对于匿名类而言,实例初始化的实际效果就是构造器。当然它受到了限制:你不能重载实例初始化,所以你只能有一个构造器。
发表评论
-
判断二叉树是否平衡及计算二叉树深度和结点个数
2012-09-01 10:12 7657参考:http://blog.csdn.net/zz19880 ... -
【转】java实现二叉查找树
2012-08-31 09:44 1433转自:http://blog.csdn.net/zyj817 ... -
二叉树及其遍历
2012-08-21 09:50 1512转自:http://www.iteye.com/t ... -
java栈中缀表达式转为后缀表达式
2012-07-19 11:33 2418思路: 遇到数字,则输出。 遇到操作符,入栈,在入栈前若该 ... -
java栈实现括号匹配
2012-07-19 09:48 4508算法思想: 做一个空栈,读入字符。 若字符是左运算符,则入 ... -
【转】java静态变量和实例变量的区别
2012-06-20 11:02 1297转自:http://www.2cto.com/kf/20100 ... -
【转】java中会存在内存泄漏吗,请简单描述。
2012-06-20 10:24 1348java中 ... -
【转】java匿名内部类
2012-06-12 13:32 1386java匿名内部类 (2010-11 ... -
【转】JAVA中获取路径
2012-03-25 16:57 819转自:http://wenku.baidu.com/view/ ... -
【转】Map遍历
2012-03-25 16:56 910转自:http://wenku.baidu.com/view/ ... -
【转】java解析xml文件四种方式
2012-03-25 16:54 1327转自:http://wenku.baidu.com ... -
【转】JDOM解析处理xml
2012-03-25 16:52 1196转自http://qingbyqing.iteye.com/b ... -
【转】解析Html页面:HTML Parser的试用
2012-03-24 15:10 1368转自:http://blog.csdn.net/scud/ar ... -
【转】java随机排列数组
2012-02-20 18:58 2331转自:http://blog.csdn.net/liang ... -
设计模式——代理模式
2012-01-06 13:14 1236代理模式: 为其他对象提供一种代理以控制对这个对象的访问 ... -
设计模式——装饰模式
2012-01-05 15:58 1236首先介绍三个重要原则: 依赖倒转原则:高层模块不应该依赖于 ... -
设计模式——策略模式 & 单例模式
2011-12-29 16:26 1481策略模式: * 策略模式定义了算法家族,分别封装起来,让他 ... -
排序算法
2011-12-28 22:41 907参考:http://student.zjzk.cn/cours ... -
设计模式——简单工厂 VS 工厂方法
2011-12-28 15:07 1146简单工厂模式: 它最大优点在于工厂类中包含了必要的逻辑 ... -
String
2011-12-27 10:53 12291. String s = new String(" ...
相关推荐
java 匿名内部类的使用规范 java 匿名内部类的使用规范 java 匿名内部类的使用规范
16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名...
Java 匿名内部类的学习demo
java 成员内部类使用 内部匿名类 方法参数匿名类 方法匿名类
java中的匿名内部类总结
主要讲述了JAVA中内部类和匿名内部类的相关问题。
掌握java四中匿名内部类
这段代码实现了一个简单的线程池ExecutorService,其中使用了Java的匿名内部类。...这个简单的示例代码展示了如何使用Java匿名内部类来实现一个线程池的简单功能,方便了对多线程任务的管理和执行。
使用swift匿名内部类,实现jave匿名内部类功能,java中的匿名内部类,可以做到的是,就是想要重写一个类中的方法,并且执行,但是不想重新定义一个类,因为只调用一次,或者调用多次,但是每次调用的实现过程都不同,这时候就...
- 不同类型的内部类(静态内部类、成员内部类、局部内部类和匿名内部类)的区别和用法 - 内部类的优缺点以及使用场景 这些目标将帮助你理解和掌握内部类的概念,并能够在适当的时候使用内部类来解决问题...
java 内部类 实例内部类 局部内部类 匿名类 静态内部类 实例代码
浅析Java匿名内部类创建登录界面.pdf
170331-01.匿名内部类总结.java 170331-01.匿名内部类总结.java 匿名 内部类 总结 java
本文介绍内部类和匿名类在Java代码中是如何具体工作的,如何正确使用它们,以及如何避免一些常见的错误。 下面来看看这些特性具体是如何工作的? 1、非静态内部类 如果内部类没有指定static修饰符,拥有对...
主要介绍了Java匿名类,匿名内部类,结合实例形式分析了Java匿名类,匿名内部类相关原理、用法及操作注意事项,需要的朋友可以参考下
java所需要的匿名内部类,Android开发有所帮助。
Java特别篇--匿名对象与匿名内部类
匿名内部类核心重点知识讲解和经典例子讲解,匿名内部类一直都是很多最头疼的知识,那么到底什么是匿名内部类呢?这里就有答案,这里就带你学会,这里是知识的宝藏,期待你的挖掘
一个详细讲解JAVA_匿名内部类的例子 希望可以帮助到你。
1.接口-简介 2.接口-作用 3.接口-定义方式 4.接口-实现 5.接口-与抽象类之区别 6.接口-应用示例(设计模式) 7....内部类-匿名内部类 13.内部类-静态内部类 14.综述