java的内部类可以玩出好多花样。介绍都挺多,我就不废话了。专门记一下困惑了我好半天的匿名内部类。

总结一下:

1.匿名内部类通常是为了省事(直接获取一个类实例,这个类实例只在此处用一次,就省得再给它起个名字重新定义了)。所以原则是尽量简单。如果用了这个方法,给读代码的人带来很大困惑,那就得不偿失了

2.匿名内部类不能有构造方法

3.匿名内部类不能定义静态变量、方法和类

4.匿名内部类通常为了实现某个接口或抽象类(实现接口只能实现一个)

5.匿名内部类还可以有继承式用法(和外部类同名,表示继承这个外部类,可以覆写方法,但新增方法通常意义不大)

示例代码:(我觉得已经够乱的了,当然你还可以写的更乱)public class Out1 {

private String x;

public int a=3;

public Out1(String x){

this.x=x;

System.out.println(this.a);

}

@Override

public String toString(){

return "x="+x;

}

public void pp(){

System.out.println("pp");

}

class InnerFn{

public Out2 rOut2(){

return new Out2(11){

public String outkkk(){

return "kkk";

}

public void prf(){

System.out.println(outkkk());

}

};

//此处{}段,定义了一个内部类。匿名内部类可以实现一个接口或继承一个类(不能有构造函数),

//自己加的方法只能用于内部类局部

}

public Out1 rOut1(){

return new Out1("mmm"){

public int bb=5;

public void ff(){

System.out.println("ff");

}

//无法定义构造方法,只能加返回值变成普通方法

public void Out1(int a){

bb=a;

}

@Override

public void pp(){

ff();

//Out1(8);

System.out.println("匿名内部类覆盖外部类方法");

System.out.println(bb);

}

};

//继承式匿名内部类

}

}

public static void main(String[] args){

Out1 ou1=new Out1("abc");

ou1.pp();

InnerFn t2=ou1.new InnerFn();

System.out.println(ou1);

System.out.println(t2.rOut2());

System.out.println(t2.rOut1());

t2.rOut2().prf();

t2.rOut1().pp();

//t2.rOut1().ff(); //编译通不过,匿名内部类的方法不能被外部识别

}

}

public abstract class Out2 {

private int a;

Out2(int a ) {

this.a=a;

}

abstract void prf();

}

-------------------------------------------------------------------------------------

又看了几篇文章及其评论,觉得有些概念还是深究一下:

1.所匿的是类的名字而非实例的名字——也就是说,原本这里应该写出 Classxx extends Out1或 Classxx implements Iout1 的,然后再 new Classxx()

2.既然这个Classxx没写,那么我们new的时候就用了其超类的类型,也就是写出了new  Out1(){}

3.此时定义了类的同时也产生了实例。这个实例可以赋给一个Out1类型的变量。当然我上面的例子是直接return 了一个对象,而且在外面我也没有给它分配名字,就直接调用其方法了:t2.rOut1().pp();

4.我们甚至可以定义完就直接调用某个方法来完成某个任务,而在外面根本就没有任何使用它的痕迹:比如在某个方法中 new Out1(){ public ... }.xx 。同前所述,这个xx必须是超类中定义了的方法。其实这种用法才是匿名内部类的意义。单次使用,用完就“扔”了。

5.有的文章里说可以实现多个接口,我觉得不对。因为匿名类采用的是隐含的继承(与超类同名),那么名称只有一个,也就是只能实现一个接口。——当然,如果其超类实现了多个接口,这个就不算在这了。

java匿名内部类返回值_java匿名内部类相关推荐

  1. java 接口 返回值_java api返回值的标准化详解

    api返回值的标准化 例如 {"status":200,"message":"操作成功","data":"{\ ...

  2. java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...

    1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...

  3. java 内部类 返回值_Java学习笔记:形参和返回值、内部类、常用API

    形参和返回值 类名作形参 public void useCat(Cat c){ c.eat(); } CatOperator co=new CatOperator(); Cat c=new Cat() ...

  4. java exe 返回值_java调用exe返回值

    {// getAccount 方法,使用 get 方法; return accounts.get(index); } } Bank .java: package com.mybank.domain; ...

  5. java try 返回值_JAVA的try... catch finally的return返回值问题

    下面看一个例子(例1),来讲解Java里面中try.catch.finally的处理流程 public class TryCatchFinally { @SuppressWarnings(" ...

  6. java hashcode返回值_Java String hashCode() 使用方法及示例

    Java String hashCode() 使用方法及示例 Java String hashCode()方法返回字符串的哈希码. 字符串hashCode()方法的语法为: string.hashCo ...

  7. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

    java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...

  8. java run() 返回值_java线程的run()没有返回值怎么办?

    用线程Thread执行一些方法后,需要判断执行是否成功. public void run() {} run( ) 方法返回值是空, 怎么办? 解决方法: Note 使用 call() 方法 Calla ...

  9. java递归函数返回值_Java基础——方法返回值递归

    原标题:Java基础--方法返回值&递归 声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. 例题:写一 ...

最新文章

  1. Mini汽车的保养周期
  2. LVS+Keepalived 高可用群集的介绍和搭建步骤
  3. 后端学习 - 并发编程
  4. CSDN 独家对话阿里云贾扬清、华先胜等大咖,剧透阿里云原生技术密码
  5. rust新版组队指令_Rust最新控制台命令2017
  6. 迷宫(信息学奥赛一本通-T1215)
  7. 深度学习————如何在Python中求解函数的解析表达式
  8. html可以用坐标画svg图吗,html5教程-SVG基础 SVG坐标系统和图形转换
  9. SCRT804安装教程
  10. 计算机二级ms office有题库吗,计算机二级office题库-吃惊!二级MS Office高级应用通过率仅有21.07%!...
  11. 即席查询—— Kylin使用
  12. cwrsync向linux免密同步,Cwrsync如何使用可以实现Linux与windows下的文件同步详解
  13. Android:软键盘弹出配合界面效果脱坑
  14. 千锋python培训班怎么样
  15. PV,UV,VV,IP
  16. markdown贴gif图片
  17. 09-单片机模块化程序: μCOS-II中内存管理程序使用说明
  18. python爬取2345天气网上2011年-2018年历史天气
  19. android vulkan 游戏,王者荣耀Vulkan
  20. mysql无法启动(centos7):systemctl status mysqld.service:Can‘t create/write to file

热门文章

  1. 程序员掌握新技术,知晓最新行业资讯的网站合集。
  2. rockchip uboot kernel logo制作方法
  3. Docker安装BookStack,打造属于您公司自己的开源wiki
  4. win10下安装、卸载ubuntu双系统
  5. Qt on Android Episode 1(翻译)
  6. 使用Markdown修改图片大小
  7. python制作热图folium_Python Folium包可以在热图上绘制标记吗?
  8. Widows下面DiskGenius扫描与修复磁盘
  9. word文件只读模式是怎么设置的?
  10. linux ptrace 读内存,linux ptrace