前端时间在写.net项目中,一直错将.cs里的两个class当作内部类,原来是一个文件里的两个类而已,这让我想起了Java中的内部类,比较内部类,那么还有两个类,那就是匿名类和匿名内部类。今天我想就Java中的这三种类进行个比较。

我们知道在Java语言规范中可以做很多事,例如一个类或一个接口中可以声明一个类或接口,在一个方法中可以声明一个类,类与接口声明可以嵌套任意深度等。

匿名类:

1、new <类或接口><类的主体>,匿名类的声明是在编译时进行的,实例化是在运行时进行的,所以在for循环中一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。

2、如果要执行的对象需要一个对象,但却不值得创建全新的对象(可能是因为该对象只在一个方法内部使用),在这个时候使用匿名类就会非常合适,所以说,匿名类一般会在swing程序中快速创建事件处理程序。

Java代码  

  1. firstButton.addActionListener(new ActionListener() {
  2. @Override
  3. public void actionPerformed(ActionEvent e) {
  4. getTxtValue().setText("第一个按钮触发的事件!");
  5. }
  6. });

3、从技术上说,匿名类可以被看作非静态的内部类,所以他们具有方法内部声明的非静态内部类相同的权限和限制。

内部类:

内部类顾名思义就是在一个类的内部还有一个类

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class InnerClassDemo {
  8. public static void main(String[] args) {
  9. new Outer().fun();
  10. }
  11. }
  12. class Outer {
  13. private String name = "Hello 内部类";
  14. class Inner {
  15. public void print() {
  16. System.out.println("name = " + name);
  17. }
  18. };
  19. public void fun() {
  20. new Inner().print();
  21. }
  22. }

内部类生成的.class文件名为:Outer$Inner.class,从上面的结构发现内部类的的缺点是“结构非常的混乱”。

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class InnerClassDemo02 {
  8. public static void main(String[] args) {
  9. new Outer02().fun();
  10. }
  11. }
  12. class Outer02 {
  13. private String name = "Hello 内部类";
  14. public void fun() {
  15. new Inner02(this).print();
  16. }
  17. public String getName() {
  18. return this.name;
  19. }
  20. };
  21. class Inner02 {
  22. private Outer02 out;
  23. public Inner02(Outer02 out) {
  24. this.out = out;
  25. }
  26. public void print() {
  27. System.out.println("name = " + this.out.getName());
  28. }
  29. };

从上可以看出内部类的优点是“可以方便的访问外部类中的私有成员”;

如果要在外部直接使用内部类的实例化对象:

外部类.内部类 内部类对象 = 外部类实例.new 内部类实例();

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang  2012-1-11
  4. *
  5. *  Email:xdwangiflytek@gmail.com
  6. */
  7. public class InnerClassDemo03 {
  8. public static void main(String[] args) {
  9. Outer03 out = new Outer03();//外部类实例
  10. Outer03.Inner inner = out.new Inner();//实例化内部类对象
  11. inner.print();
  12. }
  13. }
  14. class Outer03{
  15. private String name = "Hello 内部类";
  16. class Inner {
  17. public void print() {
  18. System.out.println("name = " + name);
  19. }
  20. }
  21. }

一个内部类如果使用static关键字声明的话,则此内部类就将成为外部类,可以直接通过外部类.内部类的形式访问

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class InnerClassDemo04 {
  8. public static void main(String[] args) {
  9. Outer04.Inner inner = new Outer04.Inner();// 实例化内部类对象
  10. inner.print();
  11. }
  12. }
  13. class Outer04 {
  14. private static String name = "Hello 内部类";
  15. static class Inner {
  16. public void print() {
  17. System.out.println("name = " + name);
  18. }
  19. }
  20. }

内部类可以在任意的地方使用,例如方法中声明

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class InnerClassDemo05 {
  8. public static void main(String[] args) {
  9. new Outer05().fun();
  10. }
  11. }
  12. class Outer05 {
  13. private static String name = "Hello 内部类";
  14. public void fun() {
  15. class Inner {
  16. public void print() {
  17. System.out.println("name = " + name);
  18. }
  19. }
  20. new Inner().print();
  21. }
  22. }

在方法中定义的内部类,可以直接访问外部类中的各个成员,但是如果要访问方法中的参数,则需要在参数上加上final关键字声明;

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class InnerClassDemo06 {
  8. public static void main(String[] args) {
  9. new Outer06().fun(20);
  10. }
  11. }
  12. class Outer06 {
  13. private static String name = "Hello 内部类";
  14. public void fun(final int temp) {
  15. class Inner {
  16. public void print() {
  17. System.out.println("temp = " + temp);
  18. System.out.println("name = " + name);
  19. }
  20. }
  21. new Inner().print();
  22. }
  23. }

匿名类与内部的联系与区别:

按所在位置可以分为两大类:

1、在类的方法中

特点:

a、可以访问宿主类的所有元素 ;

b、保存宿主类对象的引用,创建对象时必须有宿主类对象;

c、 不能有静态数据;

继续划分:

A、本地内部类;

B、匿名内部类

两者的区别在于本地内部类有构造方法,而匿名内部类只能实例初始化;

2、在类或接口作用域中;

继续划分:

A、普通内部类

B、静态内部类

匿名内部类:

匿名内部类是在抽象类和接口的基础之上发展起来的。

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class NoNameClass01 {
  8. public static void main(String[] args) {
  9. new X().fun2();
  10. }
  11. }
  12. interface A {
  13. public void fun();
  14. }
  15. class B implements A {
  16. public void fun() {
  17. System.out.println("Hello 准备匿名内部类");
  18. }
  19. }
  20. class X {
  21. public void fun1(A a) {
  22. a.fun();
  23. }
  24. public void fun2() {
  25. this.fun1(new B());
  26. }
  27. }

通过上面的Demo,如果现在假设B类只使用一次,那么还有必要将其定义成一个单独的类么?

呵呵,此时就可以使用匿名内部类:

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class NoNameClass02 {
  8. public static void main(String[] args) {
  9. new XX().fun2();
  10. }
  11. }
  12. interface AA {
  13. public void fun();
  14. }
  15. class XX {
  16. public void fun1(AA a) {
  17. a.fun();
  18. }
  19. public void fun2() {
  20. this.fun1(new AA() {
  21. public void fun() {
  22. System.out.println("Hello 准备匿名内部类");
  23. }
  24. });
  25. }
  26. }

其实在真正的项目开发中匿名内部类使用的非常之少,一般在Java的图形界面和现在的Android中使用的比较多点。

最后给一个内部类实现的简单链表:

Java代码  

  1. package com.iflytek.innerclass;
  2. /**
  3. * @author xudongwang 2012-1-11
  4. *
  5. *         Email:xdwangiflytek@gmail.com
  6. */
  7. public class LinkDemo {
  8. public static void main(String args[]) {
  9. Link link = new Link();
  10. link.add("A");
  11. link.add("B");
  12. link.add("C");
  13. link.add("D");
  14. link.add("E");
  15. link.print();
  16. }
  17. };
  18. class Link {
  19. class Node {
  20. private String name;
  21. private Node next; // 单向链表,每个节点指向下一个节点
  22. public Node(String name) {
  23. this.name = name; // 通过构造方法为name属性赋值
  24. }
  25. public void addNode(Node newNode) { // 增加节点
  26. if (this.next == null) {
  27. this.next = newNode; // 保存节点
  28. else {
  29. this.next.addNode(newNode); // 继续向下查找
  30. }
  31. }
  32. public void printNode() { // 输出节点
  33. System.out.println(this.name);
  34. if (this.next != null) { // 此节点之后还存在其他的节点
  35. this.next.printNode();
  36. }
  37. }
  38. };
  39. private Node root; // 链表的头
  40. public void add(String name) { // 增加节点
  41. Node newNode = new Node(name); // 定义一个新的节点
  42. /*
  43. * 如果是第一个节点,则肯定是根节点, 如果是第二个节点,则肯定放在根节点next中 如果是第三个节点,则肯定放在第二个节点的next中
  44. */
  45. if (this.root == null) {
  46. this.root = newNode; // 将第一个节点设置成根节点
  47. else {
  48. // 肯定要放在最后一个节点之后
  49. // 通过节点.next来不断的判断
  50. this.root.addNode(newNode);
  51. }
  52. }
  53. public void print() {
  54. if (this.root != null) { // 如果根节点为空了,则没有任何内容
  55. this.root.printNode();
  56. }
  57. }
  58. };

匿名类、内部类、匿名内部类相关推荐

  1. android什么叫匿名内部类,Android里面的匿名类与匿名内部类使用

    在android开发中经常碰到匿名类(和匿名内部类)的使用,那么匿名类和一般情况下使用的类有什么不同, 从实现的功能来讲是一样的,但是使用匿名更加简洁方便,形式上有点像new一个接口或类的感觉,但是我 ...

  2. 【java笔记】Java中的匿名类和匿名内部类

    匿名类和匿名内部类 匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类.其语法形式如下: new <类或接口>() {// 类的主体 }; 匿名类有两种实现方式: 继承一个 ...

  3. 1.18 Java匿名类,匿名内部类

    匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类.其语法形式如下: new <类或接口>() {// 类的主体 }; 这种形式的 new 语句声明一个新的匿名类,它对一个 ...

  4. java 内部匿名类_java匿名类和匿名内部类详解

    匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类.其语法形式如下:new() { //类的主体 }; 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一 ...

  5. java 抽象类的匿名类_Java匿名内部类(通过继承抽象类来实现)

    3. 匿名内部类 没有名字的内部类就是匿名内部类. 3.1 匿名内部类特性 1. 匿名内部类总是默认实现某个接口或继承某个抽象类. 2.不能有构造方法,只能有一个实例. 3. 不能定义在任何静态成员. ...

  6. java 内部类and匿名类

    内部类 内部类 匿名类 内部类 内部类可以在类体中,或方法中声明. 内部类中不可以声明static的变量或者方法. 内部类的方法可以调用外部类的方法. public class Outer {//定义 ...

  7. 对java中匿名对象和匿名类的简单理解

    首先在写完这篇博客时感谢几位作者的文章: https://www.cnblogs.com/txbblog/p/10364558.html https://blog.csdn.net/chengqium ...

  8. java内部类和匿名类

    2019独角兽企业重金招聘Python工程师标准>>> 内部类:一个类在另一个类的内部,即我们在一个类里面再写一个类. 简单来阐述两种内部类的用法: 1.内部类可以直接引用外部类的成 ...

  9. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

最新文章

  1. 新浪微博应用 IE下面框架嵌套框架的问题解决
  2. 停电后,JavaScript定时器居然变慢了~
  3. linux c 环境变量函数 getenv putenv 简介
  4. Notepad++ 列编辑操作实例二则
  5. [转]获取xml节点值和属性值(兼容ie和firefox)
  6. PCI总线体系结构概述
  7. 2020-08-07
  8. python的第三方库是干什么用的-quot;别人造好的轮子”,python常用第三方库——python自动办公7...
  9. 悟空 mobile.php,悟空CRM无需任何权限的SQL注入漏洞2(ThinkPHP特性)
  10. 校园网破解|校园网wifi破解|校园网免认证教程-SaoPanel
  11. antdesignpro prolayout 三级菜单问题
  12. 常见的直流稳压电源电容有哪些?及其详细介绍
  13. 谷歌浏览器报错“您的连接不是私密连接攻击者可能会试图从 xxx 窃取您的信息(例如:密码、通讯内容或信用卡信息)“
  14. 不知道如何录音转文字?分享两个实用方法
  15. 为什么吃狗肉那么有争议?
  16. 利用c++与opencv将文本、图像加密进另一张图片中
  17. Hadoop HDFS实现机架感知
  18. android开发BUG记录
  19. 红巨人调色插件套装:Magic Bullet Suite for Mac(支持m1)
  20. 桥牌记分规则 双人赛计分表

热门文章

  1. html位置插入透明动画文字,视频加移动水印 视频添加图片加文字水印 设置透明漂浮移动并控制显示时间...
  2. excel中用java语言_利用 JAVA 操作 EXCEL 文件
  3. 强制删除Ubuntu的EFI分区
  4. 禾川兴 专门为充电OTG产品打造的PD协议芯片LDR6028
  5. 抖音四面被拒,再战头条终获offer,全套教学资料
  6. 美股外汇市场量化接口有哪些优点?
  7. python读取文本两个数字的成语_【十分钟Python知识点】让文本数据更加生动——词云工具推荐...
  8. matlab水壶图形,[转载]Matlab 图像处理相关函数命令大全
  9. DuplicateHandle伪句柄与实句柄的应用二
  10. Linux下makefile教程