??xml version="1.0" encoding="utf-8" standalone="yes"?> 闭包 是可以包?span style="color: #0000ff;">自由Q未l定Q变?/span> 的代码块Q这些变量不是在q个代码块或者Q何全局上下文中定义的,而是在定义代码块的环境中定义?#8220;闭包” 一词来源于以下两者的l合Q要执行的代码块Q由于自由变量的存在Q相兛_量引用没有释放)和ؓ自由变量提供l定的计环境(作用域)?/p>
可能上面的定义有Ҏ涩,下面看一?span style="color: #0000ff;">《Python 核心~程?/span> ?nbsp;闭包 的解释?/span> 如果在一个内部函数里Q对在外部作用域Q但不是在全局作用域)的变量进行引用,那么内部函数p定义?strong style="font-weight: bold;">闭包 。定义在外部函数内的但由内部函数引用或者用的变量被称?span style="color: #0000ff;">自由变量 ?/span>
Q一Q相关类 Q二Q问题:以下输出l果是什么? Q三Q答?/font> ?nbsp; A and A Q四Q分?/strong> ①②③比较好理解Q一般不会出错。④⑤就有点p涂了,Z么输出的不是"B and B”呢?Q!先来回顾一下多态性?/font> q行时多态性是面向对象E序设计代码重用的一个最强大机制Q动态性的概念也可以被说成“一个接口,多个Ҏ”。Java实现q行时多态性的基础是动态方法调度,它是一U在q行时而不是在~译期调用重载方法的机制?/font>
Ҏ的重写Overriding和重载Overloading是Java多态性的不同表现?/font> - 重写(Overriding) 是父cM子类之间多态性的一U表现?/font>如果在子cM定义某方法与其父cL相同的名U和参数Q我们说该方法被重写
(Overriding)。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被“屏蔽”了?/font> - 重蝲(Overloading) 是一个类中多态性的一U表现。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重?Overloading)。Overloaded的方法是可以改变q回值的cd?/font> 当超cd象引用变量引用子cd象时Q被引用对象的类型而不是引用变量的cd军_了调用谁的成员方法,但是q个被调用的Ҏ必须是在类中定义过的,也就是说被子c覆盖的Ҏ?/em> Q但是如果强制把类转换成子cȝ话,可以调用子cM新添加而超cL有的Ҏ了。) 好了Q先温习到这里,a归正传!实际上这里涉及方法调用的优先问题
Q优先由高C依次为: this.show(O), super.show(O)Q?br />
this.show((super)O), super.show((super)O)。让我们来看看它是怎么工作的?/font>
比如④,a2.show(b)Qa2是一个引用变量,cd为AQ则this为a2Qb是B的一个实例,于是它到cA里面找show(B
obj)ҎQ没有找刎ͼ于是到A的super(类)找,而A没有类Q因此{到第三优先this.show((super)O)Qthis仍然?
a2Q这里O为BQ?super)O?super)B即AQ因此它到类A里面找show(A
obj)的方法,cA有这个方法,但是׃a2引用的是cB的一个对象,B覆盖了A的show(A obj)ҎQ因此最l锁定到cB的show(A
obj)Q输Zؓ"B and A”?/font>
再比如⑧Qb.show(c)Qb是一个引用变量,cd为BQ则this为bQc是C的一个实例,于是它到cB找show(C
obj)ҎQ没有找刎ͼ转而到B的超cA里面找,A里面也没有,因此也{到第三优先this.show((super)O)Qthis为bQO为CQ?
(super)O?super)C即BQ因此它到B里面找show(B
obj)ҎQ找CQ由于b引用的是cB的一个对象,因此直接锁定到类B的show(B obj)Q输Zؓ"B and B”?/font> 按照上面的方法,可以正确得到其他的结果?/font>
问题q要l箋Q现在我们再来看上面的分析过E是怎么体现色字体那句话的内늚。它_当超cd象引用变量引用子cd象时Q被引用对象的类型而不是引?
变量的类型决定了调用谁的成员ҎQ但是这个被调用的方法必L在超cM定义q的Q也是说被子类覆盖的方法。还是拿a2.show(b)来说吧?/font>
a2是一个引用变量,cd为AQ它引用的是B的一个对象,因此q句话的意思是由B来决定调用的是哪个方法。因此应该调用B的show(B
obj)从而输?B and
B”才对。但是ؓ什么跟前面的分析得到的l果不相W呢Q问题在于我们不要忽略了蓝色字体的后半部分,那里特别指明Q这个被调用的方法必L在超cM定义q的Q也是被子c覆盖的Ҏ。B里面的show(B
obj)在超cA中有定义吗?没有Q那更谈不上被覆盖了。实际上q句话隐藏了一条信息:它仍然是按照Ҏ调用的优先来确定的。它在类A中找C
show(A obj)Q如果子cB没有覆盖show(A obj)ҎQ那么它p用A的show(A
obj)Q由于Bl承AQ虽然没有覆盖这个方法,但从类A那里l承了这个方法,从某U意义上_q是由B定调用的方法,只是Ҏ是在A中实现而已Q;
现在子类B覆盖了show(A obj)Q因此它最l锁定到B的show(A obj)。这是那句话的意义所在?/font> 个hd的一Ҏ考: W?个问题值得思考,输出 a2.show(c) Q答案是 B and A 分析Q?/strong> a2是类A的引用变量,引用的是cB的一个实例对象。c是类C的一个实例?/font>
1Qthis.show(c)Q在A中找show(C obj)的方法,没有扑ֈQ进行第二步? 2Qsuper.show(c)QA没有类Q进行第三步? 3Qthis.show(super(c)), super(c)是BQA中是没有show(B obj)Ҏ的,但是q时候会l箋往上找Q找B的父c,super(B)是AQ在A中找show(A obj), 扑ֈ了? 4Qa2引用的是cB的一个对象,由B来决定调用哪个方法,因ؓcB中覆盖了A的show(A obj)ҎQ因此最l用cB中的show(A obj)Ҏ?nbsp; 所以结论是q里super(O)是采用了逐层往上寻?/strong>的方式,具体来说Q父cL不到对应的showҎQ就扄cȝ父类Q如果还没有Ql往上找Q直到找到根基类?/font> Z验证作者原文中蓝色字体D|字的正确性,我测试了输出a1.show(c)Q结果和预想的一P是A and A. q里Qa1.show(c)和a2.show(c)的区别在于持有的引用对象的不同,a1是持有了Acȝ一个实例对象,而a2是持有了Bcȝ一个实例对象,所以当都找CAcM?span id="_8_178_Open_Text">show(A obj)Ӟ引用的对象的cd军_了该调用哪个成员的方法,前提是这个被调用的方法必被子类覆盖了。所?/span>a1.show(c)输出的是A and AQ?a2.show(c)输出的是 B and A.
打开C本,复制以下内容Qƈ保存?*.reg)格式,然后双击导入到注册表
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\Shell Icons]
"29"="C:\\Windows\\System32\\shell32.dll,50"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]
"29"="C:\\Windows\\System32\\shell32.dll,50"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
"link"=hex:00,00,00,00
同样打开C?复制以下内容,q保存ؓ(*.reg)格式Q然后双d入到注册?br />
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\lnkfile]
"isshortcut"=""
最后重启系l,大功告成Q本Z,有效?em>
]]>
用Eclipseq行JavaE序的开发,需要了解M码的行数Q如果不需要精的数字Q可以不用安装统计代码的插g。方法如下:
1Q?菜单栏,选择Search -> File... 打开File Search对话框(或者快捷键Ctrl + H,然后选择File Search标签Q?br />
2Q?选中“正则表达?#8221;QRegular expressionQ,在搜索文本框输入 \n
3Q?文g名称输入 *.java
4Q?在范围里选中Enclosing projects
5Q??#8220;Search”q行搜烦。然后就可以l计出整个项目的代码行数?br />
如图Q?br />
转图h明?br />
]]>
原帖地址Q?a target="_blank" >http://www.javaeye.com/topic/412451
主题Q再论闭?br />
作者:步行?br />
寚w包感兴趣的朋友可以移步去看看?br />
首先Q给出闭包的定义Q定义说法比较多Q本人偷懒,q接从原帖里摘取了。)Q?br />
[closure作ؓ一{公民,可以被一个普通的变量引用、传递。在ruby里意味着它是Proc的一个对象(实例Q,自然可以调用Proc的方法(比如
callQ。以java的视角,cL用来l织数据的,不是描述行ؓ。而对于rubyQ行Z是数据,也可以用cLqͼcM是对象,cȝc还是对象,q才?
真正的Everything is
Object。楼djava和java所谓的OO的媄响太深,评判q些问题Ӟ应该眼光往外多看看Q避免思维定势。尤其应该深入学习一门带闭包的语aQ?
看看它到底是怎么用的?/em>]
首先Q我同意可以用OO模拟闭包的观点,q已l由原帖作?#8220;步行?#8221;l出详细的例子了。但是这势必在一定程度上会增加代码的复杂度和臃肿度。我惻I大部分时候大家更希望用更z的Ҏd成同L功能吧?br />
另外Q对于闭包会破坏OO的结构的争论Q我更愿意从q义的角度来理解OO的定义。正如上面引用中所_“以java的视角,cL用来l织数据的,不是描述行ؓ。而对于rubyQ行Z是数据,也可以用cLqͼcM是对象,cȝc还是对?/em>”。如果采用闭包,那么q个内部函数中可以定义局部变量,同时它本w就是行为,此时h属性和行ؓ的闭包,何尝不可以看做是OO的呢Q?br />
个h的观Ҏ如果能达C下两条,那么我支持Java中引入闭包:
1Q引入闭包能够在保证E序的可L的基础上,化程序编写的复杂度,降低代码的臃肿度?br />
2Q引入闭包至能够保证在大部分情况下Q程序的性能能够保持或者得到提升。(q里排除了极限情况)
本h寚w包的了解q远q不够,计划有空闲的时候,认真地学习下闭包的知识和相关的应用?br />
Ƣ迎讨论?br />
]]>
对原文进行了适当的调_更适合阅读?br />
注:本hd的一Ҏ考在文章最后?br />
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); ?br />
System.out.println(a1.show(c)); ?br />
System.out.println(a1.show(d)); ?br />
System.out.println(a2.show(b)); ?br />
System.out.println(a2.show(c)); ?br />
System.out.println(a2.show(d)); ?br />
System.out.println(b.show(b)); ?br />
System.out.println(b.show(c)); ?br />
System.out.println(b.show(d)); ?nbsp;
?nbsp; A and A
?nbsp; A and D
?nbsp; B and A
?nbsp; B and A
?nbsp; A and D
?nbsp; B and B
?nbsp; B and B
?nbsp; A and D
]]>
原作者: gostar
1.原理
Property文g中,使用的编码方式根据机器本w的讄可能是GBK或者UTF-8。而在JavaE序中读取Property文g的时候用的是Unicode~码方式Q这U编码方式不同会D中文q。因此需要将Property文g中的中文字符转化成Unicode~码方式才能正常昄中文?/font>
2.解决办法
Java提供了专门的工具对Property文gq行Unicode转化Q这U工具就是native2asciiQ它在JDK安装环境的bin目录下?
native2ascii 工具带有本机编码字W(非拉?1 和非单一码字W)的文件{换成带有Unicode~码字符的文件?
假设需要{化的属性文件ؓQD:\src\resources.propertiesQ含有中文字W)
转化后的属性文件ؓQD:\classes\resources.propertiesQ中文字W统一转化为UnicodeQ?
那么使用如下命o
JAVA_HOME\bin\native2ascii -encoding GBK
D:\src\resources.properties D:\classes\resources.properties
p含有中文字W的属性文件{化成单一Unicode~码方式的属性文件。中文ؕ码自然会被解冟?