- 浏览: 1506917 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (595)
- Java咖啡厅 (208)
- IT杂侃 (23)
- 程序员笑话 (7)
- 我的后现代文学 (1)
- WEB编程 (116)
- 软件评测 (8)
- 操作系统 (3)
- 炫目Ruby (2)
- 行业知识 (7)
- 我的动漫情结 (6)
- 其他 (8)
- Window DIY (6)
- 古文学 (3)
- 转载文章 (2)
- IT百科 (7)
- 动态网页Active (1)
- 文档 (1)
- 设计理论 (11)
- .NET 快速开发 (18)
- 英语学习 (6)
- 网站分析 (2)
- 开源软件 (4)
- 数据库 (28)
- 笔记 (4)
- 源代码共享 (8)
- IT人物 (2)
- 软件管理 (10)
- 小说创作 (0)
- 大众软件 (12)
- 网站评论 (3)
- 小虾乱说 (10)
- 游戏 (8)
- 心情 (3)
- 娱乐休闲 (2)
- Delphi编程 (1)
- PHP编程 (4)
- 中间件 (2)
- 移动开发 (2)
- Office应用 (2)
- Photoshop (1)
- Eclipse (5)
- 面试题 (1)
- 手机评测 (0)
- VBScript (1)
- WEB前端-EXT (3)
- 吐槽 (1)
- Java咖啡厅 Ibatis (1)
- javascript Ext (1)
- jquery ui (1)
- require (1)
- WEB编程 Javascript (1)
- jquery (1)
- Swing (1)
- 分布式 (1)
最新评论
-
zhangjihao:
28. 下面哪个Set是排序的? A. LinkedHas ...
Java面试题(选择题) -
zhangthe9:
ICMP报文被封装在IP包里,也就是说他是由IP协议承载的,从 ...
Java面试题(选择题) -
zhunengfei:
真的假的?
自已写的jquery ui框架 -
white_crucifix:
少年,发烫是所有智能手机的特点,而莫名发烫是所有安卓手机的特点 ...
【吐槽】三星手机的OS是一砣屎 -
suzu88:
试了一下,可以用。如果美化一下控件和窗体更有意思。
一个用XML构建Swing视图的框架
内部匿名类是一个很特殊的内部类,一般只有做GUI的人都会经常涉及到他
存在它的原因是:
1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。
2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。
3.匿名内部类可以很方便的定义回调。
4.使用内部类可以非常方便的编写事件驱动程序。
其实它真正的目的仅仅为了定义回调--进一步就是事件驱动。
接口和回调:编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。
匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。
这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子:
public class A { int i = 1; public A() { Thread thread = new Thread() { public void run() { for(;;) { A.this.run(); try { sleep(1000); } catch(InterruptedException ie) { } } } }; thread.start(); } public void run() { System.out.println("i = " + i); i++; } public static void main(String[] args) throws Exception { new A(); } }
在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。
这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的
。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。
对于这个例子:
this.test(new Inner(){ public void method1(){ System.out.print("1111"); } public void method2(){ System.out.print("22222"); } });
这个时候调用test()方法,那Inner类的method1和method2是什么时候被调用的?难道也是this对象向他们发消息(比如传入一个参数)吗?还是直接显式的调用??
对于Inner类,除了this这个类,就是this.test(...那句中的this,它能够调用Inner类的方法,其他地方都不行,然而,这也需要你在类中有个地方保存有对这个内部类实例的引用才可以。再说明一次,内部类是用来在某个时刻调用外面的方法而存在的--这就是回调。
为了说明内部类实例的方法只能在包容类的实例中调用,其他地方无法调用,给个例子如下:
JAVA2实用教程源码:
/** 一个应用程序,用来演示内部类的使用 */ /** 类Outer */ class Outer{ private static int size; /** 内部类Inner的声明 */ public class Inner{ private int size; /** 方法doStuff() */ public void doStuff(int size){ size++; //存取局部变量 this.size++; //存取其内部类的成员变量 Outer.this.size++; //存取其外部类的成员变量 System.out.println(size+" "+this.size+" "+Outer.this.size); } }//内部类Inner结束 /** 类Outer中定义的实例方法testInner()方法 */ public void testInner(){ Inner i=new Inner(); i.doStuff(5); } /** main()方法 */ public static void main(String[] a){ Outer o=new Outer(); o.testInner(); } }//类Outer结束
那么,如何使用内部类,匿名类实现事件处理呢?
JAVA---事件适配器
1.事件适配器--EventAdapter
下例中采用了鼠标适配器:
import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdaper{ public void mouseClicked(MouseEvent e) //只实现需要的方法 { ……} }
java.awt.event包中定义的事件适配器类包括以下几个:
1.ComponentAdapter( 组件适配器)
2.ContainerAdapter( 容器适配器)
3.FocusAdapter( 焦点适配器)
4.KeyAdapter( 键盘适配器)
5.MouseAdapter( 鼠标适配器)
6.MouseMotionAdapter( 鼠标运动适配器)
7.WindowAdapter( 窗口适配器)
2. 用内部类实现事件处理
内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于:
◇ 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。
◇ 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。
◇ 编写事件驱动程序,内部类很方便。
因此内部类所能够应用的地方往往是在AWT的事件处理机制中。
例5.11
import java.awt.* ; import java.awt.event.*; public class InnerClass{ private Frame f; private TextField tf; public InnerClass(){ f=new Frame("Inner classes example"); tf=new TextField(30); } public voidi launchFrame(){ Label label=new Label("Click and drag the mouse"); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MyMouseMotionListener());/*参数为内部类对象*/ f.setSize(300,200); f.setVisible(true); } class MyMouseMotionListener extends MouseMotionAdapter{ /*内部类开始*/ public void mouseDragged(MouseEvent e) { String s="Mouse dragging: x="+e.getX()+"Y="+e.getY(); tf.setText(s); } } ; public static void main(String args[]) { InnerClass obj=new InnerClass(); obj.launchFrame(); } }//内部类结束 }
3.匿名类(Anonymous Class)
当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父
类的构造方法,并且重写父类的方法。所谓的匿名就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法。
例5.12
import java.awt.* ; import java.awt.event.*; public class AnonymousClass{ private Frame f; private TextField tf; public AnonymousClass(){ f=new Frame("Inner classes example"); tf=new TextField(30); } public void launchFrame(){ Label label=new Label("Click and drag the mouse"); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MouseMotionAdapter(){ //匿名类开始 public void mouseDragged(MouseEvent e){ String s="Mouse dragging: x="+e.getX()+"Y="+e.getY(); tf.setText(s); } } ); //匿名类结束 f.setSize(300,200); f.setVisible(true); } public static void main(String args[]) { AnonymousClass obj=new AnonymousClass(); obj.launchFrame(); } }
其实仔细分析,例5.11和5.12实现的都是完全一样的功能,只不过采取的方式不同。5.11中的事件处理类是一个内部类,而5.12的事件处理类是匿名类,可以说从类的关系来说是越来越不清楚,但
是程序也越来越简练。熟悉这两种方式也十分有助于编写图形界面的程序。
亲自在IDE中实践一下,会理解的更深切一点。
发表评论
-
原创程序- Web版数据库管理
2017-11-15 00:39 1177这是我自已写的Web版的数据库管理工具,主要是依赖于JDBC ... -
Eclipse创建Web项目
2017-07-29 10:53 7751. 打开创建Web项目的对话框 2 ... -
Ant常用的命令
2016-06-16 13:31 13481. 使用Ant生成War包: <war ... -
在Eclipse上使用Ant发布项目
2015-10-17 15:03 1370这里笔者使用是Eclip ... -
Resin中增加一个虚拟目录的方法
2015-09-13 12:53 1113打开resin.config 找到到<h ... -
一个用XML构建Swing视图的框架
2015-09-06 23:12 2600平常想用Java写一些 ... -
Eclipse常见问题
2015-08-24 19:41 738如果Eclipse被强制关闭时,Tomcat可能没有 ... -
Spring Tools Suite 入门教程
2015-05-09 09:15 0Spring Tools Suit,这里简称STS,是 ... -
使用FTP的方法
2015-03-01 17:49 9991. FlashFXP 收费的软件,但是比较好 ... -
关于Spring
2015-02-16 14:46 1998Spring是一个轻量级J2EE框架。 Sp ... -
用Java实现发送邮件到163
2014-12-28 14:50 3851/* 在java版经常看到有人问如何用javamai ... -
Hibernate入门
2014-12-27 01:34 925前言 使用面向对象的语言和关系型的数据库,开 ... -
修改date.toLocaleString()的警告
2014-10-15 11:31 2546我们在写程序的时候,经常要查看时间,所以我们经常会用到 ... -
Java基础题 -- 简述题
2014-04-26 13:44 726(1)简述Java的运行机制 答案:Java语言根 ... -
Java基础题 -- 填空题
2014-04-26 10:00 18851. ______是一个抽象的计算机,和实际的计算机一样, ... -
FreeMaker入门
2014-04-07 19:51 1010第一章 简介 1 什么是FreeMaker ... -
jdk8 新语法
2014-04-01 23:32 1279import java.util.*; public ... -
MyBatis 入门
2014-03-27 23:31 1721每个MyBatis的中心是SqlSessionFact ... -
Jetty入门
2014-02-26 23:48 1577Jetty是一个简易的WebServer框架,使用 ... -
用Swing做的H2管理器
2014-02-24 23:07 1566MainFrame 继承了 JFrame , 增加c ...
相关推荐
2. **内部匿名类**:内部匿名类没有名字,通常用于创建一次性使用的类。它们常用于实现接口或继承一个类,特别是在事件处理、回调机制和简短的辅助类中。创建匿名内部类的方式是在实例化类时直接定义类的实现,不...
Java 中的匿名内部类是一种特殊的内部类,它没有名字,因此也称为匿名类。匿名内部类是一种简洁的编程方式,能够简化代码编写,但它也有一些限制和特点。 匿名内部类的定义 匿名内部类是指没有名字的内部类,它是...
匿名内部类是一种没有名字的内部类,它常用于实现接口或者继承一个类,并且只需要一次使用的情况。其基本语法形式如下: ```java new ParentClass() { @Override public void method() { // 实现代码 } }; ``` ...
内部类可以是静态的,也可以是非静态的,而匿名内部类则是一种没有名字的内部类,通常用于快速实现简单的回调或者接口实现。这篇总结将深入探讨匿名内部类的相关知识点。 1. **匿名内部类的概念** 匿名内部类是...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不定义单独类的情况下创建对象。这种类没有名字,通常用作一次性实现某个接口或继承某个类的需求。在Java编程中,匿名内部类主要用于事件处理、回调...
在Java编程语言中,匿名类、内部类和本地类是三种特殊的类定义方式,它们各自具有独特的特性和用途。下面将详细解读这三者之间的差异,并通过实例来帮助理解。 首先,**匿名类**是在没有类名的情况下创建的类,通常...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...
匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在需要的地方直接定义一个类的实例,而无需声明一个独立的类。这种类没有名字,通常用于实现接口或者继承抽象类,尤其在事件处理、回调函数以及创建一次...
在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能,如事件处理或接口快速实现。在Android开发中,匿名内部类的应用尤其广泛,因为Android框架中的许多组件(如按钮、文本...
总结一下,内部类、匿名内部类和内部接口在Java编程中提供了一种强大的工具,它们可以帮助我们更好地组织代码,实现封装和模块化。在Android开发中,它们常用于事件监听、线程管理、回调函数等场景,增强了代码的...
在Android开发中,匿名内部类是一种常见的编程技巧,它允许我们快速实现事件监听功能,而无需定义单独的类。本文将深入探讨如何使用匿名内部类作为事件监听类,以及其在Android开发中的应用。 首先,我们需要理解...
Java内部类是Java语言特性中一个独特而强大的部分,它允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java中的...
内部类的一个主要应用场景是创建与外部类密切相关的辅助类,比如在清单B中,`LinkedList`类的内部定义了`Node`类,这使得`Node`类的逻辑更加封装,仅在`LinkedList`内部使用,提高了代码的可读性和可维护性。内部类...
在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能。在标题“发两个匿名内部类使用的例子”中,我们将会探讨两种不同的场景,如何利用匿名内部类来解决问题。这篇博客文章的...
匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在定义类的同时不为它提供名字。这种类主要用于创建一次性使用的对象,特别是在需要实现某个接口或者继承某个类的场合,而无需创建独立的文件来定义这个...
匿名类是没有名称的内部类,它们只能使用一次。匿名类通常用来实现一些简单的接口或抽象类。例如,我们可以使用匿名类来实现 ActionListener 接口: ```java button.addActionListener(new ActionListener() { ...
匿名内部类是Java中的一种特殊类,它没有名称,可以直接实例化,并且可以继承一个类或实现一个(多个)接口。在接口回调的场景下,我们可以使用匿名内部类快速地创建一个实现了接口的实例,而无需定义一个新的类。...
16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名...
内部类可以封装复杂逻辑,提供更好的数据隐藏,而匿名内部类则简化了实现接口或继承类的流程,特别是在需要一次性实现简单功能时。在实际编程中,灵活运用这两种类可以提高代码的可读性和可维护性,降低开发成本。