konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

#

Java修饰词的总结

作者:jackliu
e-mail:suntoday@eyou.com

Java语言定义了public、protected、private、abstract、static和final这6常用修饰
词外还定义了5个不太常用的修饰词,下面是对这11个Java修饰词的介绍:

1.public

使用对象:类、接口、成员

介绍:无论它所处在的包定义在哪,该类(接口、成员)都是可访问的

2.private

使用对象:成员

介绍:成员只可以在定义它的类中被访问

3.static

使用对象:类、方法、字段、初始化函数

介绍:成名为static的内部类是一个顶级类,它和包含类的成员是不相关的。静态方法
是类方法,

是被指向到所属的类而不是类的实例。静态字段是类字段,无论该字段所在的类创建了
多少实例,该字

段只存在一个实例被指向到所属的类而不是类的实例。初始化函数是在装载类时执行
的,而不是在创建

实例时执行的。

4.final

使用对象:类、方法、字段、变量

介绍:被定义成final的类不允许出现子类,不能被覆盖(不应用于动态查询),字段值
不允许被

修改。

5.abstract

使用对象:类、接口、方法

介绍:类中包括没有实现的方法,不能被实例化。如果是一个abstract方法,则方法体
为空,该方

法的实现在子类中被定义,并且包含一个abstract方法的类必须是一个abstract类

6.protected

使用对象:成员

介绍:成员只能在定义它的包中被访问,如果在其他包中被访问,则实现这个方法的类
必须是该成

员所属类的子类。

7.native

使用对象:成员

介绍:与操作平台相关,定义时并不定义其方法,方法的实现被一个外部的库实现。

8.strictfp

使用对象:类、方法

介绍:strictfp修饰的类中所有的方法都隐藏了strictfp修饰词,方法执行的所有浮点
计算遵守

IEEE 754标准,所有取值包括中间的结果都必须表示为float或double类型,而不能利用
由本地平台浮

点格式或硬件提供的额外精度或表示范围。

9.synchronized

使用对象:方法

介绍:对于一个静态的方法,在执行之前jvm把它所在的类锁定;对于一个非静态类的方
法,执行

前把某个特定对象实例锁定。

10.volatile

使用对象:字段

介绍:因为异步线程可以访问字段,所以有些优化操作是一定不能作用在字段上的。
volatile有时

可以代替synchronized。

11.transient

使用对象:字段

介绍:字段不是对象持久状态的一部分,不应该把字段和对象一起串起。
posted @ 2005-12-19 22:41 konhon 优华 阅读(535) | 评论 (0)编辑 收藏

将Java应用程序本地编译为EXE的几种方法
将Java应用程序本地编译为EXE的几种方法(推荐使用JOVE和JET)
1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件编译成EXE文件。
2. 利用微软的SDK-Java 4.0所提供的jexegen.exe创建EXE文件,这个软件可以从微软的网站免费下载,地址如下:
http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的语法如下:
jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]
3. Visual Cafe提供了一个能够创建EXE文件的本地编译器。你需要安装该光盘上提供的EXE组件。
4. 使用InstallAnywhere创建安装盘。
5. 使用IBM AlphaWorks提供的一个高性能Java编译器,该编译器可以从下面的地址获得:
http://www.alphaworks.ibm.com/tech/hpc
6. JET是一个优秀的Java语言本地编译器。该编译器可以从这个网站获得一个测试版本: http://www.excelsior-usa.com/jet.html
7. Instantiations公司的JOVE
http://www.instantiations.com/jove/...ejovesystem.htm
JOVE公司合并了以前的SuperCede,一个优秀的本地编译器,现在SuperCede 已经不复存在了。
8. JToEXE
Bravo Zulu Consulting, Inc开发的一款本地编译器,本来可以从该公司的网页上免费下载的,不过目前在该公司的主页上找不到了。
主页:http://www.bravozulu.com/
根据精华区中的资料,下面这个FTP上曾经有过这个软件,不知道现在是不是还在:
ftp://race.dlut.edu.cn/pub/java/tools/jet
注:本文的主要内容来自如下网站,本人对其中的技术性内容进行了确认并补
充了一小部分内容。 (tack)
http://www.artima.com/legacy/answer...ssages/190.html
posted @ 2005-12-19 22:19 konhon 优华 阅读(519) | 评论 (0)编辑 收藏

Download Shutdown.exe

C:\shutdown.exe /r /t 10 /c "釋放內存..." /f
重啟本機

C:\shutdown.exe /r /t 10 /c "釋放內存..." /f /m \\konhon
重啟遠程電腦


posted @ 2005-12-14 20:05 konhon 优华 阅读(492) | 评论 (0)编辑 收藏

 
winexec(Pchar('StrCommand'),sw_Show);
其中"StrCommand"代表以下命令之一(使用Windows中的运行不要加引号):
"rundll32 shell32,Control_RunDLL" - 运行控制面板
"rundll32 shell32,OpenAs_RunDLL" - 打开"打开方式"窗口
"rundll32 shell32,ShellAboutA Info-Box" - 打开"关于"窗口
"rundll32 shell32,Control_RunDLL desk.cpl" - 打开"显示属性"窗口
"rundll32 user,cascadechildwindows" - 层叠全部窗口
"rundll32 user,tilechildwindows" - 最小化所有的子窗口
"rundll32 user,repaintscreen" - 刷新桌面
"rundll32 shell,shellexecute Explorer" - 重新运行Windows Explorer
"rundll32 keyboard,disable" - 锁写键盘
"rundll32 mouse,disable" - 让鼠标失效
"rundll32 user,swapmousebutton" - 交换鼠标按钮
"rundll32 user,setcursorpos" - 设置鼠标位置为(0,0)
"rundll32 user,wnetconnectdialog" - 打开"映射网络驱动器"窗口
"rundll32 user,wnetdisconnectdialog" - 打开"断开网络驱动器"窗口
"rundll32 user,disableoemlayer" - 显示BSOD窗口, (BSOD) = Blue Screen Of
Death, 即蓝屏
"rundll32 diskcopy,DiskCopyRunDll" - 打开磁盘复制窗口
"rundll32 rnaui.dll,RnaWizard" - 运行"Internet连接向导",
如果加上参数"/1"则为silent模式
"rundll32 shell32,SHFormatDrive" - 打开"格式化磁盘(A)"窗口
"rundll32 shell32,SHExitWindowsEx -1" - 冷启动Windows Explorer
"rundll32 shell32,SHExitWindowsEx 1" - 关机
"rundll32 shell32,SHExitWindowsEx 0" - 退当前用户
"rundll32 shell32,SHExitWindowsEx 2" Windows9x 快速重启
"rundll32 krnl386.exe,exitkernel" - 强行退出Windows 9x(无确认)
"rundll rnaui.dll,RnaDial "MyConnect" - 运行"网络连接"对话框
"rundll32 msprint2.dll,RUNDLL_PrintTestPage" - 选择打印机和打印测试页
"rundll32 user,setcaretblinktime" - 设置光标闪烁速度
"rundll32 user, setdoubleclicktime" - 测试鼠标双击速度
"rundll32 sysdm.cpl,InstallDevice_Rundll" - 搜索非PnP设备
 控制面板中的各项功能

 winexec('rundll32.exe shell32.dll, Control_RunDLL', 9);
 {辅助选项 属性-键盘}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 1', 9);
 {辅助选项 属性-声音}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 2', 9);
 {辅助选项 属性-显示}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 3', 9);
 {辅助选项 属性-鼠标}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 4', 9);
 {辅助选项 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 5', 9);
 {添加/删除程序 属性-安装/卸载}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 1', 9);
 {添加/删除程序 属性-Windows安装程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 2', 9);
 {添加/删除程序 属性-启动盘}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 3', 9);
 {显示 属性-背景}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 0', 9); 
 {显示 属性-屏幕保护程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 1', 9);
 {显示 属性-外观}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 2', 9);
 {显示 属性-设置}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 3', 9);
 {Internet 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 0',
9);
 {Internet 属性-安全}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 1',
9);
 {Internet 属性-内容}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 2',
9);
 {Internet 属性-连接}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 3',
9);
 {Internet 属性-程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 4',
9);
 {Internet 属性-高级}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 5',
9);
 {区域设置 属性-区域设置}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 0', 9);
 {区域设置 属性-数字}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 1', 9);
 {区域设置 属性-货币}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 2', 9);
 {区域设置 属性-时间}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 3', 9);
 {区域设置 属性-日期}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 4', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Joy.cpl, 0', 9);


winexec('rundll32.exe shell32.dll, Control_RunDLL Joy.cpl, 1', 9);
 {鼠标 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Main.cpl', 9);
 {多媒体 属性-音频}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 0', 9);
 {多媒体 属性-视频}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 1', 9);
 {多媒体 属性-MIDI}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 2', 9);
 {多媒体 属性-CD音乐}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 3', 9);
 {多媒体 属性-设备}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 4', 9);
 {调制解调器 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Modem.cpl', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Netcpl.cpl', 9);
 {密码 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Password.cpl', 9);
 {扫描仪与数字相机 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sticpl.cpl', 9);
 {系统 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 0', 9);
 {系统 属性-设备管理器}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 1', 9);
 {系统 属性-硬件配置文件}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 2', 9);
 {系统 属性-性能}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 3', 9);
 {日期/时间 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL timedate.cpl', 9);
 {电源管理 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Powercfg.cpl', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Telephon.cpl', 9);
关于调用后的判断处理建议:
先声明一个cardinal类型的变量RtnCardinal获取返回值进行判断如:
RtnCardinal := winexec('rundll32.exe shell32.dll, Control_RunDLL
Telephon.cpl', 9);
 返回值 可能原因
 0 程序超出内存 
ERROR_BAD_FORMAT 程序为一个非法的Win32.EXE程序
ERROR_FILE_NOT_FOUND 指定文件没找到 
ERROR_PATH_NOT_FOUND 指定路径没找到

使用方法:
点击“开始-程式-Ms-Dos方式”,进入Dos视窗,然後键入"rundll32.exe
user.exe,restartwindows",再按下回车键,这时你将看到,机器被重启了!怎么样,是不是很有趣?
  当然,Rundll的功能绝不仅仅是重启你的机器。其实,Rundll者,顾名思义,执行Dll也,它的功能就是以命令列的方式呼叫Windows的动态链结库,Rundll32.exe与Rundll.exe的区别就在於前者是呼叫32位的链结库,而後者是运用於16位的链结库,它们的命令格式是:
  RUNDLL.EXE ,,
  这里要注意三点:1.Dll档案名中不能含有空格,比如该档案位於c:Program
Files目录,你要把这个路径改成c:Progra~1;2.Dll档案名与Dll入口点间的逗号不能少,否则程式将出错并且不会给出任何资讯!3.这是最重要的一点:Rundll不能用来呼叫含返回值参数的Dll,例如Win32API中的GetUserName(),GetTextFace()等。在Visual
Basic中,提供了一条执行外部程式的指令Shell,格式为:
  Shell “命令列”
  如果能配合Rundll32.exe用好Shell指令,会使您的VB程式拥有用其他方法难以甚至无法实现的效果:仍以重启为例,传统的方法需要你在VB工程中先建立一个模组,然後写入WinAPI的声明,最後才能在程式中呼叫。而现在只需一句:
  Shell “rundll32.exe
user.exe,restartwindows”就搞定了!是不是方便多了?
  实际上,Rundll32.exe在呼叫各种Windows控制面板和系统选项方面有著独特的优势。下面,我就将本人在因特网上收集的有关Rundll的指令列举如下(很有用的,能省去你很多呼叫Windows
API的时间!!),供大家在程式设计中引用:
  命令列: rundll32.exe shell32.dll,Control_RunDLL
  功能: 显示控制面板
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
  功能: 显示“控制面板-辅助选项-键盘”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
  功能: 显示“控制面板-辅助选项-声音”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
  功能: 显示“控制面板-辅助选项-显示”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
  功能: 显示“控制面板-辅助选项-滑鼠”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
  功能: 显示“控制面板-辅助选项-传统”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
  功能: 执行“控制面板-添加新硬体”向导。
  命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter
  功能: 执行“控制面板-添加新印表机”向导。
  命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
  功能: 显示 “控制面板-添加/删除程式-安装/卸载” 面板。
  命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
  功能: 显示 “控制面板-添加/删除程式-安装Windows” 面板。
  命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
  功能: 显示 “控制面板-添加/删除程式-启动盘” 面板。
  命令列: rundll32.exe syncui.dll,Briefcase_Create
  功能: 在桌面上建立一个新的“我的公文包”。
  命令列: rundll32.exe diskcopy.dll,DiskCopyRunDll
  功能: 显示复制软碟视窗
  命令列: rundll32.exe apwiz.cpl,NewLinkHere %1
  功能:
显示“建立快捷方式”的对话框,所建立的快捷方式的位置由%1参数决定。
  命令列: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0
  功能: 显示“日期与时间”选项视窗。


命令列: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1
  功能: 显示“时区”选项视窗。
  命令列: rundll32.exe rnaui.dll,RnaDial [某个拨号连接的名称]
  功能:
显示某个拨号连接的拨号视窗。如果已经拨号连接,则显示目前的连接状态的视窗。
  命令列: rundll32.exe rnaui.dll,RnaWizard
  功能: 显示“新建拨号连接”向导的视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
  功能: 显示“显示属性-背景”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
  功能: 显示“显示属性-萤屏保护”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
  功能: 显示“显示属性-外观”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
  功能: 显示显示“显示属性-属性”选项视窗。
  命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder
  功能: 显示Windows的“字体”档案夹。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
  功能: 同样是显示Windows的“字体”档案夹。
  命令列: rundll32.exe shell32.dll,SHformatDrive
  功能: 显示格式化软碟对话框。
  命令列: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,0
  功能: 显示“控制面板-游戏控制器-一般”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,1
  功能: 显示“控制面板-游戏控制器-进阶”选项视窗。
  命令列: rundll32.exe mshtml.dll,PrintHTML (HTML文档)
  功能: 列印HTML文档。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
  功能: 显示Microsoft Exchange一般选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
  功能: 显示“控制面板-滑鼠” 选项 。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
  功能: 显示 “控制面板-键盘属性-速度”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1
  功能: 显示 “控制面板-键盘属性-语言”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
  功能: 显示Windows“印表机”档案夹。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
  功能: 显示Windows“字体”档案夹。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
  功能: 显示“控制面板-输入法属性-输入法”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
  功能: 执行“添加新调制解调器”向导。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
  功能: 显示“控制面板-多媒体属性-音频”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
  功能: 显示“控制面板-多媒体属性-视频”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
  功能: 显示“控制面板-多媒体属性-MIDI”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
  功能: 显示“控制面板-多媒体属性-CD音乐”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
  功能: 显示“控制面板-多媒体属性-设备”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
  功能: 显示“控制面板-声音”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
  功能: 显示“控制面板-网路”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL odbccp32.cpl
  功能: 显示ODBC32资料管理选项视窗。
  命令列: rundll32.exe shell32.dll,OpenAs_RunDLL
功能: 显示指定档案(drive:pathfilename)的“打开方式”对话框。
  命令列: rundll32.exe shell32.dll,Control_RunDLL password.cpl
  功能: 显示“控制面板-密码”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
  功能: 显示“控制面板-电源管理属性”选项视窗。
  命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL
PrintersFolder
  功能: 显示Windows“印表机”档案夹。(同rundll32.exe
shell32.dll,Control_RunDLL main.cpl @2)
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
  功能: 显示“控制面板-区域设置属性-区域设置”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
  功能: 显示“控制面板-区域设置属性-数字”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
  功能: 显示“控制面板-区域设置属性-货币”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
  功能: 显示“控制面板-区域设置属性-时间”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
  功能: 显示“控制面板-区域设置属性-日期”选项视窗。
  命令列: rundll32.exe desk.cpl,InstallScreenSaver [萤屏保护档案名]
  功能:
将指定的萤屏保护档案设置为Windows的屏保,并显示萤屏保护属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
  功能: 显示“控制面板-系统属性-传统”属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
  功能: 显示“控制面板-系统属性-设备管理器”属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
  功能: 显示“控制面板-系统属性-硬体配置档案”属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
  功能: 显示“控制面板-系统属性-性能”属性视窗。
  命令列: rundll32.exe user.exe,restartwindows
  功能: 强行关闭所有程式并重启机器。
  命令列: rundll32.exe user.exe,exitwindows
  功能: 强行关闭所有程式并关机。
  命令列: rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
  功能: 显示“拨号属性”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL themes.cpl
  功能: 显示“桌面主旨”选项面板
  当然,不止是VisualBasic,象Delphi.VisualC++等其他程式设计语言也可以通过呼叫外部命令的方法来使用Rundll的这些功能,具体方法这里就不再详细叙述了。灵活的使用Rundll,一定会使你的程式设计轻轻松松,达到事半功倍的效果
posted @ 2005-12-14 19:04 konhon 优华 阅读(734) | 评论 (0)编辑 收藏

6.你以前的经验和我们现在的工作有哪些联系?

  分析:这个提问要求你在与其它求职者进行比较时,你要克服你背景中显示出来的任何弱点。

  回答对策:首先要介绍你的优势。假如其它求职者明显地比你受的教育多,工作经验多或知识多,那么你就要介绍你的优势。

  回答样板1:“如你所知,我刚刚结束电脑编程方面的加强培训。另外,我在企业方面有三年多的工作经验,其中包括在老板不在时管理小型企业。我在那学会了处理财务及基本的会计工作。我还盘算和管理过价值30万美元的产品。这些经历帮我认识企业使用电脑编程的作用。虽然我刚接触编程工作,我对电脑语言是熟悉的。我受的教育是全面的,我有300多个小时的电脑操作时间,这是我课程的一部分。因为我是新手,我决心比别人更努力地工作,以便及时完成任务。”

  评语:这种回答强调了可转换性的技能(会计工作知识)和适应性技能(按时完成任务,更努力工作)。这对缺乏工作经验的程序员来说是必要的。在这种情况下,在学校学的知识也非常重要,也要像“正式”工作那样予以强调。

  回答样板2:“在以前的工作中,我使用过很多与做好这项工作所需要的相同的技术。尽管是不同的企业,但管理企业都需要有我具有的组织和监督能力。在过去的七年里,我使我的部门成为我们公司最赢利的部门之一。在我工作期间,每年销售额平均上升30%,利润也提高30%。由于这是个老公司,这样的业绩是很不一般的,七年中我得到两次晋升,并很快地荣升到管理层。我想在你们这样小的、发展型公司接受挑战,我感到我的经验为我走向这一步做好了准备。”

  评语:回答者明白以前的工作领域与现在考虑的不同,但是,他强调了成绩和以前的成功。为完成这项工作,各种管理技术都会用到。回答中还谈到继续接受小公司工作挑战的动力。

  7.你对以后有什么打算?

  分析:这个问题是在考察你的工作动机。它是在探究是否可以信赖你把工作长久地干下去,而且干得努力。

  回答对策:你最好的对策就是诚实。这是一贯强调的。我并非是要你把负面的信息也摆出来,你应该准备坦率地、正面地回答雇主关心的问题。而哪些是雇主关心的问题取决于你介绍个人背景的具体情况。

  例如:

  -你对工作满意吗?(如果不满意你会离开公司吗?)

  -你想成家吗?(如果成家,你会停职去照料小孩吗?)

  -你是否有过短期工作后离开的历史?(如果有,你会不会也放弃这份工作呢?)

  -你是否刚搬到此地,是临时的或暂住人口?(如果是,你也不会在此地久居,对吗?)

  -你是否有比本工作要求更好的条件?(如果是,是什么使你不去高就呢?)

  -你有什么优势和承诺在工作中发展吗?(如果不是,谁需要一个没有优势和动力的人呢?)

  -有什么原因使你感到不满吗?(如果有,雇主自然会设法搞清楚。)

  回答样板1:对于一个刚刚参加工作的人,他可以这样回答:

  “我认识到要在这一领域造就自己,我很愿意从此开始。我想过我要做什么,而且肯定我的技能正是做好这项工作所需要的。例如,我善于与人打交道。在我过去的一项工作中,我每周向1000多名不同的人提供服务。在我18个月的工作中,我曾为72000多名顾客提供服务,从未得到一次正式的投诉。事实上,他们常因我的周到服务表扬我。我认识到我喜欢与公众接触,想到我能得到这份工作感到非常愉快。我想在工作中更好地学习,并与之共同进步。由于我对公司的贡献和价值不断提高,我希望能考虑使我得到更有责任的职务。”

  评语:雇主想了解你会长期工作下去并努力工作。这样的回答使对此表示关注的雇主感到安慰。(注意,这样的回答可以在快餐店工作获得的经验为背景。)

  回答样板2:对没有工作经验和只有各种短期工作经验的人,他们可以这样回答:

  “我做过几种工作(一种或失业),我认识到应该珍视体面的、稳定的工作。我的各种经验是一种财富,我学到很多东西,我可以把它们用于这项工作中去。我正在寻找一份可以安定下来,努力工作并持久下去的工作。”

  评语:这是一种可以接受的回答,只是回答太短,也没有提供证据。介绍自己的实例最好放在最后一句话之前。有些职务,如销售方面的工作,要求你有勃勃雄心,或者说是咄咄勇气。其它工作有对工作领域或专门机构的要求。你不会总能预料到雇主想要什么。如果你能正确地做,你就会具有任何工作要求的条件,而这一切只需要你用嘴讲出来,就是这么简单。
posted @ 2005-12-14 03:55 konhon 优华 阅读(508) | 评论 (0)编辑 收藏

8.你以前的雇主(教师、介绍人、管理员等)对你的评价如何?

  分析:这个问题与雇主的第二种期望有关。雇主想知道你的适应性技能--你是否容易相处,你是否是个好工人等等。你以前的雇主可能会谈到你存在的问题,当然,也可能不谈。你知道,许多雇主会在雇用你之前查阅你的证明信,如果你在面谈时谈的与你以前的雇主说的不一样,你就要倒霉了。

  回答对策:一定要与你以前的雇主讨论你的求职计划,也要征求你介绍人的意见。要明确地告诉他们你想找的工作种类以及你准备做好新工作的理由。假如以前的雇主会说一些不利于你的话,你要和他开诚布公地谈谈,看他会说写什么。

  如果你是被解雇或被迫辞职的,你可以向未来的雇主进行辩解。有很多成功的人与前雇主发生过冲突,如果能把这些冲突尽可能地讲出来,许多面谈者是会理解的。对和你关系不好的旧雇主,明智的办法是请他写一份文字证明材料,在这种情况下,他们不会给你极为不利的信。大的公司一般不接受电话提供证明材料,这可以使你大大地松一口气,只要给公司打个电话就清楚了。

  如果可能的话,使用那些说你好话的证明信。要是你的前任老板不愿这么做,找个愿意帮忙你的人便行了。如果你被解雇了,最好的对策是实话实说。但是对你的前任老板不要太苛刻,这样会让人觉得你是个好抱怨而无责任感的人。再者,你也不是一点错也没有。要先承认有这么回事,接着要趁机谈谈你从中得到的教训。

  回答样板:“我的三个前雇主都会说我工作努力,可靠、忠实,我离开那里是因为个人冲突。为此我深深地感到烦恼,只有放弃那里的工作。你可以给他们打电话,他们对我的评价是肯定。我认为还是向你们谈谈为好,我仍然尊敬他。我在那得到了几次晋升的机会,但是,随着我权力的增加,冲突也越发地多起来。我们主要是不同类型的人。我不知道问题会有那么严重,因为我一心只想工作。这是我的错,我认识到我应该更加注意人际关系的处理。”

  评语:回答中介绍了一些正面的技能,并用具体事例加以说明,因而是有力的。

  9.你为什么要找这样的职位?为什么是在这里

  分析:雇主想了解是否你是那种无论什么公司有活就行的人。果真如此,他或她就不会对你感兴趣。雇主想找那种想解决工作中问题的人。他们有理由认为这样的人工作起来更努力,更有效率,而那些想去特别的公司工作的人也是如此。

  回答对策:事先了解哪些工作适合你的技能和兴趣非常重要。要回答这个问题,就要谈到你选择工作目标的动机,那项工作要求的而你又具备的技能,各种专门培训,或与职务有关的教育证书。

  这个问题实际上有两方面的含意。一是为什么选择这个职位,二是为什么选择这个公司。如果你有选择这个公司的理由,或选择这个公司是你最大愿望,你就要准备回答为什么。如果可能的话,在面谈前,你要事先尽可能地对它进行了解。与别人联系得到详细的情报,或到图书馆查阅,看公司的年度报告,或任何能使你了解情况的方法都是必要的。

  回答样板:“我花费了很多时间考虑各种职业的可能性,我认为这方面的工作最适合我,原因是这项工作要求的许多技能都是我擅长的。举例来说,分析问题和解决问题是我的强项,在以前的工作中我能比别人更早发现和解决问题。有一次,我提出一项计划使得租借设备的退货率减少了15%,这听起来不算高,但是取得了年增长25000美元的好效益。而成本仅为100美元。目前你们公司似乎是能让我施展解决问题能力的地方。这个公司工作运行良好,发展迅速,善于接受新思想。你们的销售去年上涨了30%,而且你们准备引进几项大型新产品。如果我在这里努力工作,证实我自身的价值,我感到我有机会与公司共同发展。

  评语:这种回答巧妙地运用了“提供证据”技巧,这样的话符合一个出色的经理或优秀的秘书的身份。

  10.为什么不讲一讲你个人的情况?

  分析:一个好的面谈者很少这样直接地提出这个问题,通过随意的、友好的谈话也可以得到想了解的情况。在大多数情况下,面谈者会竭力地打探证明你不稳定或不可靠的信息。

  回答对策:还有其它一些可能使某个雇主关注的问题,以上问题只是对某些性格的人的推测。这都是些不相关的问题,但是,如果雇主想以此来了解你可否可靠,你就得全力以赴地去应付了。要记住即使是随意地闲谈也要避免提及隐晦的问题。在回答个人情况时,要态度友好而且自信。

  回答样板:

  有小孩子的家:“我有两个小孩,都在上学。他们和我的一个好朋友在一起,照料孩子不成问题。”

  一人主家:“我没有结婚,但是我有两个孩子。对我来说有一份稳定的收入很重要,照料孩子不成为问题。”

  年轻、单身:“我没有结婚,即使结婚,我也不会改变做专职工作的打算,我可以把全部精力用在工作上。”

  新搬来的:“我决定在DepressionCulch长期居住下来,我租了一套公寓,搬家公司的六辆车正在卸家俱。”

  抚养人:“我有个愉快的童年,我父母住的地方离我只需一小时飞机的路程,我一年去看他们几次。”

  闲暇时间:“在我不去上班时,我主要呆在家里。我爱参加社区组织的活动,我每周都要在教堂参加活动。”

  评语:上述回答都可以扩展开,可以做为你回答问题时的参考。这里要告诉面谈者的是你个人的情况不影响你的工作能力,而且,确实还能对你有帮助。如果你的个人生活会扰乱你的工作,想必雇主也会很快对你失去耐心的。这不是他们的问题,也不应该成为他们的问题。

posted @ 2005-12-14 03:54 konhon 优华 阅读(501) | 评论 (0)编辑 收藏

在面试前先了解、练习对几个很难的问题进行回答会帮助你对其他问题的回答做准备。有的问题问得比较多,有的较少但却是回答其它问题的基础。

  1.为什么不谈谈你自己?

  分析:这是个开放性问题。从哪里谈起都行,但是滔滔不绝地讲上一两个小时可不是雇主所希望的。这样的问题是测验你是否能选择重点并且把它清楚、流畅地表达出来。显然,提问者想让你把你的背景和想要得到的位置联系起来。

  回答对策:有几个基本的方法。一个是直接简要回答所问的问题,另一个是在回答前要求把问题问得更明确。在上述两种情况下,你都要很快地把你的答案转到你的技能、经验和你为得到目前这份工作接受的培训上来。

  回答样板:“我来自一个小家庭,有一个弟弟,父母都还在工作。中学毕业后,我攻读市场营销学士。日间在一家商业机构担任行销执行员,学了不少管理方面的知识。例如,我全权负责的一个批发销售公司的业务,销售总额一年为200万美元。在那里我学习到怎么管理人事,在压力下解决问题。我希望能更好的运用我的技能。我相信我的经验和学历将让我迎向未来更大的挑战。”

  评语:只简单的介绍了个人历史,很快的将重点话题转到与工作有关的技能和经验上来。你也可请面谈者把他确实想了解的东西集中到一点,如你可问:“你是不是想知道我受过的教育,或者与工作有关的技术和经验?”等,大多雇主都会乐意告诉你他们感兴趣的是什么?

  2.我为什么要雇用你?

  分析:这是个直接、正面的问题,尽管这个问题不会问得这样明确,但是会在其它问题之后被提出来,这个问题没有隐含的意思。

  回答对策:直接的问题需要直接了当回答,为什么他们要雇用你呢?最巧妙的回答对他们而不是对你有利。这个问题会使你向他们提供证据以证实你可以帮助他们改进工作效率,降低成本、增加销售、解决问题(如准时上班,改进对顾客的服务、组织一个或多个管理工作等)。

  回答样板:“我是个经验丰富的经理,在员工队伍建设方面,从组织项目的实施到鼓励员工合作,我得心应手。多年来,我已经掌握了一套雇人和留人的技巧。此外,我还擅长帮助公司顺利实现技术改造和员工培训。我经常对主要客户进行示范讲解,我们的销售额在过去两年平均增加了87%。”

  评语:在回答中,以实例提供有力的证据,直接而自信地推销自己。

  3.你有哪些主要的优点?

  分析:像前面问题一样,这个问题问得相当直接,但是有一点隐含。

  回答对策:你的回答应当首先强调你适应的或已具有的技能。雇用你的决定在很大程度上取决于这些技能,你可以在后面详细介绍你与工作有关的技能。回答时,一定要简单扼要。

  回答样板:“我具有朝著目标努力工作的能力。一旦我下定决心做某事,我就要把它做好,例如,我的志愿是成为一个出色的公关经理,我喜欢接触不同的人,服务人群,为了实现这个目标。我目前正在修读有关课程。”

  评语:如“我的学习能力、适应能力很强。”“人际关系很好”等都是可提出的优点,但尽可能要提供与工作相关的证据,这会使你与众不同。

  4.你有哪些主要的缺点?

  分析:这是个棘手的问题。若照实的回答,你会毁了工作,雇主试图使你处于不利的境地,观察你在类似的工作困境中将作出什么反应。

  回答对策:回答这样的问题应诚实。完满地回答应该是用简洁正面的介绍抵消反面的问题。

  回答样板1:“工人们指责我对工作太投入。我经常提前一点上班安排好我的工作,晚上晚一点下班,使要干的事得以完成。”

  回答样板2:“我需要学会更耐心一点。我的性子比较急,我总要我的工作赶在第一时间完成。我不能容忍工作怠慢。”

  评语:回答的虽是自身的缺点,但却表现了正面的效果,对工作的积极抵消了反面。

  5.你想得到的薪水是多少?

  分析:如果你对薪酬的要求太低,那显然贬低自己的能力;如果你对薪酬的要求太高,那又会显得你分量过重,公司受用不起。一些雇主通常都事先对求聘的职位定下开支预算,因而他们第一次提出的价钱往往是他们所能给予的最高价钱。他们问你只不过想证实一下这笔钱是否足以引起你对该工作的兴趣。

  回答对策:在商谈薪酬之前,你已经调查了解了自己所从事工作的合理的市场价值。在与对方商谈时,不妨尽可能插入“合理的和市场价值”语汇。记得,商谈时降低原来的开价轻而易举,但一旦开出低价后想再提上去就难乎其难。

  回答样板1:如果你尚未彻底表现自我价值,面试者就提此问题考你,你不妨参考以下答案:

  “钱不是我唯一关心的事。我想先谈谈我对贵公司所能做的贡献--如果您允许的话。”

  “我对工资没有硬性要求。我相信贵公司在处理我的问题上会友善合理。我注重的是找对工作机会,所以只要条件公平,我则不会计较太多。”

  回答样板2:如果你已经阐明该职位的重要性,可是对方仍旧告诉你给你的报酬已是最好的。您不妨指出它的工作性质实际上值得你获得更高的报酬;阐明你将如何通过努力缩减公司的开支;说明在工作中你得自我承担哪些费用等,以证明你对公司的价值,和表明你要求更高报酬是以你的工作表现为前提的。但是如果对方不愿妥协,在你未得到肯定的工作答复之前,不要使雇主排除对你的考虑。你可以问:‘你们决定雇用我了吗?”如果答案是肯定的,报酬却使你不愿接受,你可以这样拒绝:

  “谢谢你给我提供工作机会。这个职位我很想的到,但是,工资比我想要的低,这是我无法接受这份工作的原因之一。也许你会重新考虑,或者以后能有使我对你们更有价值的工作时再考虑我。”

  评语:即使拒绝对方,也要为协商留有余地。如果雇主需要你,他会乐于满足你的要求。一旦你对他们提出的标准说“不”,交易就做不成了.

posted @ 2005-12-14 03:53 konhon 优华 阅读(494) | 评论 (0)编辑 收藏

 

方法一:
public static String Conversion(String s)
throws IOException
{
String s1 
= new String();
String s2 
= new String();
byte abyte0[] = s.getBytes("Unicode");
for(int j = 2; j < abyte0.length; j += 2)
{
String s3 
= Integer.toHexString(abyte0[j + 1]);
int i = s3.length();
if(i < 2)
s1 
= s1 + "&#x" + "0" + s3;
else
s1 
= s1 + "&#x" + s3.substring(i - 2);
s3 
= Integer.toHexString(abyte0[j]);
= s3.length();
if(i < 2)
s1 
= s1 + "0" + s3 + ";";
else
s1 
= s1 + s3.substring(i - 2+ ";";
}


return s1;
}

方法二:
public static String enCode(String str)
   
{
    
   
if(str==null)return "";
   String hs
="";

   
try
   
{
   
byte b[]=str.getBytes("UTF-16");
   
//System.out.println(byte2hex(b));
   for (int n=0;n<b.length;n++)
   
{
   str
=(java.lang.Integer.toHexString(b[n] & 0XFF));
   
if (str.length()==1)
   hs
=hs+"0"+str;
   
else
   hs
=hs+str;
   
if (n<b.length-1)hs=hs+"";
   }

   
//去除第一个标记字符
   str= hs.toUpperCase().substring(4);
   
//System.out.println(str);
   char[] chs=str.toCharArray();
   str
="";
   
for(int i=0;i<chs.length;i=i+4)
   
{
   str
+="&#x"+chs[i]+chs[i+1]+chs[i+2]+chs[i+3]+";";
   }

   
return str;
   }

   
catch(Exception e)
   
{
   System.out.print(e.getMessage());
   }

   
return str;
   }

posted @ 2005-12-14 01:29 konhon 优华 阅读(4069) | 评论 (1)编辑 收藏

对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。

问题一:我声明了什么!

String s = "Hello world!";

许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:

String string = s;

我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

问题二:"=="和equals方法究竟有什么区别?

==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。

根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。

看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){

return this==o;

}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。

问题三:String到底变了没有?

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:

String s = "Hello";
s = s + " world!";

s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。

问题四:final关键字到底修饰了什么?

final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。

引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误

引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过

可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。

问题五:到底要怎么样初始化!

本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数

对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。

int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。

对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。

对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!

其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。

问题六:instanceof是什么东东?

instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:

String s = "I AM an Object!";
boolean isObject = s instanceof Object;

我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}

在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。

然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:

public double calculate(PhoneBill bill) {
//计算电话账单
}

public double calculate(GasBill bill) {
//计算燃气账单
}

所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。

posted @ 2005-12-12 19:07 konhon 优华 阅读(391) | 评论 (0)编辑 收藏

http://javaalmanac.com/egs/
almost all there with examples

Free, good, and official Java tutorial:
http://java.sun.com/docs/books/tutorial/

Thinking in Java 3rd Edition,中文版 + English version
http://java.galesoft.com/

Code Conventions for the JavaTM Programming Language
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

Java API doc
http://java.sun.com/j2se/1.4.2/docs/api/index.html
http://java.sun.com/j2se/1.5.0/docs/api/index.html

api 中文版 and many others
See links in 『 Java新技术,新闻,应用与资源等 』

Excellent article about Runtime from JavaWorld!
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

posted @ 2005-12-12 19:04 konhon 优华 阅读(355) | 评论 (0)编辑 收藏

仅列出标题
共21页: First 上一页 6 7 8 9 10 11 12 13 14 下一页 Last