内部类的一个重要作用是隐藏继承或是对接口的实现,典型的形式是:内部类来继承或是实现接口,由外部类提供代理constructor方法。这些代理constructor方法一般都利用的向上转型,即不返回内部类对象,而是返回内部类继承的父类对象或是实现的接口对象。如:
interface Intf {...}
class Outer
{
class Inner implements Intf {...}
public Intf createInner
{
return new Inner();
}
}
而匿名内部类实际是对上述代码的简化,如:
interface Intf {...}
class Outer
{
public Intf createInner
{
return new Intf() {...};
}
}
这里,两处{...}的内容是一样的。
这里的匿名内部类表示:我要创建一个implements Intf的class,这个class的定义是{...}。由于这个class没有名字,我们用的是new Intf(),可以看作是自动的向上转型。
如果匿名内部类的创建要传参,那么可以直接写在new Intf()的括号里。
如果匿名内部类里要直接使用某个变量或是参数,那么这个变量或是参数必须是final(new Intf()的括号里也需要说明)(Todo:另作一篇详述)。
(4月7日补充:匿名内部类的另一种用法)
interface Intf
{
int sum();
}
public class Outer
{
public static int getSum()
{
return new Intf()
{
public int sum()
{
return 1;
}
}.sum();
}
public static void main(String[] args)
{
System.out.println(getSum());
}
}
因为对匿名内部类的使用是直接new一个匿名内部类对象,所以也可以直接使用这个对象的方法或是域。
(7月27日补充:总结——匿名内部类{}内可写的代码)
interface Intf {...}
class Outer
{
public Intf createInner
{
return new Intf()
{
// Anonymous inner class CANNOT have a named constructor
// only an instance initializer here
{
......
}
// function allowed here
return-type xxx(arg list)
{
......
}
};
}
}
匿名内部类没有构造器,只能有一个initializer (当然,你不用也可以);另外,可以在匿名内部类中写方法。
分享到:
相关推荐
qt 出现 DirectShowPlayerService::doRender: Unresolved error code 0x80040266 ()
Nov 01 22:54:09.125: vmx| CPUID[0] level 00000003, 0: 0x00000000 0x00000000 0x00000000 0x00000000 Nov 01 22:54:09.125: vmx| CPUID[0] level 00000004, 0: 0x00000000 0x00000000 0x00000000 0x00000000 Nov ...
AID: 0xA0:0x0:0x0:0x3:0x96:0x4D:0x34:0x4D:0x30 Version: 2.2 Set of documents referenced in this package: 昜VC Creation] - MIFARE Virtual Card Creation v1.0.2 昜VC Management] - MIFARE Virtual Card...
bcdUSB: 0x0110 bDeviceClass: 0xFF bDeviceSubClass: 0x00 bDeviceProtocol: 0xFF bMaxPacketSize0: 0x20 (32) idVendor: 0x064F (Xsh-Systems AG) idProduct: 0x0BD8 bcdDevice: 0x0106 iManufacturer: 0x01 ...
0X0E中学算术前置知识0X0D数学库函数正文有了三角函数、反三角函数、对数函数、求幂运算,中学阶段涉及的所有具体的数值计算基本就都可以求解。求此表达式的值:第
0X2B循环for前置知识0X29再谈循环正文Lua除了while和repeat语句还提供了一种for循环语句.while和repeat语句循环终止条件可以是任
VL53L0x 飞行时间传感器 arduino 驱动。
OV2643规格书开发代码详情HS[15:8] = 0x20HS[7:0] = 0x21vertical start [0x22, 0x23]VS[15:8] = 0x22VS[7:0] = 0x23horizontal width [0x24, 0x25]HW[11:4] = 0x24HW[3:0] = 0x25[7:4]HPAD[3:0] = 0x25[3:0] x 2...
目录图例Stage1 入门Stage2 基础Stage3 字符串处理Stage4 理解函数Stage5 表结构Stage6 流程控制Stage7 模块Stage
1. 度量脚本执行时间 2. 记录时间 3. 计算时间间隔
Flash ID 02: 0x00 0x00 0x00 0x00 0x00 Flash ID 03: 0x89 0xD5 0x94 0x3E 0x74 Flash ID 04: 0x00 0x00 0x00 0x00 0x00 Flash ID 05: 0x89 0xD5 0x94 0x3E 0x74 Flash ID 06: 0x00 0x00 0x00 0x00 0x00 Flash ID ...
域的定义如果交换环还额外满足以下条件,则称为域:乘法单位元和加法单位元不相等(1不等于0)。由于存在乘法逆元,就意味着可以进行“除法”,所以有的书上也把域称作
Q:"在ARM7TDMI(-S)处理器内部有37 个用户可见的寄存器:" 问题:"用户可见"应该怎样理解 这37 个寄存器是否是37 个不同的物理寄存器, 例如R8 与R8_fiq 应该是两个不同的物理寄存器吧 A:用户可见是指用户可以通过程序...
NULL 博文链接:https://aoyi.iteye.com/blog/659179
很好的BOOTKIT样本 ######################################################## ;## 32 bit Code,is called before execution of KERNEL ## ;######################################... mov word [ds:0B8014h], 0x0272
安全运营相关文章本篇整理一些安全运营相关的高质量文章[2] 体系化的WAF安全运营实践, 安全研究与实践,
NULL 博文链接:https://aoyi.iteye.com/blog/631929
U盘出现DEVICE ERROR CODE 0x0406错误解决办法
INIT: MOV R0 , #0x00 MOV R1 , #0x0FF MAIN: MOV P3 , #0FFH JNB KEY_P33 , readKeyValue ;若有按键按下则跳转到 readKeyValue SJMP MAIN readKeyValue: CALL DELAY10MS ;调用延时函数,消抖 JNB KEY_P33 , ...
NULL 博文链接:https://aoyi.iteye.com/blog/723571