1. 匿名内部类

  • 没有(或者不需要)命名来初始化类,就称为匿名内部类。
  • 在这四种内部类中,以后的工作可能遇到最多的是匿名内部类,所以说匿名内部类是最常用的一种内部类。

什么是匿名对象?

  • 如果一个对象只要使用一次,那么我们就是需要new Object().method()。 就可以了,而不需要给这个实例保存到该类型变量中去。这就是匿名对象。

匿名内部类跟匿名对象是一个道理:

  • 匿名对象:我只需要用一次,那么我就不用声明一个该类型变量来保存对象了。
  • 匿名内部类:我也只需要用一次,那我就不需要在类中先定义一个内部类,而是等待需要用的时候,我就在临时实现这个内部类,因为用次数少,可能就这一次,那么这样写内部类,更方便。不然先写出一个内部类的全部实现来,然后就调用它一次,岂不是用完之后就一直将其放在那,那就没必要那样。

如何使用匿名内部类:

  • 1.匿名内部类需要依托于其他类或者接口来创建

    • 如果依托的是类,那么创建出来的匿名内部类就默认是这个类的子类
    • 如果依托的是接口,那么创建出来的匿名内部类就默认是这个接口的实现类。
  • 2.匿名内部类的声明必须是在使用new关键字的时候
    • 匿名内部类的声明及创建对象必须一气呵成,并且之后能反复使用,因为没有名字。

【示例】:

  • A是一个类(普通类、抽象类都可以),依托于A类创建一个匿名内部类对象
  • 总结: { }里面是类的具体声明,new B{ } 会返回一个这个匿名内部类的实例对象。

匿名内部类特点:

  1. 匿名内部类除了依托的类或接口之外,不能指定继承或者实现其他类或接口,同时也不能被其他类所继承,因为没有名字。
  2. 匿名内部中,我们不能写出其构造器,因为没有名字。
  3. 匿名内部中,除了重写上面的方法外,一般不会再写其他独有的方法,因为从外部不能直接调用到。(间接是调用到的)

示例1:

interface Work {void doWork();
}public class AnonymousOuterClass {private String name = "AnonymousOuterClass";private static int age = 21;public void say() {System.out.println("Say...");}public static void go() {System.out.println("Go...");}public void test() {final int i = 90;Work w = new Work() {@Overridepublic void doWork() {//             打印外部类的属性System.out.println(AnonymousOuterClass.this.name);System.out.println(AnonymousOuterClass.age);//              调用外部类的方法实例方法AnonymousOuterClass.this.say();//              调用外部类的方法静态方法AnonymousOuterClass.go();//              打印方法里面定义的常量System.out.println(i);}};w.doWork();}
}class Test {public static void main(String[] args) {new AnonymousOuterClass().test();}
}

示例2:

public class AnonymousOuterClass {public void say() {System.out.println("Say...");}public void test() {new AnonymousOuterClass() {public void say() {System.out.println("Say No...");}}.say();}
}class Test {public static void main(String[] args) {new AnonymousOuterClass().test();}
}

我们可以试一下不用匿名内部类和用匿名内部类实现一个接口中的方法的区别

1.【不用匿名内部类】:

2.【用匿名内部类】:

interface Test1 {public void method();
}public class Test {public static void main(String[] args) {//如果我们需要使用接口中的方法,我们只需要走一步,就是使用匿名内部类,直接将其 类的对象创建出来。new Test1() {public void method() {System.out.println("实现了Test接口的方法");}}.method();}
}


小结:

  • 解析:其实只要明白一点,new Test1(){实现接口中方法的代码}; Test1(){…}这个的作用就是将接口给实现了,只不过这里实现该接口的是一个匿名类,也就是说这个类没名字,只能使用这一次,我们知道了这是一个类, 将其new出来,就能获得一个实现了Test1接口的类的实例对象,通过该实例对象,就能调用该类中的方法了,因为其匿名类是在一个类中实现的,所以叫其匿名内部类,不要纠结为什么Test1(){…}就相当于实现了Test1接口,这其中的原理等足够强大了,在去学习,不要钻牛角尖,这里就仅仅是需要知道他的作用是什么,做了些什么东西就行。


Java面向对象(OOP)--内部类(匿名内部类)相关推荐

  1. java基础(三):java面向对象OOP

    java面向对象OOP 基本概念 面向过程与面向对象 面向过程:关注代码实现的细节.复用性 面向对象:先把每个过程的代码实现细节整合到对象中,只要找到对象就能拥有对象身上所有的功能. 面向对象基于面向 ...

  2. java面向对象oop阶段总结

    名词解释 笔记0927 *对象数组起始位置可以初始化几个元素 // 1.功能五 判断队名是否重复2.给队起名:3.队伍建队用flag循环判断是否队伍已满: 2.功能六 遍历二维数组子元素的方法 *3. ...

  3. 什么是Java面向对象OOP

    OOP是Java的核心编程思想,整套Java的精髓就是OPP思想的实现 一.封装 定义:封装就是把对象的属性(状态)和⽅法(⾏为)结合在⼀起,并尽可能隐蔽对象的内部细节,成为⼀个不可分割的独⽴单位(即 ...

  4. Java面向对象(OOP)--面向过程 面向对象 OOP详解

    1. 面向过程 & 面向对象 语言的进化发展跟生物的进化发展其实是一回事,都是"物以类聚".相近的感光细胞聚到一起变成了我们的眼睛,相近的嗅觉细胞聚到一起变成了我们的鼻子. ...

  5. Java面向对象(OOP)入门

    一.面向对象概述 Java是面向对象思想的高级计算机编程语言. 面向对象(简称:OOP)是一种以事物为中心的编程思想,是一种程序开发的方法,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件 ...

  6. JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码

    构造方法 构造方法(constructor):与类名同名,没有返回值 其初始化作用:一为属性分配内存空间.二为属性赋值 构造方法不能自己调用,只能通过new实例化对象调用 隐式构造方法:对象实例化时编 ...

  7. JAVA面向对象OOP多态→抽象类abstract、接口interface实现implement、final不变修饰符、样例代码

    抽象类 抽象类-接口关系示意图 如果一个类实现接口,就要把接口中所有的抽象方法都重写. A接口继承另一个B接口时,类要重写AB两个接口的方法 如果只是实现部分接口,可以用抽象类实现. 抽象类与接口不同 ...

  8. JAVA面向对象OOP→继承extends、构造方法super、方法重写override、样例代码

    继承(extends扩展) 一个子类只有一个父类,单一继承,可以在不同包内,不同包要导入import 基类(Object)如果一个类不继承任何类,默认就自动继承Object类 子类可以对父类的属性不用 ...

  9. JAVA面向对象OOP、类、属性、方法、样例代码

    类由属性和方法组成.jdk类接近八千个 成员变量 一个类中的任何方法,都可以使用同一个属性. 属性可以被类中的所有方法访问,类中的所有方法都可以改变属性值. 为区分,类名默认首字母大写,方法名默认首字 ...

最新文章

  1. 99% 的新移动恶意程序是针对 Android
  2. 2019 年如何在 CentOS 7 上安装最新版 Nginx
  3. 随便写写2014创业记(二)
  4. 计算机软件需求规格说明规范_太阳能(光伏)组件安全规范测试简介_丙观科技
  5. 前端:后端,我要分手,你不适合我
  6. 用php循环星期一到星期日,php – 获取最后一个星期一 – 星期日的日期:有更好的方法吗?...
  7. MATLAB数据类型结构
  8. 洛谷 P5708 【深基2.习2】三角形面积(C)
  9. PostgreSQL的学习心得和知识总结(五十三)|语法级自上而下完美实现MySQL数据库的 insert set 的实现方案
  10. 《计算机视觉中的数学方法》
  11. 安装MinGW-w64
  12. 手把手教你清理 windows C盘文件
  13. Golang高并发安全(一)
  14. windows开机启动自定义程序和任务
  15. 转-果壳网python工程师招聘启事
  16. 那些年遇到的DB2大坑
  17. spring揭密学习笔记
  18. Three.js - SpotLight 光源
  19. 牛客网机器学习刷题错题集合1
  20. MyZip--专业mac压缩软件

热门文章

  1. PDF文档怎么编辑修改,如何删除PDF空白页面
  2. 玩转Service Mesh微服务熔断、限流骚操作
  3. 刚刚,Science发布2019十大科学突破!
  4. Redis面试突击串讲 --图灵
  5. JS实战之使用键盘方向键控制方块的上下左右移动
  6. 快排为什么那样快(转)
  7. word里面打不出汉子,只能输入字母的解决方法
  8. 利用cmd来配置java环境变量
  9. PIC单片机低功耗调试心得
  10. 微信公众号开发模式之用户账号绑定