博文
深入理解嵌套类和内部类(2006-04-23 10:54:00)
摘要:
一、什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种: 其一、在一个类(外部类)中直接定义的内部类; 其二、在一个方法(外部类的方法)中定义的内部类; 其三、匿名内部类。下面,我将说明这几种嵌套类的使用及注意事项。
二、静态嵌套类 如下所示代码为定义一个静态嵌套类,
public class StaticTest { private static String name = "javaJohn"; private String id = "X001"; static class Person{ private String address = "swjtu,chenDu,China"; public String mail = "josserchai@yahoo.com";//内部类公有成员 public void display(){ //System.out.println(id);//不能直接访问外部类的非静态成员 System.out.println(name);//只能直接访问外部类的静态成员 System.out.println("Inner "+address);//访问本内部类成员。 }&nbs......
用AudioClip播放声音(2006-04-23 10:52:00)
摘要: import java.applet.AudioClip; import javax.swing.*; public class SoundTest{ ClassLoader classLoader = this.getClass().getClassLoader(); AudioClip wav = JApplet.newAudioClip(classLoader.getResource("Stest16.wav")); public void play(){ wav.play(); } public static void main(String args[]){ SoundTest aa=new SoundTest(); aa.play(); /* AudioClip wav; try{ AudioClip wav=JApplet.newAudioClip(Class.forName("SoundTest").ge......
javadoc的用法(2006-04-23 10:51:00)
摘要:我们知道Java中有三种注释语句: 1.//用于单行注释。 2./*...*/用于多行注释,从/*开始,到*/结束,不能嵌套。 3./**...*/则是为支持jdk工具javadoc.exe而特有的注释语句。 javadoc工具能从java源文件中读取第三种注释,并能识别注释中用@标识的一些特殊变量(见表),制作成Html格式的类说明文档。javadoc不但能对一个java源文件生成注释文档,而且能对目录和包生成交叉链接的html格式的类说明文档,十分方便。 注释中可以出现的关键字,以@开头: @author 作者名 @version 版本标识 @parameter 参数名及其意义 @since 最早出现的JDK版本 @return 返回值 @throws 异常类及抛出条件 @deprecated 引起不推荐使用的警告 @see 交叉参考 下面是javadoc.exe的用法 C:\java>javadoc -help C:\java>javadoc -help usage: javadoc [options] [packagenames] [sourcefiles] [classnames] [@files] -overview <file> &n......
Java性能优化技巧集锦 (2006-04-22 18:14:00)
摘要:可供程序利用的资源是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。
可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。本文讨论的主要是如何提高代码的效率。
一、通用篇
“通用篇”讨论的问题适合于大多数Java应用。
1.1 不用new关键词创建类的实例
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:
public static Credit getNewCredit() { return new Credit(); }
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit(); public static Credit getNewCredit() { return (Credit) BaseCredit.clone(); }
上面的思路对于数组处理同样很有用。
1.2 使用非阻塞I/O
版本较低的JDK不支持非阻塞I/O API。为避免I/O阻塞,一些应用采用了创建大量线程的办法(在较好的情况下,会使用一个缓冲池)。这种技术可以在许多必须支持并发I/O流的应用中见到,如Web服务器、报价和拍卖应用等。然而,创建Java线程需要相当可观的开销。
JDK 1.4引入了非阻塞的I/O库(java.nio)。如果应用要求使用版本较早的JDK,在这里有一个支持非阻塞I/O的软件包。
1.3 慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟......
JDK1.5爱之初体验(2006-04-22 18:12:00)
摘要:jdk1.5之初体验----------------
Sun公司的JDK1.5终于出了正式版了,对于我们Java fans来说真是一个好消息!这回JDK的更新听说是1995年Java发布以来对Java语法方面作了最大的更新(以前大都是对Java类库的扩充),引入了许多激动人心的新特性。呵呵,闲话少说,现在大家和jellen一起来看看JDK1.5里面到底有什么好东东。
1 - 泛性编程哇,这可是以前C++的金字招牌啊,现在Java里面也可以使用了。我们先看看以前没有泛性时的Java:
ArrayList list = new ArrayList();list.add(new String("Hello!"));System.out.println((String)list.get(0));
是不是有点罗嗦麻烦,要转来转去才能打印出那个:"hello!"现在我们来看新的代码:
ArrayList<String> list = new ArrayList<String>();list.add(new String("Hello!"));System.out.println(list.get(0));
恩,确实简洁多了,是不是?泛性特征把类型引进了集合,使得我们的代码更简洁易懂。
2 - 自动装箱/拆箱
这也是一个对我们程序员非常贴心的设计,想想以前我们要把int等基本数据装进ArrayList等集合时的麻烦吧:
ArrayList list = new ArrayList();Integer number = new Integer(10); //先要把数字弄进包装类list.add(number);
//然后想要取出这个数字也极其麻烦,看看这个式子,晕啊!int i = ((Integer)list.get(0)).intValue();
现在好了,同样的代码在JDK1.5中:
ArrayList<Integer> list = new ArrayList<Integer>();list.add(10);int i = list.get(0);
真是非常方便啊!
3 - 增强的循环结构
呵呵,这可是一个非常厉害的东东啊,不能小视。以前的for(;;)循环我想大家都很熟悉,......
如何创建自解压的jar文件(2006-04-22 18:11:00)
摘要:这是我从网上看一遍文章做的练习。自解压程序是 ZipSelfExtractor.java(请下载),作者为 Z.S. Jin。一、自解压jar文件的优点: 自解压jar文件可以在任意支持java的平台上解开。二、 制作自解压jar文件的过程如下:1、修改MANIFEST.MF文件 随便找一个jar格式的文件,如jstl.jar,先用winzip或winRAR解压,这是因为我们要修改其中的MANIFEST.MF文件。其实修改很简单,只要在MANIFEST.MF文件中指定(或修改)这个基于java 的解压程序包含main()方法的类的名称为: Main-Class: ZipSelfExtractor
如将jstl.jar文件中包含的MANIFEST.MF文件:Manifest-Version: 1.0Ant-Version: Apache Ant 1.5.2 Created-By: 1.4.1_02-b06 (Sun Microsystems Inc.)Specification-Title: JavaServer Pages Standard Tag Library (JSTL)Specification-Version: 1.1Implementation-Title: JavaServer Pages Standard Tag Library API Reference ImplementationImplementation-Version: 1.1.0-D13Implementation-Vendor: Sun Microsystems, Inc.Implementation-Vendor-Id: com.sunExtension-Name: javax.servlet.jsp.jstl
改为:Manifest-Version: 1.0Main-Class: ZipSelfExtractorAnt-Version: Apache Ant 1.5.2 Created-By: 1.4.1_02-b06 (Sun Microsystems Inc.)Specification-Title: JavaServer Pages Standard Tag Library (JSTL)Specif......
Unicode简介(2006-04-22 18:10:00)
摘要: Unicode是一种字符编码规范 ,先从ASCII说起。ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits) 因此,ASCII编码可以表示的最大字符数是256,其实英文字符并没有那么多,一般只用前128个(最高位为0),其中包括了控制字符、数字、大小写字母和其他一些符号,而最高位为1的另128个字符被成为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其他符号
这种字符编码规范显然用来处理英文没有什么问题,(实际上也可以用来处理法文、德文等一些其他的西欧字符,但是不能和英文通用),但是面对中文、阿拉伯文之类复杂的文字,255个字符显然不够用。于是,各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312-80”,它是和ASCII兼容的一种编码规范,其实就是利用扩展ASCII没有真正标准化这一点,把一个中文字符用两个扩展ASCII字符来表示。
但是这个方法有问题,最大的问题就是,中文文字没有真正属于自己的编码,因为扩展ASCII码虽然没有真正的标准化,但是PC里的ASCII码还是有一个事实标准的(存放着英文制表符),所以很多软件利用这些符号来画表格。这样的软件用到中文系统中,这些表格符就会被误认作中文字,破坏版面。而且,统计中英文混合字符串中的字数,也是比较复杂的,我们必须判断一个ASCII码是否扩展,以及它的下一个ASCII是否扩展,然后才“猜”那可能是一个中文字,总之当时处理中文是很痛苦的。而更痛苦的是GB2312是国家标准,台湾当时有一个Big5编码标准,很多编码和GB是相同的,所以……,嘿嘿。
这时候,我们就知道,要真正解决中文问题,不能从扩展ASCII的角度入手,也不能仅靠中国一家来解决。而必须有一个全新的编码系统,这个系统要可以将中文、英文、法文、德文……等等所有的文字统一起来考虑,为每个文字都分配一个单独的编码,这样才不会有上面那种现象出现。
于是,Unicode诞生了。
Unicode有两套标准,一套叫Unicode-16UCS-2,用2个字节为字符编码,另一套叫Unicode-32UCS-......
将JAVA编译为EXE的几种方法(2006-04-19 19:46:00)
摘要:将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开发的一款本地编译器,本来可以从该公司的网页上免费下载的,不过目前在该公司的主页上找不到了。......
java 通过jdbc连接sql server数据库的常见问题(2006-04-15 11:18:00)
摘要:在通过jdbc连接SQL Server经常回出现[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket,原因如下:1,通过url连接的时候指定的服务器名称或者服务器地址不正确,这一点你可以通过ping来验证。2,指定的服务器上的sql server的服务没有启动,你可以通过sql server的查询工具来验证这个问题。3,指定端口错误,sql server的默认端口是1433。4,sql server没有提供tcp/ip的服务,你可以通过sql server的管理工具来查看这个问题。5,如果你的系统是 windows XP 或者 Windows 2003,那么你的sql server一定要升级到sp3以上.解决了如上问题一般就不会出现连接问题了。......
各种排序算法java实现 (2006-04-15 02:56:00)
摘要:
插入排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;/** * @author treeroot * @since 2006-2-2 * @version 1.0 */public class InsertSort implements SortUtil.Sort{
/* (non-Javadoc) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */ public void sort(int[] data) { int temp; for(int i=1;i<data.length;i++){ for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){ SortUtil.swap(data,j,j-1); } } }
}冒泡排序:
package org.rut.util.algorithm.supp......
