牛牛组合

春风不相识,何事入罗帏?

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  5 随笔 :: 2 文章 :: 1 评论 :: 0 Trackbacks

2009年9月15日 #

来自网络,原作者已不可考,谢谢原作者!

  • 方法一:
打开记事本,复制以下内容,并保存为(*.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


  • 方法二:
同样打开记事本,复制以下内容,并保存为(*.reg)格式,然后双击导入到注册表

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\lnkfile]
"isshortcut"=""

最后重启系统,大功告成!本人亲测,有效。
posted @ 2009-09-15 02:57 电子牛 阅读(405) | 评论 (0)编辑 收藏

2009年7月29日 #

在google上搜到的,原帖已不可考,感谢原帖作者。

用Eclipse进行Java程序的开发,需要了解总代码的行数,如果不需要精确的数字,可以不用安装统计代码的插件。方法如下:
1) 菜单栏,选择Search -> File... 打开File Search对话框(或者快捷键Ctrl + H,然后选择File Search标签)
2) 选中“正则表达式”(Regular expression),在搜索文本框输入 \n
3) 文件名称输入 *.java
4) 在范围里选中Enclosing projects
5) 点“Search”进行搜索。然后就可以统计出整个项目的代码行数。

如图:
imgFileSearch

转图请注明。
posted @ 2009-07-29 03:15 电子牛 阅读(4361) | 评论 (1)编辑 收藏

今天在javaeye论坛里看到的帖子,认真地从头看到尾,对闭包有了进一步的认识。感谢原帖楼主和所有回帖的朋友。

原帖地址:http://www.javaeye.com/topic/412451
主题:再论闭包
作者:步行者
对闭包感兴趣的朋友可以移步去看看。

首先,给出闭包的定义(定义说法比较多,本人偷懒,就直接从原帖里摘取了。):

闭包   是可以包含自由(未绑定)变量 的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。


    可能上面的定义有点晦涩,下面看一下《Python 核心编程》 对 闭包 的解释。


    如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为闭包 。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量 。

 

原帖中“liusong1111”回帖值得思考:
[closure作为一等公民,可以被一个普通的变量引用、传递。在ruby里意味着它是Proc的一个对象(实例),自然可以调用Proc的方法(比如 call)。以java的视角,类是用来组织数据的,不是描述行为。而对于ruby,行为也是数据,也可以用类描述,类也是对象,类的类还是对象,这才是 真正的Everything is Object。楼主受java和java所谓的OO的影响太深,评判这些问题时,应该眼光往外多看看,避免思维定势。尤其应该深入学习一门带闭包的语言, 看看它到底是怎么用的。]

首先,我同意可以用OO模拟闭包的观点,这已经由原帖作者“步行者”给出详细的例子了。但是这势必在一定程度上会增加代码的复杂度和臃肿度。我想,大部分时候大家更希望用更简洁的方法去完成同样的功能吧。

另外,对于闭包会破坏OO的结构的争论,我更愿意从广义的角度来理解OO的定义。正如上面引用中所说,“以java的视角,类是用来组织数据的,不是描述行为。而对于ruby,行为也是数据,也可以用类描述,类也是对象,类的类还是对象”。如果采用闭包,那么这个内部函数中可以定义局部变量,同时它本身就是行为,此时具有属性和行为的闭包,何尝不可以看做是OO的呢?
个人的观点是如果能达到以下两条,那么我支持Java中引入闭包:

1)引入闭包能够在保证程序的可读性的基础上,简化程序编写的复杂度,降低代码的臃肿度。
2)引入闭包至少能够保证在大部分情况下,程序的性能能够保持或者得到提升。(这里排除了极限情况)

本人对闭包的了解还远远不够,计划有空闲的时候,认真地学习下闭包的知识和相关的应用。

欢迎讨论。

posted @ 2009-07-29 02:33 电子牛 阅读(270) | 评论 (0)编辑 收藏

2009年7月11日 #

原作者thinkGhoster,链接http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.aspx
对原文进行了适当的调整,更适合阅读。

注:本人读后的一点思考在文章最后。

(一)相关类

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));   ①
        System.out.println(a1.show(c));   ②
        System.out.println(a1.show(d));   ③
        System.out.println(a2.show(b));   ④
        System.out.println(a2.show(c));   ⑤
        System.out.println(a2.show(d));   ⑥
        System.out.println(b.show(b));     ⑦
        System.out.println(b.show(c));     ⑧
        System.out.println(b.show(d));     ⑨    

(三)答案

              ①   A and A
              ②   A and A
              ③   A and D
              ④   B and A
              ⑤   B and A
              ⑥   A and D
              ⑦   B and B
              ⑧   B and B
              ⑨   A and D

(四)分析

        ①②③比较好理解,一般不会出错。④⑤就有点糊涂了,为什么输出的不是"B and B”呢?!!先来回顾一下多态性。

        运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。

        方法的重写Overriding和重载Overloading是Java多态性的不同表现。

       - 重写(Overriding) 是父类与子类之间多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

       - 重载(Overloading) 是一个类中多态性的一种表现。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

        当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)

        好了,先温习到这里,言归正传!实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为:

       this.show(O),

       super.show(O),

       this.show((super)O),

       super.show((super)O)。让我们来看看它是怎么工作的。

        比如④,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是 a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A”。

        再比如⑧,b.show(c),b是一个引用变量,类型为B,则this为b,c是C的一个实例,于是它到类B找show(C obj)方法,没有找到,转而到B的超类A里面找,A里面也没有,因此也转到第三优先级this.show((super)O),this为b,O为C, (super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是类B的一个对象,因此直接锁定到类B的show(B obj),输出为"B and B”。

        按照上面的方法,可以正确得到其他的结果。

        问题还要继续,现在我们再来看上面的分析过程是怎么体现出蓝色字体那句话的内涵的。它说:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用 变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。还是拿a2.show(b)来说吧。

        a2是一个引用变量,类型为A,它引用的是B的一个对象,因此这句话的意思是由B来决定调用的是哪个方法。因此应该调用B的show(B obj)从而输出"B and B”才对。但是为什么跟前面的分析得到的结果不相符呢?问题在于我们不要忽略了蓝色字体的后半部分,那里特别指明:这个被调用的方法必须是在超类中定义过的,也就是被子类覆盖的方法。B里面的show(B obj)在超类A中有定义吗?没有!那就更谈不上被覆盖了。实际上这句话隐藏了一条信息:它仍然是按照方法调用的优先级来确定的。它在类A中找到了 show(A obj),如果子类B没有覆盖show(A obj)方法,那么它就调用A的show(A obj)(由于B继承A,虽然没有覆盖这个方法,但从超类A那里继承了这个方法,从某种意义上说,还是由B确定调用的方法,只是方法是在A中实现而已); 现在子类B覆盖了show(A obj),因此它最终锁定到B的show(A obj)。这就是那句话的意义所在。


个人读后的一点思考:

第5个问题值得思考,输出 a2.show(c) ,答案是 B and A

分析:

a2是类A的引用变量,引用的是类B的一个实例对象。c是类C的一个实例。

1)this.show(c),在A中找show(C obj)的方法,没有找到,进行第二步。

2)super.show(c),A没有超类,进行第三步。

3)this.show(super(c)), super(c)是B,A中是没有show(B obj)方法的,但是这时候会继续往上找,找B的父类,super(B)是A,在A中找show(A obj), 找到了。

4)a2引用的是类B的一个对象,由B来决定调用哪个方法,因为类B中覆盖了A的show(A obj)方法,因此最终用类B中的show(A obj)方法。 

所以结论是这里super(O)是采用了逐层往上寻找的方式,具体来说,父类找不到对应的show方法,就找父类的父类,如果还没有,继续往上找,直到找到根基类。

为了验证作者原文中蓝色字体段文字的正确性,我测试了输出a1.show(c),结果和预想的一样,是A and A.

这里,a1.show(c)和a2.show(c)的区别在于持有的引用对象的不同,a1是持有了A类的一个实例对象,而a2是持有了B类的一个实例对象,所以当都找到了A类中的show(A obj)时,引用的对象的类型决定了该调用哪个成员的方法,前提是这个被调用的方法必须被子类覆盖了。所以a1.show(c)输出的是A and A,而 a2.show(c)输出的是 B and A.

posted @ 2009-07-11 06:39 电子牛 阅读(184) | 评论 (0)编辑 收藏

2009年7月9日 #

原链接 http://gostar.bokee.com/3885062.html

原作者: gostar

1.原理

Property文件中,使用的编码方式根据机器本身的设置可能是GBK或者UTF-8。而在Java程序中读取Property文件的时候使用的是Unicode编码方式,这种编码方式不同会导致中文乱码。因此需要将Property文件中的中文字符转化成Unicode编码方式才能正常显示中文。

2.解决办法

Java提供了专门的工具对Property文件进行Unicode转化,这种工具就是native2ascii,它在JDK安装环境的bin目录下。

native2ascii 工具将带有本机编码字符(非拉丁 1 和非单一码字符)的文件转换成带有Unicode编码字符的文件。

假设需要转化的属性文件为:D:\src\resources.properties(含有中文字符)

转化后的属性文件为:D:\classes\resources.properties(中文字符统一转化为Unicode)

那么使用如下命令
JAVA_HOME\bin\native2ascii -encoding GBK D:\src\resources.properties D:\classes\resources.properties

就能将含有中文字符的属性文件转化成单一Unicode编码方式的属性文件。中文乱码自然会被解决。

posted @ 2009-07-09 03:42 电子牛 阅读(250) | 评论 (0)编辑 收藏

2009年6月30日 #

今天尝试着装了wm版的Skype,因为是国际版,所以发现不了国内卡的余额。打国内手机总是报余额不足的错误。于是求助于Google,果然网络上已有高人给出解决办法。

非 TOM-Skype版本的长话通拨号方法:
  • 拨打手机号码:0099008668033+0+手机号码。示例: 0099008668033013917497583
  • 拨打座机号码:0099008668033+区号(不要去0)+电话号码。示例: 009900866803302161021281     

为了拨号方便,建议把常用号码前面加+99008668033后保存为联系人。
posted @ 2009-06-30 01:42 电子牛 阅读(602) | 评论 (0)编辑 收藏

仅列出标题