`
tntxia
  • 浏览: 1510846 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于Java的内部匿名类(摘自Thinking in Java)

阅读更多

简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
  ·只用到类的一个实例。
  ·类在定义后马上用到。
  ·类非常小(SUN推荐是在4行代码以下)
  ·给类命名并不会导致你的代码更容易被理解。
  在使用匿名内部类时,要记住以下几个原则:
  ·匿名内部类不能有构造方法。
  ·匿名内部类不能定义任何静态成员、方法和类。
  ·匿名内部类不能是public,protected,private,static。
  ·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
  ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。



下面的例子看起来有点奇怪:
//在方法中返回一个匿名内部类
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).
}
}

分享到:
评论
1 楼 hrbjie 2010-07-19  
楼主的这个class Parcel6 类好像有点问题,Contents 类应该顶一个接口吧

相关推荐

    Thinking in C 英文版

    虽然提供的内容摘自《Thinking in C++ Volume 1, 2nd Edition》,但其核心理念和教学方法同样适用于C语言的学习。 本书的作者Bruce Eckel是MindView公司的总裁,他在编程教育领域有着深厚的专业背景。他的著作被...

    java数组函数(摘自JAVA编程思想)

    Java集合框架提供了一些工具类,如`ArrayList`,可以方便地将数组转换为集合,反之亦然。这样,我们就可以利用集合提供的更丰富的操作,如添加、删除元素。 通过`com.bruceeckel.util`包中的工具类,我们可以更加...

    Java集合类源码(摘自jr源码)

    这些类都是Java集合框架的重要组成部分,下面将逐一解析它们的核心概念和工作原理。 1. **ArrayList**:`ArrayList`是基于动态数组实现的列表,它允许在任何位置插入和删除元素。内部通过一个`Object[] elementData...

    java程序员必读基础篇 摘自南大百合精华篇

    本篇文章将根据“java程序员必读基础篇 摘自南大百合精华篇”的主题,深入探讨Java编程的核心概念,帮助读者构建扎实的Java知识体系。 1. **Java简介**:Java是由Sun Microsystems(后被Oracle收购)开发的一种面向...

    DB2Java存储过程.pdf

    本部分内容摘自 IBM Redbooks 出版的一份文档,详细介绍了如何在 DB2 中使用 Java 实现存储过程,并涵盖了跨平台实施的指导。 - **出版日期**:2000 年 9 月。 - **适用版本**:适用于 DB2 Universal Database (UDB...

    Java 11 / JDK 11 下载

    摘自:http://openjdk.java.net/projects/jdk/11/ 181: Nest-Based Access Control(基于嵌套的访问控制) 309: Dynamic Class-File Constants(动态的类文件常量) 315: Improve Aarch64 Intrinsics(改进 Aarch64 ...

    ZeroMQ(java)window库

    (摘自百度百科) ZMQ官方网址http://zeromq.org/ ZMQ本身只提供了C++版本的下载,如果在java里使用需要下载jzmq,需要自己编译,比较复杂。下载地址:https://github.com/zeromq/jzmq(右下角zip) 为了方便使用ZMQ...

    java 将excel里面的数字时间转化为准确的时间格式

    java 将excel里面的数字时间转化为准确的时间格式;具体来源有点忘记了,实现是摘自了开源代码里面的一段。

    java编程那些事

    java编程那些事-摘自陈跃峰的博客:http://blog.csdn.net/Mailbomb/

    Java_ClassAverage:用于计算多个输入的平均值的简单程序。 摘自“Java How To Program, 10e, Early Objects”——第 4 章

    在本例中,我们将会探讨Java中的类、对象、数据处理以及用户交互等核心概念。 1. **类与对象**: 在Java中,类是创建对象的蓝图,它定义了对象的属性(变量)和行为(方法)。Java_ClassAverage可能包含一个名为`...

    Java-OOP-Cameron:摘自Dane Cameron的书“软件工程师学习Java和面向对象的编程”

    OOP(面向对象编程)是Java的核心编程范式之一,它基于类和对象的概念,提供了封装、继承、多态等特性,使得代码更加模块化,易于理解和维护。Dane Cameron的书“软件工程师学习Java和面向对象的编程”深入浅出地...

    关于Java中的“==”与equals()

    最近在学习Java程序设计,学到“==”和Object类中的equals()方法的时候有点混乱。 上结论!!! “==”:用于判断二者是否同一,即二者的引用变量是否指向同一个对象。 Object.equals():用于判断二者是否相等,即...

    MiniJava-Compiler:用 Java 编写的编译器,用于编译称为 MiniJava 的指令子集

    摘自 MiniJava 项目的网站 ( ): MiniJava 是 Java 的一个子集。 MiniJava 程序的含义由其作为 Java 程序的含义给出。 MiniJava 中不允许重载。 MiniJava 语句 System.out.println( ... ); 只能打印整数。 MiniJava...

    书客编辑器安卓Java版 .zip

    其中摘自书客创作平台第130篇文章。阅读原文, 书客编辑器安卓Java版 - 体验版下载书客编辑器是一款基于Markdown标记语言的开源的富文本编辑器,它以简单的操作界面和强大的功能深受广大开发者的喜爱。正如官方所说...

    java_premier_for_testers:学习Java的资料库

    java For Testers源代码版权所有2013艾伦·理查森(Alan Richardson),《简编发展》关于Java源代码,以支持Alan Richardson所著的“ Java for Testers”一书。 这包含了本书的所有示例和练习答案。 本书的主要网站...

    gems:主要注释摘自Effective Java 3rd Edition,Java Concurrency in Practice和其他许多方面

    宝石 不应将其用作任何形式的官方参考。 仅在阅读了一些我认为应该随身携带的好书之后,才可以用作自己的备忘。 此回购仅是公开的,因为我认为很多人都可以将其用作摘要,但是,如果您想真正了解这些主题,请考虑...

    java-tutorials:Java 教程、编码挑战和问题

    java教程Java 教程、编码挑战和问题该项目包含一些简单的 Java 片段,摘自codingbat.com 我将其用作自学/测试来学习和刷新 Java 基础知识,同时强迫自己养成先编写单元测试的习惯编码蝙蝠在codingBat 站点( ) 中提供...

    Java_Interest:计算复利的简单程序。 演示一个 for 循环。 摘自“Java 如何编程,10,早期对象”——第 5 章

    在本项目"Java_Interest"中,我们关注的是利用Java编程语言来实现计算复利的简单程序。这个程序的核心在于理解和应用复利公式,以及掌握Java中的for循环结构。复利是金融领域的一个基本概念,它涉及到资金在一定时间...

    java外卖系统源码-citizen:该存储库用于展示优秀的Java软件公民的外观

    java外卖系统源码表中的内容 目标 这是一个很好的(在我看来)应用程序应该是什么样子的例子。 如何启动 (TODO) 使用 docker compose、docker 或 kubernetes。 mvn clean install 项目结构 按功能打包,而不是按层...

    java3d源码-lib-swe-common:SWE公共数据模型的完整Java实现

    java3d源码此存储库已于 2020 年 4 月 14 日存档。 请使用 任何新工作。 SWE 公共库 (lib-swe-common) 这个开源项目旨在构建一个 JAVA API 和 SWE(传感器网络启用)通用数据模型的实现,该模型可轻松用于访问和生成...

Global site tag (gtag.js) - Google Analytics