首先说为什么有匿名类(产生的使命)

两个原因

1.简化代码编写

某种情况下,类只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类

2.在不同的包内的类内调用类的protected方法(其实,也可以理解和第一个原因是一样的)

匿名类继承了父类,并调用了父类的protected方法

条件:

匿名类完成上述使命,则需要继承一个类或者实现某个接口

形式:new <类或接口> <类的主体>

示例1:

  1. /**
  2. * 一般类
  3. * @author masan
  4. *
  5. */
  6. class Normal{
  7. public void func(){
  8. System.out.println("do with name");
  9. }
  10. }
  11.  
  12. public class UnNamedClass {
  13. public static void main(String[] args) {
  14. Normal m = new Normal(){
  15. public void func(){
  16. System.out.println("do without name");
  17. };
  18. };
  19. m.func();
  20. }
  21. }

  输出结果为:"do without name",

匿名类继承了Normal类,并且覆盖了父类的func方法

那么这个m到底是哪一个类的对象,是父类的还是子类的??

示例2:

  1. /**
  2. * 一般类
  3. * @author masan
  4. *
  5. */
  6. class Normal{
  7.  
  8. public void func(){
  9. System.out.println("do with name");
  10. }
  11.  
  12. }
  13.  
  14. public class UnNamedClass {
  15.  
  16. public static void main(String[] args) {
  17. Normal m = new Normal(){
    // 覆盖了父类的方法func()
  18. public void func(){
  19. System.out.println("do without name");
  20. };
  21. // 定义一个父类没有的方法func1
  22. public void func1(){
  23. System.out.println("func1 do without name");
  24. }
  25. };
  26.  
  27. m.func(); // 输出 "do without name"
  28.  
  29. m.func1(); // 报错,没有这个方法
  30.  
  31. // 调用func1(),这种写法是对的,可以调用匿名类的任意方法
  32. new Normal(){
  33. public void func(){
  34. System.out.println("do without name");
  35. };
  36.  
  37. public void func1(){
  38. System.out.println("func1 do without name");
  39. }
  40. }.func1();
  41.  
  42. // 上述示例说明这种关系是 父类引用指向了new出来的子类实例,m是父类的引用但是指向了子类的实例
  43.  
  44. }
  45.  
  46. }

   上述示例说明这种关系是 父类引用指向了new出来的子类实例,那么接口的情况下会如何?

示例3:匿名类实现接口

  1. // 先定义一个接口
  2.  
  3. public interface Human {
  4. public void eat();
  5.  
  6. public void drink();
  7.  
  8. }
  1. public class UnNamedClass {
  2.  
  3. public static void main(String[] args) {

  4. // 大家可以看到,这里new了一个接口,Java里接口是没有构造函数的,那么这里又是什么情况
  5. Human masan = new Human(){
  6. // 匿名类实现了Human接口的所有方法
  7. @Override
  8. public void eat() {
  9. System.out.println(" masan eat ");
  10. }
  11.  
  12. @Override
  13. public void drink() {
  14. System.out.println(" masan drink ");
  15. }
  16.  
  17. };
  18.  
  19. masan.eat(); // 编译通过, 输出 " masan eat "
  20.  
  21. masan.drink(); // 编译通过,输出 " masan drink "
    // 可以看出 masan这个对象可以调用所有实现了方法,也就是说其实masan是匿名类的实例,
    // 所以并没有实例化接口 而是实例化了这个匿名类
  22.  
  23. }
  24.  
  25. }

  

示例4:调用不同包的类的protected方法

访问权限如果不熟悉的话,附上一张权限图

修饰词

本类

同一个包的类

继承类

其他类

private

×

×

×

无(默认)

×

×

protected

×

public

父类:(不同包)

  1. package another;
  2.  
  3. public class Parent {
  4.  
  5. public void run(){
  6. System.out.println(" run with legs! ");
  7. }
  8.  
  9. public void drink(){
  10. System.out.println(" parent drink with mouth! ");
  11. }
  12.  
  13. // protected 方法
  14. protected void eat(){
  15. System.out.println(" parent eat with mouth! (protected)");
  16. }
  17. }

另一个包调用protected方法

  1. package base;
  2.  
  3. import another.Parent;
  4.  
  5. public class UnNamedClass {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. Parent p = new Parent();
  10.  
  11. p.eat(); // 报错,因为不是同包内的类,也不是子类,所以,不能调用protected方法;
  12.  
  13. // 假设只有这一个地方需要调用这个protected权限的eat()方法
  14. // 则可以使用匿名类继承Parent,调用父类的eat
  15. new Parent(){
  16. // 匿名类新定义一个方法,方法体调用父类的eat();
  17. public void peat(){
  18.   super.eat();
  19. };
  20. }.peat();
  21.  
  22. // 输出 " parent eat with mouth! (protected)" 则成功的调用了父类的eat()
  23. }
  24.  
  25. }

总结,综合上述4个示例可以看出:

匿名类与普通类的区别主要在于,没有名字和使用时机

匿名类的继承父类和实现接口都符合Java的一般规定

匿名类在实例化的时候会有些特殊

要new 父类的构造方法,实例化匿名类本身(因为没有名字嘛)

同理,引用也只能用父类的,所以一般是父类引用指向子类(匿名类)实例

Java匿名内部类使用与示例的更多相关文章

  1. #随笔之java匿名内部类

    随笔之java匿名内部类 从今天起开始每日一篇技术博客,当然这只是我当天所学的一些随笔,里面或多或少会有理解不当的地方,希望大家多多指教,一起进步! 在讲匿名内部类之前,先讲讲内部类的一些概念. 1. ...

  2. Java枚举类型使用示例

    Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...

  3. JAVA代理方式使用示例总结

    JAVA代理方式使用示例总结 一.    代理方式概括 Java的代理方式主要包含了静态代理,动态代理两种方式,其中,动态代理根据实现的方式不同,又可以划分为jdk动态代理和cglib动态代理. 二. ...

  4. Java SE 9 模块化示例

    Java SE 9 模块化示例 作者:Grey 原文地址:Java SE 9 模块化示例 说明 Java SE 9引入了模块系统,模块就是代码和数据的封装体.模块的代码被组织成多个包,每个包中包含Ja ...

  5. Java 8 lambda表达式示例

    例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...

  6. 为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰

    大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类. class Outer { priv ...

  7. java匿名内部类使用场景列举

    示例一: package com;      interface Operation {       double operateTwoIntNum(int a, int b);   }      p ...

  8. Java Socket长连接示例代码

    SocketListenerPusher.java代码如下: import java.io.IOException; import java.net.InetSocketAddress; import ...

  9. 从JAVA客户端访问Redis示例(入门)

    转自:http://blog.csdn.net/kkdelta/article/details/7217761 本文记录了安装Redis和从JAVA端访问Redis的步骤 从http://downlo ...

随机推荐

  1. 属性property和字段的区别

    在类中定义的一个成员变量叫字段,要把这个成员变量变成一个属性必须加上getter和setter方法

  2. ehcache memcache redis 区别

    之前用过redis 和 memcache ,没有ehcache 的开发经验,最近也查阅不少文档和博客,写一些总结,也有不少内容总结与诸多博客中的博主总结:  Ehcache EhCache 是一个纯J ...

  3. gitoschina使用入门

    1 下载git sudo apt-get install git 2 添加公钥:terminal:  ssh-keygen -t rsa -C "git.oschina.net" ...

  4. PHP语言开发微信公众平台(订阅号)之curl命令

    在开发过程中,经常会遇到要求用curl命令调用接口的情况 那么,什么是curl,简单来说curl是一个利用url语法规定来传输文件和哦数据的工具,支持很多协议,如 http.ftp.telent 等, ...

  5. mysql 索引篇

    一.索引优化   索引优化主要还是依赖explain命令,关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分r ...

  6. ThinkPHP3.2.3版本验证码异步第二次验证时失败的问题解决

    最近在用TP3.2.3做一个小项目,纠结于验证码验证问题,重点在于二次验证,举个例子就是常见的登录页面上有个验证码输入框,当用户输入验证码并且鼠标点击在这个输入框之外时候,触发onblur事件,然后a ...

  7. Webpack 速成

    前言 如果你已经对Webpack精通了或者至少一直在工作中使用它,请关闭当前浏览器标签,无视这篇文章. 这篇文章本意是写给我自己看的,作为一篇Cookbook供快速查询和上手用.原因是虽然工作中会涉及 ...

  8. 在腾讯云上部署Hexo博客

    推荐理由 ----搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器.相比于其他博客而言它只要是web容器就能用.除了闷头专研技术之外,程序员还 ...

  9. So Easy-Ntp嵌入式软件移植

    一.导语和准备工作 Ntp是一种对时的软件,对客户端来说我们只要输入ntpdate IP,如ntpdate 192.168.1.254(192.168.1.254是ntp服务器,window电脑激活自 ...

  10. FB,Flash,as3 Bug集

    一.Flash builder 报错 当导入3.0的项目时运行出现如下错误: 进程已终止,没有建立到调试器的连接.error while loading initial content 启动命令详细信 ...