??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品在线免费观看视频,亚洲 综合 国产 欧洲 丝袜,亚洲视频国产视频http://www.tkk7.com/os586/category/8044.html态度军_一切,思想军_\zh-cnTue, 27 Feb 2007 10:54:59 GMTTue, 27 Feb 2007 10:54:59 GMT60Java 堆与栈的使用http://www.tkk7.com/os586/archive/2006/10/27/77676.html水煮三国水煮三国Fri, 27 Oct 2006 08:07:00 GMThttp://www.tkk7.com/os586/archive/2006/10/27/77676.htmlhttp://www.tkk7.com/os586/comments/77676.htmlhttp://www.tkk7.com/os586/archive/2006/10/27/77676.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/77676.htmlhttp://www.tkk7.com/os586/services/trackbacks/77676.htmlJava栈与?-----------转自javaeye.com

----对这两个概念的不明好久,l于扑ֈ一好文,拿来׃nQhttp://www.duduwolf.com/cmd.asp?act=tb&id=3 Q?/p>

1. ?stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同QJava自动理栈和堆,E序员不能直接地讄栈或堆?

2. 栈的优势是,存取速度比堆要快Q仅ơ于直接位于CPU中的寄存器。但~点是,存在栈中的数据大与生存期必L定的,~Z灉|性。另外,栈数据可以共享,详见W?炏V堆的优势是可以动态地分配内存大小Q生存期也不必事先告诉编译器QJava的垃圾收集器会自动收走这些不再用的数据。但~点是,׃要在q行时动态分配内存,存取速度较慢?/p>

3. Java中的数据cd有两U?/p>

一U是基本cd(primitive types), 共有8U,即int, short, long, byte, float, double, boolean, char(注意Qƈ没有string的基本类?。这U类型的定义是通过诸如int a = 3; long b = 255L;的Ş式来定义的,UCؓ自动变量。值得注意的是Q自动变量存的是字面|不是cȝ实例Q即不是cȝ引用Q这里ƈ没有cȝ存在。如int a = 3; q里的a是一个指向intcd的引用,指向3q个字面倹{这些字面值的数据Q由于大可知,生存期可?q些字面值固定定义在某个E序块里面,E序块退出后Q字D值就消失?Q出于追求速度的原因,存在于栈中?/p>

另外Q栈有一个很重要的特D性,是存在栈中的数据可以共享。假设我们同时定义:

代码
						int
						a
						=
						3
						;
						
int b = 3Q?/span>

~译器先处理int a = 3Q首先它会在栈中创徏一个变量ؓa的引用,然后查找有没有字面gؓ3的地址Q没扑ֈQ就开辟一个存?q个字面值的地址Q然后将a指向3的地址。接着处理int b = 3Q在创徏完b的引用变量后Q由于在栈中已经?q个字面|便将b直接指向3的地址。这P出Ca与b同时均指?的情c?

特别注意的是Q这U字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了q个对象的内部状态,那么另一个对象引用变量也卛_反映个变化。相反,通过字面值的引用来修改其|不会D另一个指向此字面值的引用的g跟着改变的情c如上例Q我们定义完a与b的值后Q再令a=4Q那么,b不会{于4Q还是等?。在~译器内部,遇到a=4Q时Q它׃重新搜烦栈中是否?的字面|如果没有Q重新开辟地址存放4的|如果已经有了Q则直接a指向q个地址。因此a值的改变不会影响到b的倹{?/p>

另一U是包装cL据,如Integer, String, Double{将相应的基本数据类型包装v来的cR这些类数据全部存在于堆中,Java用new()语句来显C地告诉~译器,在运行时才根据需要动态创建,因此比较灉|Q但~点是要占用更多的时间?4. String是一个特D的包装cL据。即可以用String str = new String("abc");的Ş式来创徏Q也可以用String str = "abc"Q的形式来创?作ؓҎQ在JDK 5.0之前Q你从未见过Integer i = 3;的表辑ּQ因为类与字面值是不能通用的,除了String。而在JDK 5.0中,q种表达式是可以的!因ؓ~译器在后台q行Integer i = new Integer(3)的{?。前者是规范的类的创E,卛_Java中,一切都是对象,而对象是cȝ实例Q全部通过new()的Ş式来创徏。Java中的有些c,如DateFormatc,可以通过该类的getInstance()Ҏ来返回一个新创徏的类Q似乎违反了此原则。其实不然。该c运用了单例模式来返回类的实例,只不q这个实例是在该cd部通过new()来创建的Q而getInstance()向外部隐藏了此细节。那Z么在String str = "abc"Q中Qƈ没有通过new()来创建实例,是不是违反了上述原则Q其实没有?/p>

5. 关于String str = "abc"的内部工作。Java内部此语句转化Z下几个步骤:

(1)先定义一个名为str的对Stringcȝ对象引用变量QString strQ?/p>

(2)在栈中查找有没有存放gؓ"abc"的地址Q如果没有,则开辟一个存攑֭面gؓ"abc"的地址Q接着创徏一个新的Stringcȝ对象oQƈo的字W串值指向这个地址Q而且在栈中这个地址旁边Cq个引用的对象o。如果已l有了gؓ"abc"的地址Q则查找对象oQƈq回o的地址?/p>

(3)str指向对象o的地址?/p>

值得注意的是Q一般StringcM字符串值都是直接存值的。但像String str = "abc"Q这U场合下Q其字符串值却是保存了一个指向存在栈中数据的引用Q?/p>

Z更好地说明这个问题,我们可以通过以下的几个代码进行验证?/p>

代码
Stringstr1="abc";
Stringstr2="abc";
System.out.println(str1==str2);//true

注意Q我们这里ƈ不用str1.equals(str2)Q的方式Q因比较两个字W串的值是否相{?=PҎJDK的说明,只有在两个引用都指向了同一个对象时才返回真倹{而我们在q里要看的是Qstr1与str2是否都指向了同一个对象?
l果说明QJVM创徏了两个引用str1和str2Q但只创Z一个对象,而且两个引用都指向了q个对象?

我们再来更进一步,以上代码改成:

代码
Stringstr1="abc";
Stringstr2="abc";
str1="bcd";
System.out.println(str1+","+str2);//bcd,abc
System.out.println(str1==str2);//false

q就是说Q赋值的变化D了类对象引用的变化,str1指向了另外一个新对象Q而str2仍旧指向原来的对象。上例中Q当我们str1的值改?bcd"ӞJVM发现在栈中没有存放该值的地址Q便开辟了q个地址Qƈ创徏了一个新的对象,其字W串的值指向这个地址?/p>

事实上,Stringc被设计成ؓ不可改变(immutable)的类。如果你要改变其|可以Q但JVM在运行时Ҏ新值悄悄创Z一个新对象Q然后将q个对象的地址q回l原来类的引用。这个创E虽说是完全自动q行的,但它毕竟占用了更多的旉。在Ҏ间要求比较敏感的环境中,会带有一定的不良影响?/p>

再修改原来代码:

代码
Stringstr1="abc";
Stringstr2="abc";

str1="bcd";

Stringstr3=str1;
System.out.println(str3);//bcd

Stringstr4="bcd";
System.out.println(str1==str4);//true


str3q个对象的引用直接指向str1所指向的对?注意Qstr3q没有创建新对象)。当str1改完其值后Q再创徏一个String的引用str4Qƈ指向因str1修改D创建的新的对象。可以发玎ͼq回str4也没有创建新的对象,从而再ơ实现栈中数据的׃n?

我们再接着看以下的代码?/p>

代码
Stringstr1=newString("abc");
Stringstr2="abc";
System.out.println(str1==str2);//false

创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?/p>

String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false

创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?/p>

以上两段代码说明Q只要是用new()来新建对象的Q都会在堆中创徏Q而且其字W串是单独存值的Q即使与栈中的数据相同,也不会与栈中的数据共享?/p>

6. 数据cd包装cȝg可修攏V不仅仅是Stringcȝg可修改,所有的数据cd包装c都不能更改其内部的倹{?7. l论与徏议:

(1)我们在用诸如String str = "abc"Q的格式定义cLQL惛_然地认ؓQ我们创ZStringcȝ对象str。担心陷阱!对象可能q没有被创徏Q唯一可以肯定的是Q指向Stringcȝ引用被创Z。至于这个引用到底是否指向了一个新的对象,必须Ҏ上下文来考虑Q除非你通过new()Ҏ来显要地创徏一个新的对象。因此,更ؓ准确的说法是Q我们创Z一个指向Stringcȝ对象的引用变量strQ这个对象引用变量指向了某个gؓ"abc"的StringcR清醒地认识到这一点对排除E序中难以发现的bug是很有帮助的?/p>

(2)使用String str = "abc"Q的方式Q可以在一定程度上提高E序的运行速度Q因为JVM会自动根据栈中数据的实际情况来决定是否有必要创徏新对象。而对于String str = new String("abc")Q的代码Q则一概在堆中创徏新对象,而不其字符串值是否相{,是否有必要创建新对象Q从而加重了E序的负担。这个思想应该是n元模式的思想Q但JDK的内部在q里实现是否应用了这个模式,不得而知?/p>

(3)当比较包装类里面的数值是否相{时Q用equals()ҎQ当试两个包装cȝ引用是否指向同一个对象时Q用==?/p>

(4)׃Stringcȝimmutable性质Q当String变量需要经常变换其值时Q应该考虑使用StringBufferc,以提高程序效率?/p>

水煮三国 2006-10-27 16:07 发表评论
]]>
NoClassDefDoundErr与ClassNotFoundException区别 http://www.tkk7.com/os586/archive/2006/10/27/77564.html水煮三国水煮三国Fri, 27 Oct 2006 02:53:00 GMThttp://www.tkk7.com/os586/archive/2006/10/27/77564.htmlhttp://www.tkk7.com/os586/comments/77564.htmlhttp://www.tkk7.com/os586/archive/2006/10/27/77564.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/77564.htmlhttp://www.tkk7.com/os586/services/trackbacks/77564.htmlNoClassDefDoundErr与ClassNotFoundException区别

作?langm

版权声明Q本文可以自p{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及本声?
作?langm
原文:http://www.matrix.org.cn/resource/article/44/44056_NoClassDefDoundErr.html
关键?NoClassDefDoundErr ClassNotFoundException

在读q篇文章之前Q你最好了解一下Java的Exception机制?/p>

也许你在开发的q程中经常地见到ClassNotFoundException和NoClassDefFoundErrq两个异常,每每看到之后Q都会一概而论的是cL有找刎ͼ但有些时候见C们的时候又有些疑惑Q至我是这PQؓ什么Java要用两个异常来表C类定义没有扑ֈ那?他们之间有什么区别那Q?/p>

正y今天我又到了这个问题,Z的仔l研I了一下这两个异常的区别?
首先Q?
ClassNotFoundException直接l承与ExceptionQ它是一个checked的异常?
NoClassDefFoundErr l承自Error->LinkageError Q它是一个unchecked的异常?/p>

下面让我们看一下两个异常在API文档中的说明

ClassNotFoundExceptionQ?
当应用尝试用字符串名U通过下面的方法装载一个类时这个类的定义却没有扑ֈ时会抛出的异常?
Class.forName
ClassLoader.findSystemClass
ClassLoader.loadClass

NoClassDefFoundErrQ?
当JVM或者ClassLoader实例试装蝲一个类的定义(q通常是一个方法调用或者new表达式创Z个实例过E的一部分Q而这个类定义q没有找时所抛出的错误?
当编译的时候可以找到这个类的定义,但是以后q个cM再存在?/p>

q比较显而易见了吧,d文档是很重要的事情。这里我p一下我对这两个cȝ区别的理解?/p>

ClassNotFoundException异常只出现在你的应用E序d的装载类的过E中Q这个异常很多时候出现在我们的应用框架在初始化或者运行中动态装载已配置的类的过E中。这U情况下我们应该首先查我们的配置或者参数是否错误,是否企图装蝲一个ƈ不存在的c,如果配置没有错误Q我们就应该查看Classpath是否配置错误而导致ClassLoader无法扑ֈq个c,也应该检查要装蝲的类是否在一个jar包中而我们在引入q个jar包的q程中是否有遗漏或错误(q里jar包的版本也是一个需要格外注意的问题Q很多时候؜qjar包版本会造成太多的麻烦)?

NoClassDefFoundErr异常一般出现在我们~译环境和运行环境不一致的情况下,是说我们有可能在编译过后更改了Classpath或者jar包所以导致在q行的过E中JVM或者ClassLoader无法扑ֈq个cȝ定义Q我曄在编译后作了一ơjar包的清理Q然后应用就送给了我一个这LC物Q?/p>

我们l常用SDK开发应用,开发的q程中要引入很多jar包,有些SDK也会讑֮自己的Classpath。编译过E结束后在运行的q程中就要将已开发的应用和所有引入的jar包拷贝到应用服务器的相应目录下才可以q行Q而应用服务器使用的Classpath也很有可能与SDK的不同,在这个过E中有很大的几率造成双方环境不一致。所以很多开发者就会遇到在SDK中可以编译,q行也没有问题,但是同样的程序放到应用服务器上就出现NoClassDefFoundErrq个异常q种情况Q这是让初学者很挠头的一个问题?/p>

以上是我对q两个异常的一点个人理解,希望对各位开发者有所帮助Q可以让各位开发者在以后的开发过E中能够更快的找到问题所在。祝开发顺?/p>

水煮三国 2006-10-27 10:53 发表评论
]]>
澄清Java语言接口与承的本质http://www.tkk7.com/os586/archive/2006/10/26/77316.html水煮三国水煮三国Thu, 26 Oct 2006 00:55:00 GMThttp://www.tkk7.com/os586/archive/2006/10/26/77316.htmlhttp://www.tkk7.com/os586/comments/77316.htmlhttp://www.tkk7.com/os586/archive/2006/10/26/77316.html#Feedback3http://www.tkk7.com/os586/comments/commentRss/77316.htmlhttp://www.tkk7.com/os586/services/trackbacks/77316.html
大多Ch认ؓQ接口的意义在于替多重l承。众所周知Java没有c++那样多重l承的机Ӟ但是却能够实作多个接口。其实这样做是很牵强的,接口和承是完全不同的东西,接口没有能力代替多重l承Q也没有q个义务。接口的作用Q一a以蔽之,是标志cȝcdQtype of classQ。把不同cd的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,最能体现这一点的是接口。ؓ什么我们讨计模式都只针对具备了抽象能力的语aQ比如c++、java、c#{)Q就是因计模式所研究的,实际上就是如何合理的L象。(cowboy的名a是“抽象就是抽d的部分”,看似调侃Q实乃至理)?br />
  设计模式中最基础的是工厂模式QFactoryQ,在我最q的一个很单的应用中,我想量的让我的E序能够在多个数据库间移植,当然Q这涉及很多问题Q单是如何兼容不同DBMS的SQLp人头痛。我们不妨先把问题简单化Q只考虑如何q接不同的数据库?br />
  假设我有很多个类Q分别是Mysql.java、SQLServer.java、Oracle.java、DB2.javaQ他们分别连接不同的数据库,l一q回一个Connection对象Qƈ且都有一个closeҎQ用于关闭连接。只需要针对你的DBMSQ选择不同的类Q就可以用了Q但是我的用户他会用什么数据库Q我不知道,我希望的是尽量少的修改代码,p满他的需要。我可以抽象如下接口Q?br />
package org.bromon.test;
public interface DB
{
  java.sql.Connection openDB(String url,String user,String password);
  void close();
}

  q个接口只定义两个方法,没有M有实际意义的代码Q具体的代码由实作这个接口的cLl出Q比如Mysql.javaQ?br />
Package org.bromon.test;
import java.sql.*;
public class Mysql implements DB
{
  private String url=”jdbc:mysql:localhost:3306/test?
  private String user=”root?
  private String password=”?
  private Connection conn;
  public Connection openDB(url,user,password)
  {
    //q接数据库的代码
  }

  public void close()
  {
    //关闭数据?br />  }
}

  cM的当然还有Oracle.java{等Q接口DBl这些类归了个类Q在应用E序中我们这样定义对象:

  org.bromon.test.DB myDB;

  使用myDB来操作数据库Q就可以不用实际上我所使用的是哪个c,q就是所谓的“开-闭”原则。但是问题在于接口是不能实例化的QmyDB=new DB()Q这L代码是绝寚w误的Q我们只能myDB=new Mysql()或者myDB=new Oracle()。麻烦了Q我q是需要指定具体实例化的是哪个c,用了接口跟没用一栗所以我们需要一个工厂:

package org.bromon.test;
public class DBFactory
{
  public static DB Connection getConn()
  {
    Return(new Mysql());
  }
}

  所以实例化的代码变成:myDB=DBFactory.getConn()Q?br />
  q就?3U模式中最基础的普通工?Factory)Q工厂类负责具体实例化哪个类Q而其他的E序逻辑都是针对DBq个接口q行操作Q这是“针Ҏ口编E”。责任都被推卸给工厂cMQ当然你也可以l定义工厂接口,l箋把责M抛,q就演变成抽象工?Abstract Factory)?br />
  整个q程中接口不负责M具体操作Q其他的E序要连接数据库的话Q只需要构造一个DB对象OKQ而不工厂类如何变化。这是接口的意?---抽象?br />
  l承的概念不用多_很好理解。ؓ什么要l承呢?因ؓ你想重用代码Q这l对不是理由Q承的意义也在于抽象,而不是代码重用。如果对象A有一个run()ҎQ对象B也想有这个方法,所以有人就Class B extends A。这是不l大脑的做法。如果在B中实例化一个AQ调用A的Run()ҎQ是不是可以辑ֈ同样的目的?如下Q?br />
Class B
{
  A a=new A();
  a.run();
}

  q就是利用类的聚合来重用代码Q是委派模式的雏形,是GoF一贯倡导的做法?br />
  那么l承的意义何在?其实q是历史原因造成的,最开始的OO语言只有l承Q没有接口,所以只能以l承来实现抽象,请一定注意,l承的本意在于抽象,而非代码重用Q虽然承也有这个作用)Q这是很多Java烂书最严重的错误之一Q它们所造成的阴影,我至今还没有完全摆脱Q坏书害人啊Q尤其是入门cȝQ流毒太大。什么时候应该用承?只在抽象cM使用Q其他情况下量不用。抽象类也是不能实例化的Q它仅仅提供一个模版而已Q这很能说明问题?br />
  软g开发的万恶之源Q一是重复代码而不是重用代码,二是烂用l承Q尤以c++E序员ؓ甚。Java中取~多重承,目的是制止烂用l承Q实是非常明智的做法Q不q很多h都不理解。Java能够更好的体现设计,q是让我入迷的原因之一?img src ="http://www.tkk7.com/os586/aggbug/77316.html" width = "1" height = "1" />

水煮三国 2006-10-26 08:55 发表评论
]]>
关键字new和newInstanceҎ区别http://www.tkk7.com/os586/archive/2006/09/22/71237.html水煮三国水煮三国Fri, 22 Sep 2006 01:08:00 GMThttp://www.tkk7.com/os586/archive/2006/09/22/71237.htmlhttp://www.tkk7.com/os586/comments/71237.htmlhttp://www.tkk7.com/os586/archive/2006/09/22/71237.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/71237.htmlhttp://www.tkk7.com/os586/services/trackbacks/71237.html
    Java中工厂模式经怋用newInstance()Ҏ来创建对象,因此从ؓ什么要使用工厂模式上可以找到具体答案。 例如:
    class c = Class.forName(“Example?;
    factory = (ExampleInterface)c.newInstance(); 

    其中ExampleInterface是Example的接口,可以写成如下形式Q?br />    String className = "Example";
    class c = Class.forName(className);
    factory = (ExampleInterface)c.newInstance();

    q一步可以写成如下Ş式:
    String className = readfromXMlConfig;//从xml 配置文g中获得字W串
    class c = Class.forName(className);
    factory = (ExampleInterface)c.newInstance();

    上面代码已经不存在Example的类名称Q它的优ҎQ无论ExamplecL么变化Q上qC码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们l承ExampleInterface可以?br />
    从JVM的角度看Q我们用关键字new创徏一个类的时候,q个cd以没有被加蝲。但是用newInstance()Ҏ的时候,必M证:1、这个类已经加蝲Q?、这个类已经q接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,q个静态方法调用了启动cd载器Q即加蝲java API的那个加载器?br />
    现在可以看出QnewInstance()实际上是把newq个方式分解Z步,即首先调用Class加蝲Ҏ加蝲某个c,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灉|性,提供l了一U降耦的手段?br />
    最后用最单的描述来区分new关键字和newInstance()Ҏ的区别:
    newInstance: q型。低效率。只能调用无参构造。?br />    new: 强类型。相寚w效。能调用Mpublic构造?br />

水煮三国 2006-09-22 09:08 发表评论
]]>
Iterator和ListIterator的不同用方?/title><link>http://www.tkk7.com/os586/archive/2006/09/22/71235.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 22 Sep 2006 01:02:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/09/22/71235.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/71235.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/09/22/71235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/71235.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/71235.html</trackback:ping><description><![CDATA[我们在用List,Set的时?Z实现对其数据的遍?我们l常使用CIterator(跌代??br />使用跌代器,你不需要干涉其遍历的过E,只需要每ơ取Z个你惌的数据进行处理就可以了。但是在使用的时候也是有不同的?br />List和Set都有iterator()来取得其q代器。对List来说Q你也可以通过listIterator()取得其P代器Q两UP代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面:<br />1.    ListIterator有add()ҎQ可以向List中添加对象,而Iterator不能<br />2.    ListIterator和Iterator都有hasNext()和next()ҎQ可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()ҎQ可以实现逆向Q顺序向前)遍历。Iterator׃可以?br />3.    ListIterator可以定位当前的烦引位|,nextIndex()和previousIndex()可以实现。Iterator没有此功能?br />4.    都可实现删除对象Q但是ListIterator可以实现对象的修改,set()Ҏ可以实现。Iierator仅能遍历Q不能修攏V?br /><br />因ؓListIterator的这些功能,可以实现对LinkedList{List数据l构的操作?br />其实,数组对象也可以用q代器来实现?br />org.apache.commons.collections.iterators.ArrayIterator可以实现此功能Q我此前曄提过L法。具体可以参考[link=<a >http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=41142</a><br />]<br />一般情况下Q我们用Iterator可以了Q如果你需要进行记录的前后反复索的话,你就可以使用ListIterator来扩展你的功能,Q有点象JDBC中的滚动l果集)?img src ="http://www.tkk7.com/os586/aggbug/71235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-09-22 09:02 <a href="http://www.tkk7.com/os586/archive/2006/09/22/71235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT:GridLayout 的用需要注意的事项http://www.tkk7.com/os586/archive/2006/09/12/69111.html水煮三国水煮三国Tue, 12 Sep 2006 02:50:00 GMThttp://www.tkk7.com/os586/archive/2006/09/12/69111.htmlhttp://www.tkk7.com/os586/comments/69111.htmlhttp://www.tkk7.com/os586/archive/2006/09/12/69111.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/69111.htmlhttp://www.tkk7.com/os586/services/trackbacks/69111.htmlSWT当中的GridLayout是一个非常灵zȝ控g,但是在用v来需要在控制上下一番功?

大家都知?JAVA在写~写H口E序的时?物g的添?攄 操作h要比.net费劲的多,但是如果用好了相关org.eclipse.layout.*包当中的相关c?也会写出十分漂亮的界面程?

下面大家先看一个程?

源码如下:

package com.layout;

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.SWT;

public class CopyOfGridLayoutExc {
 
 public static void main(String[] args) {

  Display display = new Display();

     Shell shell = new Shell(display);

     shell.setText("Find (GridLayout)");

     Label label = new Label(shell, SWT.NONE);

     label.setText("Find what:");

     Text text = new Text(shell, SWT.BORDER);

     Button findButton = new Button(shell, SWT.PUSH);

     findButton.setText("Find Next");

     Group group = new Group(shell, SWT.NONE);

     group.setLayout(new RowLayout());

     Button upButton = new Button(group, SWT.RADIO);

     upButton.setText("Up");

     Button downButton = new Button(group, SWT.RADIO);

     downButton.setText("Down");

     downButton.setSelection(true);

     group.setText("Direction");

     Button cancelButton = new Button(shell, SWT.PUSH);

     cancelButton.setText("Cancel");

 

     /* Use a GridLayout to position the controls */

     Monitor monitor = shell.getMonitor();

     int width = monitor.getClientArea().width / 10;

     GridLayout layout = new GridLayout(4, false);

     layout.marginWidth = layout.marginHeight = 14;//layout leave's the window's space

     shell.setLayout(layout);

     GridData labelData =

         new GridData(SWT.FILL, SWT.CENTER, false, false);

     label.setLayoutData(labelData);

     GridData textData =

         new GridData(SWT.FILL,SWT.CENTER,true,false,2,1);

     textData.widthHint = width;

     text.setLayoutData(textData);

     GridData findData =

         new GridData(SWT.FILL, SWT.CENTER, false, false);

     findButton.setLayoutData(findData);

     GridData groupData =

         new GridData(SWT.RIGHT,SWT.TOP,false,false,3,1);

     group.setLayoutData(groupData);

     GridData cancelData =

         new GridData(SWT.FILL, SWT.TOP, false, false);

     cancelButton.setLayoutData(cancelData);

 

     shell.pack();

     shell.open();

     while (!shell.isDisposed()) {

         if (!display.readAndDispatch()) display.sleep();

     }

     display.dispose();

 }

}



q其中我们在使用的时候应该要注意以下几点:

1.要选择自己适合 的Layoutcd.GridLayout适合于多U情?它大部分情况是用在较ؓ复杂的界面编E当?因ؓ复杂的界面会有相当多的控?



2.GridData的用将是一个控制界面显C的主要c?通过使用GridData我们可以很好的控制界?

   其中GridData的构造函数比较多,但是相关的用我们都应该熟悉,特别是上面源E序当中使用的那个构造函?在用v来更Ҏ控制GridLayout的布局.通过horizantalSpan,VerticalSpan来控制控件所占用的单元格,q样׃控制其它控制是否在一列当中显C是在几列当中昄.前提是通过GridLayout.numColumns来设|列?

3.如果不设|GridData那么相关的控仉会按照相关的建立序加入到GridLayout当中.GridData不能控制控g的显C顺?而相关顺序是对象的徏立顺序来控制?q一点不要与GridDatah?

希望写这文章对大家学习SWT有用.




水煮三国 2006-09-12 10:50 发表评论
]]>
?JAVA一排序算法文?/title><link>http://www.tkk7.com/os586/archive/2006/09/01/67032.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 01 Sep 2006 02:31:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/09/01/67032.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/67032.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/09/01/67032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/67032.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/67032.html</trackback:ping><description><![CDATA[ <p>1  Java排序法  <br />  package com.cucu.test;</p> <p>/**<br /> * @author <a >http://www.linewell.com</a> <a href=mailto:cg@linewell.com>cg@linewell.com</a><br /> * @version 1.0<br /> */<br />public class Sort {</p> <p>  public void swap(int a[], int i, int j) {<br />    int tmp = a[i];<br />    a[i] = a[j];<br />    a[j] = tmp;<br />  }</p> <p>  public int partition(int a[], int low, int high) {<br />    int pivot, p_pos, i;<br />    p_pos = low;<br />    pivot = a[p_pos];<br />    for (i = low + 1; i <= high; i++) {<br />      if (a[i] > pivot) {<br />        p_pos++;<br />        swap(a, p_pos, i);<br />      }<br />    }<br />    swap(a, low, p_pos);<br />    return p_pos;<br />  }</p> <p>  public void quicksort(int a[], int low, int high) {<br />    int pivot;<br />    if (low < high) {<br />      pivot = partition(a, low, high);<br />      quicksort(a, low, pivot - 1);<br />      quicksort(a, pivot + 1, high);<br />    }</p> <p>  }</p> <p>  public static void main(String args[]) {<br />    int vec[] = new int[] { 37, 47, 23, -5, 19, 56 };<br />    int temp;<br />    //选择排序?Selection Sort)<br />    long begin = System.currentTimeMillis();<br />    for (int k = 0; k < 1000000; k++) {<br />      for (int i = 0; i < vec.length; i++) {<br />        for (int j = i; j < vec.length; j++) {<br />          if (vec[j] > vec[i]) {<br />            temp = vec[i];<br />            vec[i] = vec[j];<br />            vec[j] = temp;<br />          }<br />        }</p> <p>      }<br />    }<br />    long end = System.currentTimeMillis();<br />    System.out.println("选择法用时ؓQ? + (end - begin));<br />    //打印排序好的l果<br />    for (int i = 0; i < vec.length; i++) {<br />      System.out.println(vec[i]);<br />    }<br />    //  冒排序?Bubble Sort)<br />    begin = System.currentTimeMillis();<br />    for (int k = 0; k < 1000000; k++) {<br />      for (int i = 0; i < vec.length; i++) {<br />        for (int j = i; j < vec.length - 1; j++) {<br />          if (vec[j + 1] > vec[j]) {<br />            temp = vec[j + 1];<br />            vec[j + 1] = vec[j];<br />            vec[j] = temp;<br />          }<br />        }</p> <p>      }<br />    }<br />    end = System.currentTimeMillis();<br />    System.out.println("冒法用时ؓQ? + (end - begin));<br />    //打印排序好的l果<br />    for (int i = 0; i < vec.length; i++) {<br />      System.out.println(vec[i]);<br />    }</p> <p>    //插入排序?Insertion Sort)<br />    begin = System.currentTimeMillis();<br />    for (int k = 0; k < 1000000; k++) {<br />      for (int i = 1; i < vec.length; i++) {<br />        int j = i;<br />        while (vec[j - 1] < vec[i]) {<br />          vec[j] = vec[j - 1];<br />          j--;<br />          if (j <= 0) {<br />            break;<br />          }<br />        }<br />        vec[j] = vec[i];<br />      }<br />    }<br />    end = System.currentTimeMillis();<br />    System.out.println("插入法用时ؓQ? + (end - begin));<br />    //打印排序好的l果<br />    for (int i = 0; i < vec.length; i++) {<br />      System.out.println(vec[i]);<br />    }</p> <p>    //快速排序法(Quick Sort)</p> <p>    Sort s = new Sort();<br />    begin = System.currentTimeMillis();<br />    for (int k = 0; k < 1000000; k++) {<br />      s.quicksort(vec, 0, 5);<br />    }<br />    end = System.currentTimeMillis();<br />    System.out.println("快速法用时为:" + (end - begin));<br />    //打印排序好的l果<br />    for (int i = 0; i < vec.length; i++) {<br />      System.out.println(vec[i]);<br />    }<br />  }</p> <p>}<br />以下是运行结果:<br />选择法用时ؓQ?34<br />56<br />47<br />37<br />23<br />19<br />-5<br />冒法用时ؓQ?72<br />56<br />47<br />37<br />23<br />19<br />-5<br />插入法用时ؓQ?8<br />56<br />47<br />37<br />23<br />19<br />-5<br />快速法用时为:297<br />56<br />47<br />37<br />23<br />19<br />-5  </p> <img src ="http://www.tkk7.com/os586/aggbug/67032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-09-01 10:31 <a href="http://www.tkk7.com/os586/archive/2006/09/01/67032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ThinkingQJava中static、this、super、final用法http://www.tkk7.com/os586/archive/2006/08/23/65213.html水煮三国水煮三国Wed, 23 Aug 2006 02:15:00 GMThttp://www.tkk7.com/os586/archive/2006/08/23/65213.htmlhttp://www.tkk7.com/os586/comments/65213.htmlhttp://www.tkk7.com/os586/archive/2006/08/23/65213.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/65213.htmlhttp://www.tkk7.com/os586/services/trackbacks/65213.html本篇旨在帮助准备学习Java以及刚接触Java的朋友认识、掌握和使用static、this、super、finalq几个关键字的用。Java博大_深Q我也是一位正在学习和使用Java的爱好者,文中隑օ有不妥之处,Ƣ迎指正?br />一、static
请先看下面这D늨序:
public class Hello{
     public static void main(String[] args){//(1)
          System.out.println("Hello,world!");//(2)
        }
  }
看过q段E序Q对于大多数学过Java 的从来说Q都不陌生。即使没有学qJavaQ而学q其它的高语言Q例如CQ那你也应该能看懂这D代码的意思。它只是单的输出“Hello,world”,一点别的用处都没有Q然而,它却展示了static关键字的主要用法。?br />?处,我们定义了一个静态的Ҏ名ؓmainQ这意味着告诉Java~译器,我这个方法不需要创Z个此cȝ对象卛_使用。你q得你是怎么q行q个E序吗?一般,我们都是在命令行下,打入如下的命?加下划线为手动输?Q?br />javac Hello.java
java Hello
Hello,world!
q就是你q行的过E,W一行用来编译Hello.javaq个文gQ执行完后,如果你查看当前,会发现多了一个Hello.class文gQ那是W一行生的Java二进制字节码。第二行是执行一个JavaE序的最普遍做法。执行结果如你所料。在2中,你可能会惻IZ么要q样才能输出。好Q我们来分解一下这条语句。(如果没有安装Java文档Q请到Sun的官方网站浏览J2SE APIQ首先,System是位于java.lang包中的一个核心类Q如果你查看它的定义Q你会发现有q样一行:public static final PrintStream out;接着在进一步,点击PrintStreamq个链接,在METHOD面Q你会看到大量定义的ҎQ查找printlnQ会有这样一行:
public void println(String x)。好了,现在你应该明白ؓ什么我们要那样调用了,out是System的一个静态变量,所以可以直接用,而out所属的cL一个printlnҎ?br />静态方?br />通常Q在一个类中定义一个方法ؓstaticQ那是_无需本类的对象即可调用此Ҏ。如下所C:
class Simple{
   static void go(){
        System.out.println("Go...");
    }
}
public class Cal{
  public static void main(String[] args){
     Simple.go();
  }
}
调用一个静态方法就是“类?Ҏ名?静态方法的使用很简单如上所C。一般来_静态方法常ؓ应用E序中的其它cL供一些实用工h用,在Java的类库中大量的静态方法正是出于此目的而定义的?br />静态变?br />静态变量与静态方法类伹{所有此cd例共享此静态变量,也就是说在类装蝲Ӟ只分配一块存储空_所有此cȝ对象都可以操控此块存储空_当然对于final则另当别Z。看下面q段代码Q?br />class Value{
 static int c=0;
 static void inc(){
 c++;
  }
}
class Count{
  public static void prt(String s){
    System.out.println(s);
  }
  public static void main(String[] args){
    Value v1,v2;
    v1=new Value();
    v2=new Value();
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    v1.inc();
    prt("v1.c="+v1.c+"  v2.c="+v2.c);  
  }
}
l果如下Q?br />v1.c=0  v2.c=0
v1.c=1  v2.c=1
由此可以证明它们׃n一块存储区。static变量有点cM于C中的全局变量的概c值得探讨的是静态变量的初始化问题。我们修改上面的E序Q?br />class Value{
  static int c=0;
  Value(){
    c=15;
  }
  Value(int i){
    c=i;
  }
  static void inc(){
    c++;
  }
}
class Count{
  public static void prt(String s){
    System.out.println(s);
  }
    Value v=new Value(10);
    static Value v1,v2;
    static{
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
      v1=new Value(27);
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
      v2=new Value(15);
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
    }
  public static void main(String[] args){
    Count ct=new Count();
    prt("ct.c="+ct.v.c);
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    v1.inc();
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    prt("ct.c="+ct.v.c);
  }
}
q行l果如下Q?br />v1.c=0  v2.c=0
v1.c=27  v2.c=27
v1.c=15  v2.c=15
ct.c=10
v1.c=10  v2.c=10
v1.c=11  v2.c=11
ct.c=11
q个E序展示了静态初始化的各U特性。如果你初次接触JavaQ结果可能o你吃惊。可能会对static后加大括h到困惑。首先要告诉你的是,static定义的变量会优先于Q何其它非static变量Q不论其出现的顺序如何。正如在E序中所表现的,虽然v出现在v1和v2的前面,但是l果却是v1和v2的初始化在v的前面。在static{后面跟着一D代码,q是用来q行昑ּ的静态变量初始化Q这D代码只会初始化一ơ,且在c被W一ơ装载时。如果你能读懂ƈ理解q段代码Q会帮助你对static关键字的认识。在涉及到承的时候,会先初始化父cȝstatic变量Q然后是子类的,依次cL。非静态变量不是本文的主题Q在此不做详l讨论,请参考Think in Java中的讲解?br />静态类
通常一个普通类不允许声明ؓ静态的Q只有一个内部类才可以。这时这个声明ؓ静态的内部cd以直接作Z个普通类来用,而不需实例一个外部类。如下代码所C:
public class StaticCls{
  public static void main(String[] args){
    OuterCls.InnerCls oi=new OuterCls.InnerCls();
  }
}
class OuterCls{
  public static class InnerCls{
    InnerCls(){
      System.out.println("InnerCls");
    }
   }
}
输出l果会如你所料:
InnerCls
和普通类一栗内部类的其它用法请参阅Think in Java中的相关章节Q此处不作详解?br />二、this & super
    在上一拙作中Q我们讨Zstatic的种U用法,通过用static来定义方法或成员Qؓ我们~程提供了某U便利,从某U程度上可以说它cM于C语言中的全局函数和全局变量。但是,q不是说有了q种便利Q你便可以随处用,如果那样的话Q你侉K要认真考虑一下自己是否在用面向对象的思想~程Q自qE序是否是面向对象的。好了,现在开始讨论this&superq两个关键字的意义和用法?br />在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西Q比如当前对象的某个ҎQ或当前对象的某个成员,你便可以利用this来实现这个目的,当然Qthis的另一个用途是调用当前对象的另一个构造函敎ͼq些马上p讨论。如果你惛_用父cȝ某种东西Q则非super莫属。由于this与super有如此相似的一些特性和与生俱来的某U关p,所以我们在q一块儿来讨论,希望能帮助你区分和掌握它们两个?br />在一般方法中
最普遍的情况就是,在你的方法中的某个Ş参名与当前对象的某个成员有相同的名字Q这时ؓ了不至于hQ你侉K要明用this关键字来指明你要使用某个成员Q用方法是“this.成员名”,而不带this的那个便是Ş参。另外,q可以用“this.Ҏ名”来引用当前对象的某个方法,但这时this׃是必ȝ了,你可以直接用Ҏ名来讉K那个ҎQ编译器会知道你要调用的是那一个。下面的代码演示了上面的用法Q?br />public class DemoThis{
  private String name;
  private int age;
  DemoThis(String name,int age){
    setName(name); //你可以加上this来调用方法,像这Pthis.setName(name);但这q不是必ȝ
    setAge(age);
    this.print();
  }   
  public void setName(String name){
    this.name=name;//此处必须指明你要引用成员变量
  }
  public void setAge(int age){
    this.age=age;
  }
  public void print(){
    System.out.println("Name="+name+" Age="+age);//在此行中q不需要用thisQ因为没有会Dh的东?br />  }
  public static void main(String[] args){
    DemoThis dt=new DemoThis("Kevin","22");
  }
}
q段代码很简单,不用解释你也应该能看明白。在构造函C你看到用this.print(),你完全可以用print()来代替它Q两者效果一栗下面我们修改这个程序,来演Csuper的用法?br />class Person{
  public int c;
  private String name;
  private int age;
  protected void setName(String name){
    this.name=name;
  }
  protected void setAge(int age){
    this.age=age;
  }
  protected void print(){
    System.out.println("Name="+name+" Age="+age);
  }
}
public class DemoSuper extends Person{
  public void print(){
    System.out.println("DemoSuper:");
    super.print();
  }
  public static void main(String[] args){
    DemoSuper ds=new DemoSuper();
    ds.setName("kevin");
    ds.setAge(22);
    ds.print();
  }
}
在DemoSuper中,重新定义的printҎ覆写了父cȝprintҎQ它首先做一些自q事情Q然后调用父cȝ那个被覆写了的方法。输出结果说明了q一点:
DemoSuper:
Name=kevin Age=22
q样的用方法是比较常用的。另外如果父cȝ成员可以被子c访问,那你可以像用this一样用它Q用“super.父类中的成员名”的方式Q但常常你ƈ不是q样来访问父cM的成员名的?br />在构造函C
构造函数是一U特D的ҎQ在对象初始化的时候自动调用。在构造函CQthis和super也有上面说的U种使用方式Qƈ且它q有Ҏ的地方,L下面的例子:
class Person{
  public static void prt(String s){
    System.out.println(s);
  }
  Person(){
    prt("A Person.");
  }
  Person(String name){
    prt("A person name is:"+name);
  }
}
public class Chinese extends Person{
  Chinese(){
    super();  //调用父类构造函敎ͼ1Q?br />    prt("A chinese.");//(4)
  }
  Chinese(String name){
    super(name);//调用父类h相同形参的构造函敎ͼ2Q?br />    prt("his name is:"+name);
  }
  Chinese(String name,int age){
    this(name);//调用当前h相同形参的构造函敎ͼ3Q?br />    prt("his age is:"+age);
  }
  public static void main(String[] args){
    Chinese cn=new Chinese();
    cn=new Chinese("kevin");
    cn=new Chinese("kevin",22);
  }
}
在这D늨序中Qthis和super不再是像以前那样用?”连接一个方法或成员Q而是直接在其后跟上适当的参敎ͼ因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同Ş式的构造函敎ͼ??处。this后加参数则调用的是当前具有相同参数的构造函敎ͼ?处。当Ӟ在Chinese的各个重载构造函CQthis和super在一般方法中的各U用法也仍可使用Q比?处,你可以将它替换ؓ“this.prt?因ؓ它承了父类中的那个ҎQ或者是“super.prt”(因ؓ它是父类中的Ҏ且可被子c访问)Q它照样可以正确q行。但q样g有点画蛇添的味道了?br />最后,写了q么多,如果你能对“this通常指代当前对象Qsuper通常指代父类”这句话牢记在心Q那么本便辑ֈ了目的,其它的你自会在以后的~程实践当中慢慢体会、掌握。另外关于本中提到的承,请参阅相关Java教程?br />三、final
final在Java中ƈ不常用,然而它却ؓ我们提供了诸如在C语言中定义常量的功能Q不仅如此,finalq可以让你控制你的成员、方法或者是一个类是否可被覆写或承等功能Q这些特点final在Java中拥有了一个不可或~的CQ也是学习Java时必要知道和掌握的关键字之一?br />final成员
当你在类中定义变量时Q在其前面加上final关键字,那便是说Q这个变量一旦被初始化便不可改变Q这里不可改变的意思对基本cd来说是其g可变Q而对于对象变量来说其引用不可再变。其初始化可以在两个地方Q一是其定义处,也就是说在final变量定义时直接给其赋|二是在构造函C。这两个地方只能选其一Q要么在定义时给|要么在构造函Cl|不能同时既在定义时给了|又在构造函Cl另外的倹{下面这D代码演CZq一点:
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Bat{
    final PI=3.14;          //在定义时便给址?br />    final int i;            //因ؓ要在构造函Cq行初始化,所以此处便不可再给?br />    final List list;        //此变量也与上面的一?br />    Bat(){
        i=100;
        list=new LinkedList();
    }
    Bat(int ii,List l){
        i=ii;
        list=l;
    }
    public static void main(String[] args){
        Bat b=new Bat();
        b.list.add(new Bat());
        //b.i=25;
        //b.list=new ArrayList();
        System.out.println("I="+b.i+" List Type:"+b.list.getClass());
        b=new Bat(23,new ArrayList());
        b.list.add(new Bat());
        System.out.println("I="+b.i+" List Type:"+b.list.getClass());
    }
}
此程序很单的演示了final的常规用法。在q里使用在构造函Cq行初始化的ҎQ这使你有了一点灵zL。如Bat的两个重载构造函数所C,W一个缺省构造函CZ提供默认的|重蝲的那个构造函CҎ你所提供的值或cd为final变量初始化。然而有时你q不需要这U灵zL,你只需要在定义时便l定其值ƈ怸变化Q这时就不要再用q种Ҏ。在mainҎ中有两行语句注释掉了Q如果你L注释Q程序便无法通过~译Q这便是_不论是i的值或是list的类型,一旦初始化Q确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型,输出l果中显CZq一点:
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
q有一U用法是定义Ҏ中的参数为finalQ对于基本类型的变量Q这样做q没有什么实际意义,因ؓ基本cd的变量在调用Ҏ时是传值的Q也是说你可以在方法中更改q个参数变量而不会媄响到调用语句Q然而对于对象变量,却显得很实用Q因为对象变量在传递时是传递其引用Q这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量Ӟ明确使用finalq行声明Q会防止你无意的修改而媄响到调用Ҏ?br />另外Ҏ中的内部cd用到Ҏ中的参变量时Q此参变也必d明ؓfinal才可使用Q如下代码所C:
public class INClass{
   void innerClass(final String str){
        class IClass{
            IClass(){
                System.out.println(str);
            }
        }
        IClass ic=new IClass();
    }
  public static void main(String[] args){
      INClass inc=new INClass();
      inc.innerClass("Hello");
  }
}
finalҎ
方法声明ؓfinalQ那p明你已经知道q个Ҏ提供的功能已l满你要求Q不需要进行扩展,q且也不允许M从此cȝ承的cL覆写q个ҎQ但是承仍然可以承这个方法,也就是说可以直接使用。另外有一U被UCؓinline的机Ӟ它会使你在调用finalҎӞ直接方法主体插入到调用处,而不是进行例行的Ҏ调用Q例如保存断点,压栈{,q样可能会你的E序效率有所提高Q然而当你的ҎM非常庞大Ӟ或你在多处调用此ҎQ那么你的调用主体代码便会迅速膨胀Q可能反而会影响效率Q所以你要慎用finalq行Ҏ定义?br />finalc?br />当你final用于cn上时Q你需要仔l考虑Q因Z个finalcL无法被Q何hl承的,那也意味着此类在一个承树中是一个叶子类Qƈ且此cȝ设计已被认ؓ很完而不需要进行修Ҏ扩展。对于finalcM的成员,你可以定义其为finalQ也可以不是final。而对于方法,׃所属类为final的关p,自然也就成了final型的。你也可以明的lfinalcM的方法加上一个finalQ但q显然没有意义?br />下面的程序演CZfinalҎ和finalcȝ用法Q?br />final class final{
      final String str="final Data";
      public String str1="non final data";
      final public void print(){
           System.out.println("final method.");
      }
      public void what(){
             System.out.println(str+"\n"+str1);
     }
}
public class FinalDemo{//extends final无法l承
        public static void main(String[] args){
              final f=new final();
               f.what();
               f.print();
    }
}
从程序中可以看出QfinalcM普通类的用几乎没有差别,只是它失M被承的Ҏ。finalҎ与非finalҎ的区别也很难从程序行看出Q只是记住慎用?br />final在设计模式中的应?br />在设计模式中有一U模式叫做不变模式,在Java中通过final关键字可以很Ҏ的实现这个模式,在讲解final成员时用到的E序Bat.java是一个不变模式的例子。如果你Ҏ感兴,可以参考阎宏博士编写的《Java与模式》一书中的讲解?br />到此为止Qthis,static,supert和final的用已l说完了Q如果你对这四个关键字已l能够大致说出它们的区别与用法,那便说明你基本已l掌握。然而,世界上的M东西都不是完无~的QJava提供q四个关键字Q给E序员的~程带来了很大的便利Q但q不是说要让你到处用,一旦达到滥用的E序Q便适得其反Q所以在使用时请一定要认真考虑?img src ="http://www.tkk7.com/os586/aggbug/65213.html" width = "1" height = "1" />

水煮三国 2006-08-23 10:15 发表评论
]]>
设计模式QBuilder建造者模?/title><link>http://www.tkk7.com/os586/archive/2006/08/15/63627.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 15 Aug 2006 02:41:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/08/15/63627.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/63627.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/08/15/63627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/63627.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/63627.html</trackback:ping><description><![CDATA[其实我对建造者模式的理解Q倒是有些聚合合ƈ的原则在里面Q这只是我个人的理解Q?br /><br />但是对于建造者模式来_对于客户端来_相关的品内部的元g的徏立都是被隐藏的.我们通过相关的角色去完成产品对象及其元g的徏立.<br /><br />引用<Java模式>的一句话是这栯的:一个导演者对象和具体建造者对象一个一个地建造出所有的零gQ从而徏造出完整的品对象.建造者模式将产品的结构和产品的零件徏造过E对客户端隐藏v来,把对建造过E进行指挥的责Q和具体徏造者零件的责Q侵害开来.辑ֈ责Q划分和封装的目的Q?br /><br /><br /><br />我觉得徏造者模式当中:相关角色的定义是最为重要的Q它们各司其职,而又互不q涉Q?br /><br />抽象建造者角Ԍ它是一个抽象接口,l出了徏立相兛_件的Ҏ及一个返回对象的ҎQ这个接口必ȝ具体建造者角色来实现Q?br /><br />具体建造者角Ԍ它有两个作用Q第一是实现抽象徏造者角色声明的Ҏ<br /><br />W二是提供产品对象的实例.<br /><br /><br />导演者角Ԍ它是一个中间{换类Q它实现了构建相兛_件的ҎQ调用具体徏造者类Q?br /><br />产品角色Q具体的产品cȝ实现Q?br /><br /><br /><br /><br /><br /><br /><img src ="http://www.tkk7.com/os586/aggbug/63627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-08-15 10:41 <a href="http://www.tkk7.com/os586/archive/2006/08/15/63627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>相关JAVA站点Q欢q加?/title><link>http://www.tkk7.com/os586/archive/2006/08/02/61348.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 02 Aug 2006 08:09:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/08/02/61348.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/61348.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/08/02/61348.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/61348.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/61348.html</trackback:ping><description><![CDATA[ <p> <font face="Times New Roman" color="#000000" size="3"> <strong> <span id="z3lf99p" class="tpc_title">J2EE相关站点(Ƣ迎填加)</span> <br /> </strong> <span id="3dnr9rp" class="tpc_content"> <a target="_blank"> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new" color="#485a68">http://www.theserverside.com</font> </a> <br /> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new">权威的的J2EE站点Q有最新的消息发布和很多技术文章以及很好的论坛Q进行J2EE相关技术的全方位的讨论Q也有电子书可以下蝲?br /><br /></font> <a target="_blank"> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new" color="#485a68">http://www.javaworld.com</font> </a> <br /> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new">很著名的国外的java技术站炏V有一D|间由于一些原因停止了更新Q不q不久前有开始了更新的工作?br /><br /></font> <a target="_blank"> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new" color="#485a68">http://www-900.ibm.com/developerWorks/cn/java/index.shtml</font> </a> <br /> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new">IBM公司的developerWorks Java技术专区,有很多关于J2EE的技术文章,q且文章的质量很高?br /><br /></font> <a target="_blank"> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new" color="#485a68">http://www.jdon.com</font> </a> <br /> <font style="FONT-SIZE: 12px">国内不错的J2EE技术站点,有很多技术文章和源代码。以前推汉化的JIVE版本Q现在有了自qJ2EE框架产品?br /><br /></font> <a target="_blank"> <font color="#485a68" size="2">http://www.huihoo.com</font> </a> <br /> <font style="FONT-SIZE: 12px">专注于中间g技术的站点和论坛,国内开源Y件做的相当不错的l织Q推Z自己的J2EE服务器品JFox以及相关的OpenSource 产品?br /><br /></font> <a target="_blank"> <font style="FONT-SIZE: 12px" color="#485a68">http://gceclub.sun.com.cn</font> </a> <br /> <font size="2">SUN的中文技术社区,有SUN 的技术h员的支持l护Q很多不错的文章Q在U讲堂栏目办的很有特艌Ӏ推Z新版的技术论坛,但是人气一直不是很旺?br /><br /></font> <a target="_blank"> <font style="FONT-SIZE: 12px" color="#485a68">http://www.cnjsp.org</font> </a> <br /> <font style="FONT-SIZE: 12px">以前做过JSP的论坛,现在定位于Java技术服务,提供一些J2EE的技术文章,q不错?br /><br /></font> <a target="_blank"> <font style="FONT-SIZE: 12px" color="#485a68">http://www.chinajavaworld.net</font> </a> <br /> <font style="FONT-SIZE: 12px">应该是国内最著名和热门的java技术站点了Q有很j2ee的信息和技术文章和很好的论坛?br /><br /></font> <a target="_blank"> <font style="FONT-SIZE: 12px" color="#485a68">http://www.csdn.net</font> </a> <br /> <font style="FONT-SIZE: 12px">E序员都知道的网?)也把它列q来。有最新的java业界动态和技术文章可以查找?br /></font> </span>q两个网站都是台湄的所以都是繁体中文,不过q不影响大家的阅读速度?br /><br /><a target="_blank">http://www.javaworld.com.tw</a><br /><br /><a target="_blank">http://www.caterpillar.onlyfun.net/phpBB2/index.php</a><br /><!----><br /><p style="FONT-SIZE: 12px">Java学习|站   <br />  http://www-900.ibm.com/developerWorks/cn/java/index.shtml  IBM的JAVA专题——永q的蓝色巨h <br />  http://www.huihoo.com   灰狐动力——Enterprise Open Source <br />  http://www.jdon.com   J道——JAVA和J2EE解决之道 <br />  http://www.chinaunix.net   ChinaUnix——我们在努力打造一个Unix时代Q?<br />  http://www.theserverside.com   TheServerSide.COM——Your Enterprise Java Community <br />  http://www.onjava.com   O'REILLY ON java.com <br />  http://www.matrix.org.cn   Matrix与Javap <br />  http://www.java-source.net   JavaSource <br />  http://www.javaresearch.org   Java研究l织——汇聚技术精?增进技术交?<br />  http://www.cn-java.com   中文Java技术网——ؓJava爱好者服?<br />  http://www.javalobby.org   JavaLobby <br />  http://www.javajia.com   Java?<br />  http://www.cnjavaclub.com   中国JAVA׃?<br />  http://www.jspcn.net   JSP中文|?<br />  http://www.cnjsp.org   中国JSP技术网?<br />  http://www.xuejava.com   学Java——学习Java的精?<br />  http://tech.ccidnet.com   赛_|技术天?<br />  http://www.uml.org.cn   UML软g工程l织 <br />  http://dev2dev.bea.com.cn/index.jsp   BEAdev2dev在线 <br />  http://www.kissjava.com   爪哇氓 <br />  http://java.about.com   来自About.com的Java新闻和技术文?<br />  http://www.jcp.org/en/home/index   Java Community Process <br />  http://www.java-cn.com   Java中文站——每一天我们都在进?<br />  http://www.chedong.com/   车东 <br />  http://www.javayou.com/   Java自由?<br />  http://www.j2medev.com/   J2ME开发网 <br /></p></font> </p> <p> </p> <p> </p> <font color="#000000" style="font-size:12px;font-family:courier new"> <p> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new" color="#000000">http://www.javadown.com.cn<br /></font> <font face="Times New Roman" color="#000000" style="font-size:12px;font-family:courier new">http://www.java.net/<br /></font> <br />Java技术论坛?<br />  http://bbs.chinajavaworld.com      ChinaJavaWorld技术论?<br />  http://www.javaworld.com.tw/jute/index.html   JavaWorld技术论?<br />  http://forum.javaeye.com   Java视线论坛 <br />  http://www.jdon.com/jive/index.jsp   J道论?<br />  http://gceclub.sun.com.cn/NASApp/sme/jive/index.jsp   Sun技术社?<br />  http://www.cjsdn.com   中国Java开发网 <br />  http://spring.jactiongroup.net   SpringFramework中文论坛 <br />  http://www.cartexpert.com/forum/forum.jsp?column=24   Jive研究论坛 <br />  http://www.javafan.net/jive/index.jsp   JavaFan论坛 </p> <p> <br />Java优秀Blog   <br /><a >javazhai.mblogger.cn</a> <br /><a >http://blog.donews.com/redtroy/</a><br />  http://blog.csdn.net/casularm   Casularm Blog <br />  http://hedong.3322.org   竹笋炒肉 <br />  http://blog.csdn.net/baijsp   Java and OpenSource Software <br />  http://leosky.java.mblogger.cn   leo的Blog <br />  http://java2guru.java.mblogger.cn   J2EE Blog <br />  http://blog.csdn.net/chenyun2000   Open Java Project <br />  http://gigix.blogdriver.com/gigix/index.html   透明思?<br />  http://blog.tomxp.com/Home.html   东L的Blog <br />  http://blog.csdn.net/liaoxingya276   liaoxingya的Blog <br />  http://blog.csdn.net/arielxp   !Java <br />  http://www.nncn.com/blog/weblog.php   HuiFei's Blog <br />  http://www.donews.net/yahoo163/   BlogJava </p> <p> <br />Java热门QQ?<br />  6927954   Java爱好者 ?5747018   Java开源框架研I?<br />  2184090   Java最后通道   5464040   Java技术交?<br />  6090680   Java讨论l ?6868040   Java讨论?<br />  2848217   Java技术交 ?5287881   JavaC֛ <br />  3057466   Java世界   3657130   Java夜未?<br />  4874250   Java开发者 ?6522650   Java联盟 <br />  4972763   Java爱好者 ?6880123   Java技术交?<br />  2473372   Java学习班 ?6347116   Java学院 <br />  3049837   Java人生路 ?1407900   Java爱好?<br />  2371661   Java最爱 ?7096701   Java思想与技?<br />  4421567   Java菜鸟交流室 ?3493424   Java学习?<br />  1822386   Java学习组   3905714   Java乐园 <br />  4085683   Java疯狂~程   5718771   JavaC֌ <br />  4578000   Jsp技术群   4384534   Jsp学习l?<br />  4617990   Jsp学习班 ?1845656   Jsp爱好?<br />  2493314   Jsp交流中心   3241217   Jsp专题学习 <br />  6788666   Jsp爱好者 ?3417234   Jsp交流 <br />  7378475   开发联盟Jsp学习   2347397   Java和Jsp技术讨?<br />  1020937   Jsp   1693379   Jsp <br />  200016    J2ME   4453572   J2ME <br />  6074752   J2ME   4835602   J2ME <br />  1772284   J2ME   155348    开发联?WAP J2ME </p> </font> <p> <font color="#000000" style="font-size:12px;font-family:courier new">源代码下?<br />Zj2eeq_的大型电子商务网站源代码下蝲 :</font> </p> <p> <font style="FONT-SIZE: 12px; FONT-FAMILY: Courier new" color="#000000">本源代码可以帮助大家了解大型物品买卖和交换网站如淘宝Q易宝乐{网站的开发和创徏?br />下蝲地址: http://www.ebaole.com/sourcedown.html<br />q且开辟了一个社Z门ؓ大家提供源代码的交流和讨?<br /><!-- HEADER --> </font> </p> <h1>Online Resources for Java Programmers </h1> <p> </p> <p>The Web offers many resources to help you use the Java platform. This section lists some that we use ourselves, or that we've heard good things about. </p> <p> </p> <blockquote> <hr /> <strong>Caveat:</strong> A Web site that's good one year might stagnate the next, and it can be difficult to tell unless you know the site well. Please <a target="_top">tell us</a> if any of these Web sites is obsolete, or if you have a URL for an excellent resource not mentioned here. <hr /></blockquote> <p>We list three kinds of resources: </p> <dt> <a >General Programming Resources</a> </dt> <dd>Web sites that provide information useful to most developers. </dd> <dt> <a >Specialized Programming Resources</a> </dt> <dd>Sources of more specialized programming information. Examples include assorted tutorials, The Swing Connection, and a Web site for Macintosh programmers. </dd> <dt> <a >Other Resources</a> </dt> <dd>Other stuff, such as the latest industry news. <dl></dl>Don't forget that our <a >Tutorial</a> has many examples, and that you can <a target="_blank"><font color="#009bbb">search all the java.sun.com tutorials</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a>. Another source of resources is the <a target="_blank"><font color="#009bbb">Help section</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a> of java.sun.com. <p><a name="general"><h2>General Programming Resources</h2></a></p><p></p><p></p><p></p><p></p><blockquote><strong>The Java Developer Connection<sup><font size="-2">SM</font></sup><br /><a target="_blank"><font color="#009bbb">http://developer.java.sun.com</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote><p>Essential. Here are some of the things you can do at the JDC: </p><ul><li>research bugs </li><li>vote for which bugs should be fixed first </li><li>view tutorials and book samples </li><li>download early access software </li><li>chat with developers and API architects </li></ul></blockquote><strong>Code Conventions <br /><a target="_blank"><font color="#009bbb">http://java.sun.com/docs/codeconv/</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote>Conventions that developers within Sun try to follow when writing programs in the Java programming language. </blockquote><strong>About.com Focus on Java <br /><a target="_blank"><font color="#009bbb">http://java.about.com</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote>Has articles and links to many resources. </blockquote><strong>JavaWorld Magazine <br /><a target="_blank"><font color="#009bbb">http://www.javaworld.net</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote>Has articles about current programming topics. </blockquote><strong>Java Boutique <br /><a target="_blank"><font color="#009bbb">http://javaboutique.internet.com</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote>Has applets (some including source code), tutorials, book reviews, and more. </blockquote><strong>Java Developer's Journal <br /><a target="_blank"><font color="#009bbb">http://www.sys-con.com/java/</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote>An online subset of a print magazine. Includes source code and selected articles. </blockquote></blockquote><a name="subset"><h2>Specialized Programming Resources</h2></a><blockquote><strong>The J2EE<font size="-2"><sup>TM</sup></font> Tutorial <br /><a target="_blank"><font color="#009bbb">http://java.sun.com/j2ee/tutorial/index.html</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a><br /></strong><blockquote>A beginner's guide to developing enterprise applications on the Java 2 Platform, Enterprise Edition SDK. </blockquote><p><strong>Java 3D<font size="-2"><sup>TM</sup></font> API Tutorial <br /><a target="_blank"><font color="#009bbb">http://java.sun.com/products/java-media/3D/collateral/</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a><br /></strong></p><blockquote>Has descriptions and examples of the most commonly used features in the Java 3D API. </blockquote><p><strong>XML Technologies <br /><a target="_blank"><font color="#009bbb">http://java.sun.com/xml/tutorial_intro.html</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a><br /></strong></p><blockquote>Introduces XML and tells you how to use the Java XML APIs. </blockquote><p><strong>The JNDI Tutorial <br /><a target="_blank"><font color="#009bbb">http://java.sun.com/products/jndi/tutorial/</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a><br /></strong></p><blockquote>Tells you how to use the Java<font size="-2"><sup>TM</sup></font> Naming and Directory Interface (JNDI) for associating names and attributes with objects. </blockquote><p><strong>JDC Tutorials <br /><a target="_blank"><font color="#009bbb">http://developer.java.sun.com/developer/onlineTraining/</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a><br /></strong></p><blockquote>Many tutorials, covering a wealth of topics. Subjects include JavaBeans, Enterprise JavaBeans, JDBC, and Java 2D. </blockquote><p><strong>The Swing Connection <br /><a target="_blank"><font color="#009bbb">http://java.sun.com/products/jfc/tsc/</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a><br /></strong></p><blockquote>The Swing engineering team's Web site. Has articles written both by Swing creators and by external programmers who use Swing. </blockquote><p><strong>The Swing/JFC FAQ <br /><a target="_blank"><font color="#009bbb">http://www.drye.com/java/faq.html</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a><br /></strong></p><blockquote>Unofficial answers to frequently asked questions about Swing. </blockquote><p><strong>Apple's Developer Site <br /><a target="_blank"><font color="#009bbb">http://developer.apple.com/java/</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong></p><blockquote>For programmers who use Macs. </blockquote></blockquote><a name="other"><h2>Other Resources</h2></a><blockquote><strong>How To Write Unmaintainable Code <br /><a target="_blank"><font color="#009bbb">http://mindprod.com/unmain.html</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote>Long, funny essay on how (not) to write code that no one else can read. </blockquote><strong>Slashdot <br /><a target="_blank"><font color="#009bbb">http://slashdot.org/search.pl?topic=108</font></a><a target="_blank"><img height="11" alt=" (outside of the tutorial)" src="http://javazhai.cnblogs.com/images/otherIcon.gif" width="11" align="middle" border="0" /></a></strong><blockquote>News and discussions about the Java platform. </blockquote></blockquote></dd> <img src ="http://www.tkk7.com/os586/aggbug/61348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-08-02 16:09 <a href="http://www.tkk7.com/os586/archive/2006/08/02/61348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讨论QJava 接口当中?“常量接口?/title><link>http://www.tkk7.com/os586/archive/2006/08/02/61342.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 02 Aug 2006 07:41:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/08/02/61342.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/61342.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/08/02/61342.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/61342.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/61342.html</trackback:ping><description><![CDATA[ <p style="FONT-SIZE: 12px; FONT-FAMILY: Courier new">Java接口当中有一个类型ؓ帔R接口Q我在网上看到有些h不提倡用这U方式。具体的原因也没怎么Ԍ但是在这里我q是想与大家讨论一下这个接口方式的使用?br /><br />希望有对此接口用方式有深刻了解的网友能够多提意见:<br /><br />今天朋友发来邮g谈vq种接口方式Q说她写的程序当中的最后一句有错,?我帮着看看Q下面是q段E序的源?br /><br />interface Math<br />{<br />  double PI=3.1415926;<br />}<br />class Arithmetic implements Math<br />{<br />  double roudeArea(double radius)<br />     {<br />         return PI*radius*radius;<br />     }<br />}<br />class Student<br />{<br />   public static void main(String[] args)<br />     {<br />       Arithmetic a=new Arithmetic();<br />       System.out.println(a.roudeArea(3));<br />       System.out.println(Math.PI);<br />       System.out.println(Arithmetic.PI);<br />       System.out.println(a.PI);<br />      }<br />}<br /><br /><br /><br />我在eclipse里面看了Q是一个警告原因就在于她用a.PI来取得常量值的方式的警告?br /><br />其实原因很简单,是一个静态字D需要在一个静态方法中使用的警告?br /><br />看了q段代码后,我发现其实她使用帔R接口的作用已l在实现了接口Maths的类中体现。就是我们可以在实现帔R接口的类中直接用常量而不必加上前面的对象Q当然用Math.PI也是对的Q不qؓ了方便我们可以在q个cd中直接用PIM替它?br /><br />同样我们也可以用类Arithmetic当中的PIQ我们可以直接引用arithmetic.PI,但是我们不能够用a.PI<br /><br />cd中的帔R定义对其它类来说是可见可用的Q他的用可以以 cd.帔R?卛_<br /><br />而接口当中:对其它类来说是不可见的,除非我们需要去实现q个接口Q只有实现它我们才可以直接?帔R?的方?br /><br />帔R接口当中定义的常量,在实现这个接口的cd中可以直接拿来用。它里面没有相关属性和其它Ҏ。还有一点就是:帔R在用v来更为简z?br /><br /></p> <img src ="http://www.tkk7.com/os586/aggbug/61342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-08-02 15:41 <a href="http://www.tkk7.com/os586/archive/2006/08/02/61342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 当中 接口的用ȝhttp://www.tkk7.com/os586/archive/2006/08/02/61340.html水煮三国水煮三国Wed, 02 Aug 2006 07:22:00 GMThttp://www.tkk7.com/os586/archive/2006/08/02/61340.htmlhttp://www.tkk7.com/os586/comments/61340.htmlhttp://www.tkk7.com/os586/archive/2006/08/02/61340.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/61340.htmlhttp://www.tkk7.com/os586/services/trackbacks/61340.html

法则2Q针Ҏ口编E,而非Q接口的Q实?/span>

[ Program To An Interface, Not An Implementation ]

接口

n         接口是一个对象在对其它的对象q行调用时所知道的方法集合?/span>

n         一个对象可以有多个接口Q实际上Q接口是对象所有方法的一个子集)

n         cd是对象的一个特定的接口?/span>

n         不同的对象可以具有相同的cdQ而且一个对象可以具有多个不同的cd?/span>

n         一个对象仅能通过其接口才会被其它对象所了解?/span>

n         某种意义上,接口是以一U非常局限的方式Q将“是一U?/span>?/span>”表达ؓ“一U支持该接口?/span>?/span>”?/span>

n         接口是实现插件化Q?/span>pluggabilityQ的关键

实现l承和接口?/span>

n         实现l承Q?i>cȝ?/i>Q:一个对象的实现是根据另一个对象的实现来定义的?/span>

n         接口l承Q?i>子类型化Q:描述了一个对象可在什么时候被用来替代另一个对象?/span>

n         C++的承机制既指类l承Q又指接口ѝ?/span>

n         C++通过l承U虚cL实现接口l承?/span>

n         JavaҎ口承具有单独的语言构造方式-Java接口?/span>

n         Java接口构造方式更加易于表辑֒实现那些专注于对象接口的设计?/span>

接口的好?/span>

n         优点Q?/span>

F        Client不必知道其用对象的具体所属类?/span>

F        一个对象可以很Ҏ地被Q实C相同接口的)的另一个对象所替换?/span>

F        对象间的q接不必绑定(hardwireQ到一个具体类的对象上Q因此增加了灉|性?/span>

F        松散藕合Q?/span>loosens couplingQ?/span>

F        增加了重用的可能性?/span>

F        提高了(对象Q组合的机率Q因包含对象可以是Q何实C一个指定接口的cR?/span>

n         ~点Q?/span>

F        设计的复杂性略有增?/span>

Q译者注Q接口表C?/span>?/span>?/span>?/span>”(LikeAQ的关系Q承表C?/span>?/span>?/span>?/span>”(IsAQ的关系Q组合表C?/span>?/span>?/span>?/span>”(HasAQ的关系。)

接口实例

该方法是指其它的一些类可以q行交通工LNQ而不必关心其实际上是Q汽车,轮船Q潜艇或是其它Q何实CIManeuverabre的对象)?/span>



水煮三国 2006-08-02 15:22 发表评论
]]>
Java 中final,finally,finalized的?/title><link>http://www.tkk7.com/os586/archive/2006/08/01/61124.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 01 Aug 2006 01:06:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/08/01/61124.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/61124.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/08/01/61124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/61124.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/61124.html</trackback:ping><description><![CDATA[finalQ?br />final可以让你控制你的成员、方法或者是一个类是否可被覆写或承等功能Q这些特点final在Java中拥有了一个不可或~的CQ也是学习Java时必要知道和掌握的关键字之一?br />final成员<br />当你在类中定义变量时Q在其前面加上final关键字,那便是说Q这个变量一旦被初始化便不可改变Q这里不可改变的意思对基本cd来说是其g可变Q而对于对象变量来说其引用不可再变。其初始化可以在两个地方Q一是其定义处,二是在构造函CQ两者只能选其一?br />下面E序很简单的演示了final的常规用法:<br />public class Test{<br />    final int t = 1; // 在定义时l?br />    // 或者(两者只能选其一Q?br />    final int t;<br />    public Test(){<br />        t = 3; // 构造时l?br />}<br />}<br /><br />q有一U用法是定义Ҏ中的参数为finalQ对于基本类型的变量Q这样做q没有什么实际意义,因ؓ基本cd的变量在调用Ҏ时是传值的Q也是说你可以在方法中更改q个参数变量而不会媄响到调用语句Q然而对于对象变量,却显得很实用Q因为对象变量在传递时是传递其引用Q这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量Ӟ明确使用finalq行声明Q会防止你无意的修改而媄响到调用Ҏ?br />另外Ҏ中的内部cd用到Ҏ中的参变量时Q此参变也必d明ؓfinal才可使用Q如下代码所C:<br />public class Test{<br />   void print(final String str){<br />        class InnerTest{<br />            InnerTest (){<br />                System.out.println(str);<br />            }<br />        }<br />        InnerTest it=new InnerTest ();<br />    }<br />  public static void main(String[] args){<br />      Test test=new Test();<br />      test.print("Hello word!!!");<br />  }<br />}<br />finalҎ<br />方法声明ؓfinal那有两个原因Q第一是说明你已l知道这个方法提供的功能已经满你要求,不需要进行扩展,q且也不允许M从此cȝ承的cL覆写q个ҎQ但是承仍然可以承这个方法,也就是说可以直接使用。第二就是允许编译器所有对此方法的调用转化为inlineQ行内)调用的机Ӟ它会使你在调用finalҎӞ直接方法主体插入到调用处,而不是进行例行的Ҏ调用Q例如保存断点,压栈{,q样可能会你的E序效率有所提高Q然而当你的ҎM非常庞大Ӟ或你在多处调用此ҎQ那么你的调用主体代码便会迅速膨胀Q可能反而会影响效率Q所以你要慎用finalq行Ҏ定义?br />finalc?br />当你final用于cn上时Q你需要仔l考虑Q因Z个finalcL无法被Q何hl承的,那也意味着此类在一个承树中是一个叶子类Qƈ且此cȝ设计已被认ؓ很完而不需要进行修Ҏ扩展。对于finalcM的成员,你可以定义其为finalQ也可以不是final。而对于方法,׃所属类为final的关p,自然也就成了final型的。你也可以明的lfinalcM的方法加上一个finalQ但q显然没有意义?br /><br />finally:<br />finally 关键字是对 Java 异常处理模型的最佌充。 finally l构使代码M执行Q而不有无异常发生。用 finally 可以l护对象的内部状态,q可以清理非内存资源。如果没有 finallyQ您的代码就会很费解。例如,下面的代码说明,在不使用 finally 的情况下您如何编写代码来释放非内存资源:<br /><br />public void writeFile(String filePath, String fileName, String args)<br />            throws IOException<br /><br />    {<br /><br />        FileWriter fw = new FileWriter(filePath + fileName);<br />        try {<br /><br />            fw.write(args);<br />        } catch (IOException e) {<br />            //1<br />            fw.close();<br />            throw e;<br />        }<br />//2<br />        fw.close();<br />    }<br />q段代码创徏了一个FileWriter objectQƈ调用 write Ҏ。在退Ҏ之前Q您必须关闭FileWriter objectQ以避免资源漏洞。ؓ了完成这一dQ我们在 //2 处调用 closeQ它是该Ҏ的最后一条语句。但是,如果 try 块中发生一个异怼怎么样呢Q在q种情况下,//2 处的 close 调用永远不会发生。因此,您必L莯个异常,q在重新发出q个异常之前在?/1 处插入对 close 的另一个调用。这样就可以保在退Ҏ之前关闭FileWriter object。这L写代码既ȝ又易于出错,但在没有 finally 的情况下q是必不可少的。有了 finallyQ前面的代码可以重写ؓ以下的Ş式:<br /><br />public void writeFile(String filePath, String fileName, String args)<br />            throws IOException<br /><br />    {<br /><br />        FileWriter fw = new FileWriter(filePath + fileName);<br />        try {<br /><br />            fw.write(args);<br />        } catch (IOException e) {<br />            throw e;<br />        } finally {<br /><br />            fw.close();<br />        }<br />    }<br />finally 块确保 close Ҏ总被执行Q而不 try 块内是否发出异常。因此,可以保在退Ҏ之前M调用 close Ҏ。这h可以确信FileWriter object被关闭ƈ且您没有泄漏资源?br /><br />finalizeQ?br /><br />  ҎJava语言规范QJVM保证调用finalize函数之前Q这个对象是不可辄Q但是JVM不保证这个函C定会被调用。另外,规范q保证finalize函数最多运行一ơ?br /><br />  通常Qfinalize用于一些不Ҏ控制、ƈ且非帔R要资源的释放Q例如一些I/O的操作,数据的连接。这些资源的释放Ҏ个应用程序是非常关键的。在q种情况下,E序员应该以通过E序本n理(包括释放)q些资源ZQ以finalize函数释放资源方式QŞ成一U双保险的管理机Ӟ而不应该仅仅依靠finalize来释放资源?img src ="http://www.tkk7.com/os586/aggbug/61124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-08-01 09:06 <a href="http://www.tkk7.com/os586/archive/2006/08/01/61124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA ?final全接?/title><link>http://www.tkk7.com/os586/archive/2006/08/01/61123.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 01 Aug 2006 00:58:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/08/01/61123.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/61123.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/08/01/61123.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/61123.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/61123.html</trackback:ping><description><![CDATA[转自JR-研究<br /><br /><font face="Arial"><strong>1.final value:<br /></strong>? cThread中的 Q?br />public static final int MAX_PRIORITY = 10; <br />// MAX_PRIORITY的g能再修改,之所以称为final value,是因为此处ؓprimitive type<br /><br /><b>2.final reference:</b><br />? public final String str = "This is a string";<br />// 指的是Object reference 为final,str不能再改而指向其他的对象,但其指向的对象ƈ不一定不能改?<br /><br />?<br />1>我们怼看见函数参数或局部变量常被声明ؓfinal,Ҏ变量是primitiveq是reference区别考虑.<br />2>.在局部内部类(local inner class)和匿名内部类(anonymous inner class)中不但可以访问外cȝ成员(包括成员变量和成员函?,q可以访问外cȝfinal 变量.<br /><br /><b>3.final class:</b><br />?public final class URL extends Object implements Serializable<br />//指URLcM能被l承,cannot be subclassed.<br /><br /><b>4.final method:</b><br />? cThread中的 : <br />public final void setPriority(int newPriority)<br />//指此Ҏ不能被子coverride,final class 中的所有方法都自动为final</font><br /><img src ="http://www.tkk7.com/os586/aggbug/61123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-08-01 08:58 <a href="http://www.tkk7.com/os586/archive/2006/08/01/61123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中内部类的用ȝhttp://www.tkk7.com/os586/archive/2006/08/01/61121.html水煮三国水煮三国Tue, 01 Aug 2006 00:53:00 GMThttp://www.tkk7.com/os586/archive/2006/08/01/61121.htmlhttp://www.tkk7.com/os586/comments/61121.htmlhttp://www.tkk7.com/os586/archive/2006/08/01/61121.html#Feedback1http://www.tkk7.com/os586/comments/commentRss/61121.htmlhttp://www.tkk7.com/os586/services/trackbacks/61121.html内部cȝ使用Q?/p>

内部cȝ使用的优~点Q?/p>

   优点Q减了在类文g~译后的产生的字节码文g的大?br />   ~点QɽE序l构不清?/p>

使用内部cȝ注意事项Q?/p>

   内部cȝ使用一般都与所在的外部cL一定的兌Q它是在一个类的内部嵌套定义的c,它可以是其它cȝ成员Q也可以在一个语句块的内部定义,q可以在表达式内部匿名定?匿名内部c??/p>

内部cL如下的特性:

  .一般用在定义它的类或语句块之内Q在外部引用它时必须l出完整的名Uͼ名字不能与包含它的数癑֐相同

 . 可以使用包含它的cȝ表态和实例成员变量Q也可以使用它所在方法的局部变?/p>

 .可以定义为abstract

 .若被声明为static,变成了层c,不能再用局部变?/p>

 .若想在inner class 中声明Q何static成员Q则该inner class必须声明为static.

 .匿名cL一U特D的内部c,它是在一个表辑ּ的内部包含一个完整的cȝ定义。匿名内部类不需要Q何的修饰词?/p>

 .内部cd以用Q何听修饰W,但是如果声明为staticc,则等同于一个标准类?/p>

 .如果非表态内部类Q就拥有对外部类的所有成员的完全讉K权限Q包括实例字D和Ҏ。ؓ实现q一行ؓQ非表态内部类存着对外部类的实例的一个隐匿的引用?/p>

 .所以对一个非表态内部类q行实例化需要采用不同语法的new 语句Q这U开工的new 语句要求外部cȝ一个实例,使内部类能在那个实例的上下文中创建?/p>

 .非表态内部类h一些限制。尤其是Q它们不能声明表态初始化列表和表态成员,除非是在帔R字段中。此外方法内部声明的内部cM能访问方法的局部变量和参数Q除非它们被初始化成final.


 .表态内部类当中可以有表态数据,表态方法或者是又一个表态内部类。而非表态内部类当中不能有静态数据。这是它们的区别?/p>

 .局部内部类QJava内部cM可以是局部的Q它可以定义在一个方法甚至一个代码块之内?/p>

 

有一炚w要注意的是,匿名内部cȝ于没有名字,所以它没有构造函敎ͼ但是如果q个匿名内部cȝ承了一个只含有带参数构造函数的父类Q创建它的时候必d上这些参敎ͼq在实现的过E中使用super关键字调用相应的内容Q。如果你惌初始化它的成员变量,有下面几U方法:

  如果是在一个方法的匿名内部c,可以利用q个Ҏ传进你想要的参数Q不q记住,q些参数必须被声明ؓfinal?

  匿名内部类攚w成有名字的局部内部类Q这样它可以拥有构造函C?

  在这个匿名内部类中用初始化代码块?

  Z么需要内部类Q?

  java内部cL什么好处?Z么需要内部类Q?/p>

  首先举一个简单的例子Q如果你惛_C个接口,但是q个接口中的一个方法和你构想的q个cM的一个方法的名称Q参数相同,你应该怎么办?q时候,你可以徏一个内部类实现q个接口。由于内部类对外部类的所有内定w是可讉K的,所以这样做可以完成所有你直接实现q个接口的功能?/p>

  不过你可能要质疑Q更改一下方法的不就行了吗?

  的确Q以此作计内部类的理由,实在没有说服力?/p>

  真正的原因是q样的,java中的内部cd接口加在一P可以的解军_被C++E序员抱怨java中存在的一个问题——没有多l承。实际上QC++的多l承设计h很复杂,而java通过内部cd上接口,可以很好的实现多l承的效果?br />


下面是用内部类的几个小例子Q?br />
 JAVA的内部类的构造方法是不会自动调用Q必d外部cd中的某个Ҏ当中或构造函数当中显C用才能够正确使用?/p>

   Class Outer{
  
        public outer(){
 System.out.println("....");
       }

        Class Inner{

 public Innter(){
 
       System.out.println("inner");
 }
        }

       public static void Main(String[] args){

            Outer a = new Outer();
       }
}

q种使用Ҏ不会关系到内部类的输出。因为它q没有显C用内部类?br />所以我们应该进行这L修改Q?/p>

  在Outer构造函C加入 Innter b = new Innter();
可以直接调用它的输出或Ҏ体了?/p>

不过我们l常使用的还是匿名内部类Q?/p>

   class Outer{

       Outer(){

 (new Inner(){
  public void print(){
   System.out.println("Inner");
   }
  }
 ).print();
 System.out.println("Outer");
       }
}

 


下面是JAVA的一个源码用了匿名内部c:
/**
* "Tokenizes" the entire stream as a single token.
*/
public class KeywordAnalyzer extends Analyzer {
public TokenStream tokenStream(String fieldName,
final Reader reader) {
return new TokenStream() {
private boolean done;
private final char[] buffer = new char[1024];
public Token next() throws IOException {
if (!done) {
done = true;
StringBuffer buffer = new StringBuffer();
int length = 0;
while (true) {
length = reader.read(this.buffer);
if (length == -1) break;
buffer.append(this.buffer, 0, length);
}
String text = buffer.toString();
return new Token(text, 0, text.length());
}
return null;
}
};
}
}



水煮三国 2006-08-01 08:53 发表评论
]]>
java当中接口与抽象类的思?/title><link>http://www.tkk7.com/os586/archive/2006/07/31/61041.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Mon, 31 Jul 2006 08:35:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/07/31/61041.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/61041.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/07/31/61041.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/61041.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/61041.html</trackback:ping><description><![CDATA[ <p>在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象cȝ认识q是很模p,很不可理解?/p> <p>刚学Java语言Ӟ很隄解ؓ什么要有接口这个概念,虽说是可以实现所谓的多承,可一个只有方法名Q没有方法体的东西,我实现它又有什么用呢?我从它那什么也得不刎ͼ除了一些方法名Q我直接在具体类里加入这些方法不p了吗Q?/p> <p>Z么一定要有抽象类q个概念Qؓ什么就不能把这个父cd成一个具体的c,子类再承它不就可以了吗Q何必弄一个抽象类出来Q还要弄一些没有方法体的抽象方法,弄得又象接口又象cȝQ让人捉怸定?/p> <p>当我开始学习java设计模式Q真正走q面向对象设计的大门之后Q我才发玎ͼ自己寚w向对象设计的理解原来是那么的片面Q那么的肤浅Q根本就没有真正理解面向对象思想的精髓,在某一U程度上q受着面向q程的媄响,以ؓ弄出了一个个c,q是面向对象了Q而其实还是被q程所׃着?/p> <p>我还是说说我现在寚w向对象思想的理解吧Q不一定正全面,但我惛_该还是比以前略有进步吧?/p> <p> <strong>面向对象思想Q我觉得最关键的就是抽象?/strong> </p> <p>一个Y件设计的好坏Q我惛_大程度上取决于它的整体架构,而这个整体架构其实就是你Ҏ个宏观商业业务的抽象框架Q当代表业务逻辑的高层抽象层l构合理Ӟ你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了。当你需要再开发另一个相q的目Ӟ你以前的抽象层说不定q可以再ơ利用呢Q面对对象的设计Q复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用,是不是一下子感觉自己对复用理解的高度又上升了一层?^_^</p> <p>说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象cMQ这也是本文我想说的重点?/p> <p>既然面向对象设计的重点在于抽象,那Java接口和Java抽象cd有它存在的必然性了?/p> <p>Java接口和Java抽象cM表的是抽象cdQ就是我们需要提出的抽象层的具体表现。OOP面向对象的编E,如果要提高程序的复用率,增加E序的可l护性,可扩展性,必L面向接口的编E,面向抽象的编E,正确C用接口、抽象类q些太有用的抽象cd做ؓ你结构层ơ上的顶层?/p> <p>Java接口和Java抽象cL太多怼的地方,又有太多特别的地方,I竟在什么地方,才是它们的最佳位|呢Q把它们比较一下,你就可以发现了?/p> <p>1、Java接口和Java抽象cL大的一个区别,在于Java抽象cd以提供某些方法的部分实现Q而Java接口不可以,q大概就是Java抽象cd一的优点吧Q但q个优点非常有用?br />如果向一个抽象类里加入一个新的具体方法时Q那么它所有的子类都一下子都得Cq个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新ҎQ所有实现这个接口的cd无法成功通过~译了,因ؓ你必让每一个类都再实现q个Ҏ才行Q这昄是Java接口的缺炏V?/p> <p>2、一个抽象类的实现只能由q个抽象cȝ子类l出Q也是_q个实现处在抽象cL定义出的l承的等U结构中Q而由于Java语言的单l承性,所以抽象类作ؓcd定义工具的效能大打折扣?br />在这一点上QJava接口的优势就出来了,M一个实C一个Java接口所规定的方法的c都可以hq个接口的类型,而一个类可以实现L多个Java接口Q从而这个类有了多U类型?/p> <p>3、从W?点不隄出,Java接口是定义؜合类型的理想工具Q؜合类表明一个类不仅仅具有某个主cd的行为,而且h其他的次要行为?/p> <p>4、结??点中抽象cdJava接口的各自优势,L典的设计模式出来了Q声明类型的工作仍然由Java接口承担Q但是同时给Z个Java抽象c,且实Cq个接口Q而其他同属于q个抽象cd的具体类可以选择实现q个Java接口Q也可以选择l承q个抽象c,也就是说在层ơ结构中QJava接口在最上面Q然后紧跟着抽象c,哈,q下两个的最大优炚w能发挥到极至了。这个模式就是“缺省适配模式”?br />在Java语言API中用了这U模式,而且全都遵@一定的命名规范QAbstract Q接口名?/p> <p>Java接口和Java抽象cȝ存在是Z用于具体cȝ实现和承的Q如果你准备写一个具体类ȝ承另一个具体类的话Q那你的设计有很大问题了。Java抽象cd是ؓ了承而存在的Q它的抽象方法就是ؓ了强制子cdd实现的?/p> <p> <font color="#000000">使用Java接口和抽象Javac进行变量的cd声明、参数是cd声明、方法的q还cd说明Q以及数据类型的转换{。而不要用具体Javac进行变量的cd声明、参数是cd声明、方法的q还cd说明Q以及数据类型的转换{?/font> </p> <p>我想Q如果你~的代码里面q一个接口和抽象c都没有的话Q也许我可以说你Ҏ没有用到M设计模式QQ何一个设计模式都是和抽象分不开的,而抽象与<font color="#000000">Java接口和抽象Javac?/font>又是分不开的?/p> <p>理解抽象Q理解Java接口和抽象Javac,我想应该是真正开始用面向对象的思想d析问题,解决问题了吧</p> <img src ="http://www.tkk7.com/os586/aggbug/61041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-07-31 16:35 <a href="http://www.tkk7.com/os586/archive/2006/07/31/61041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:使用Java中的final变量需要注意的地方http://www.tkk7.com/os586/archive/2006/07/28/60473.html水煮三国水煮三国Fri, 28 Jul 2006 01:36:00 GMThttp://www.tkk7.com/os586/archive/2006/07/28/60473.htmlhttp://www.tkk7.com/os586/comments/60473.htmlhttp://www.tkk7.com/os586/archive/2006/07/28/60473.html#Feedback1http://www.tkk7.com/os586/comments/commentRss/60473.htmlhttp://www.tkk7.com/os586/services/trackbacks/60473.html

对与java中的final变量Qjava~译器是q行了优化的。每个用了finalcd变量的地斚w不会通过q接而进行访问。比如说TestcM使用了DatacM一个final的int数字fNumber=77Q这时候,java~译器会?7q个常数~译到Testcȝ指o码或者常量池中。这P每次Testcȝ到fNumber的时候,不会通过引用q接到DatacMq行dQ而是直接使用自己保存在类文g中的副本?


对与java中的final变量Qjava~译器是q行了优化的。每个用了finalcd变量的地斚w不会通过q接而进行访问。比如说TestcM使用了DatacM一个final的int数字fNumber=77Q这时候,java~译器会?7q个常数~译到Testcȝ指o码或者常量池中。这P每次Testcȝ到fNumber的时候,不会通过引用q接到DatacMq行dQ而是直接使用自己保存在类文g中的副本?br />用程序说话:
Test.java:

public class Test{
 public static void main(String[] args){
  System.out.println(Data.fNumber);
 }
}


Data.java:

public class Data{
 public static final int fNumber=77; 
}

执行命o和结果:

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所?1985-2001 Microsoft Corp.

C:\Documents and Settings\zangmeng>cd ..

C:\Documents and Settings>cd ..

C:\>javac Test.java

C:\>java Test
77

C:\>


q时候,我们更改Data.java的内容:
public class Data{
 public static final int fNumber=777; 
}

然后执行如下命oQ?/font>

C:\>javac Data.java

C:\>java Test
77

C:\>

q里我们看到Q虽然Data.java中的fNumber已经更改?77Q而且已经重新~译了,但是因ؓ~译器把fNumber的副本保存TestcMQ所以在重新~译Testcȝ前,TestcM直把fNumber认ؓ?7而不?77。下面我们变异Test.javaQ再执行Q看看结果?/font>

C:\>javac Test.java

C:\>java Test
777

C:\>
q时候,我们看到Q重新编译的Testcd新的777数值封装到了自q中?/font>

整个q程如下Q?br />Microsoft Windows XP [版本 5.1.2600]
(C) 版权所?1985-2001 Microsoft Corp.

C:\Documents and Settings\zangmeng>cd ..

C:\Documents and Settings>cd ..

C:\>javac Test.java

C:\>java Test
77
//在这里改变了Data.java的内?br />C:\>javac Data.java

C:\>java Test
77

C:\>javac Test.java

C:\>java Test
777

C:\>



水煮三国 2006-07-28 09:36 发表评论
]]>
深入理解abstract class和interfacehttp://www.tkk7.com/os586/archive/2006/07/28/60464.html水煮三国水煮三国Fri, 28 Jul 2006 01:11:00 GMThttp://www.tkk7.com/os586/archive/2006/07/28/60464.htmlhttp://www.tkk7.com/os586/comments/60464.htmlhttp://www.tkk7.com/os586/archive/2006/07/28/60464.html#Feedback1http://www.tkk7.com/os586/comments/commentRss/60464.htmlhttp://www.tkk7.com/os586/services/trackbacks/60464.htmlabstract class和interface是Java语言中对于抽象类定义q行支持的两U机Ӟ正是׃q两U机制的存在Q才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的怼性,甚至可以怺替换Q因此很多开发者在q行抽象cd义时对于abstract class和interface的选择昑־比较随意。其实,两者之间还是有很大的区别的Q对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意囄理解是否正确、合理。本文将对它们之间的区别q行一番剖析,试图l开发者提供一个在二者之间进行选择的依据?

理解抽象c?

abstract class和interface在Java语言中都是用来进行抽象类Q本文中的抽象类q从abstract class译而来Q它表示的是一个抽象体Q而abstract class为Java语言中用于定义抽象类的一U方法,误者注意区分)定义的,那么什么是抽象c,使用抽象c能为我们带来什么好处呢Q?

在面向对象的概念中,我们知道所有的对象都是通过cL描绘的,但是反过来却不是q样。ƈ不是所有的c都是用来描l对象的Q如果一个类中没有包含够的信息来描l一个具体的对象Q这Lcd是抽象类。抽象类往往用来表征我们在对问题领域q行分析、设计中得出的抽象概念,是对一pd看上M同,但是本质上相同的具体概念的抽象。比如:如果我们q行一个图形编辑Y件的开发,׃发现问题领域存在着圆、三角Şq样一些具体概念,它们是不同的Q但是它们又都属于Ş状这样一个概念,形状q个概念在问题领域是不存在的Q它是一个抽象概c正是因为抽象的概念在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的?

在面向对象领域,抽象cM要用来进行类型隐藏。我们可以构造出一个固定的一l行为的抽象描述Q但是这l行为却能够有Q意个可能的具体实现方式。这个抽象描q就是抽象类Q而这一lQ意个可能的具体实现则表现为所有可能的zcR模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允怿改的Q同Ӟ通过从这个抽象体zQ也可扩展此模块的行为功能。熟悉OCP的读者一定知道,Z能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)Q抽象类是其中的关键所在?


从语法定义层面看abstract class和interface

在语法层面,Java语言对于abstract class和interfacel出了不同的定义方式Q下面以定义一个名为Demo的抽象类Z来说明这U不同?

使用abstract class的方式定义Demo抽象cȝ方式如下Q?

abstract class Demo ?
abstract void method1();
abstract void method2();
?
?

使用interface的方式定义Demo抽象cȝ方式如下Q?

interface Demo {
void method1();
void method2();
?
}

在abstract class方式中,Demo可以有自q数据成员Q也可以有非abstarct的成员方法,而在interface方式的实CQDemo只能够有静态的不能被修改的数据成员Q也是必须是static final的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ都是abstract的。从某种意义上说Qinterface是一U特DŞ式的abstract class?

从编E的角度来看Qabstract class和interface都可以用来实?design by contract"的思想。但是在具体的用上面还是有一些区别的?

首先Qabstract class在Java语言中表C的是一U承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧?

其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ。但是在interface的定义中Q方法却不能拥有默认行ؓQؓ了绕q这个限Ӟ必须使用委托Q但是这?增加一些复杂性,有时会造成很大的麻烦?

在抽象类中不能定义默认行存在另一个比较严重的问题Q那是可能会造成l护上的ȝ。因为如果后来想修改cȝ界面Q一般通过abstract class或者interface来表C)以适应新的情况Q比如,d新的Ҏ或者给已用的方法中d新的参数Q时Q就会非常的ȝQ可能要p很多的时_对于zcd多的情况Q尤为如此)。但是如果界面是通过abstract class来实现的Q那么可能就只需要修改定义在abstract class中的默认行ؓ可以了?

同样Q如果不能在抽象cM定义默认行ؓQ就会导致同LҎ实现出现在该抽象cȝ每一个派生类中,q反?one ruleQone place"原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心?


从设计理念层面看abstract class和interface

上面主要从语法定义和~程的角度论qCabstract class和interface的区别,q些层面的区别是比较低层ơ的、非本质的。本节从另一个层面:abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?

前面已经提到q,abstarct class在Java语言中体C一U承关p,要想使得l承关系合理Q父cdzcM间必d?is a"关系Q即父类和派生类在概忉|质上应该是相同的Q参考文献?〕中有关?is a"关系的大幅深入的论qͼ有兴的读者可以参考)。对于interface 来说则不Ӟq不要求interface的实现者和interface定义在概忉|质上是一致的Q仅仅是实现了interface定义的契U而已。ؓ了便于理解Q下面将通过一个简单的实例q行说明?

考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:

使用abstract class方式定义DoorQ?

abstract class Door {
abstract void open();
abstract void close()Q?
}


使用interface方式定义DoorQ?


interface Door {
void open();
void close();
}


其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?

如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中,主要是ؓ了展Cabstract class和interface反映在设计理念上的区别,其他斚w无关的问题都做了化或者忽略)Q下面将|列出可能的解决ҎQƈ从设计理念层面对q些不同的方案进行分析?

解决Ҏ一Q?

单的在Door的定义中增加一个alarmҎQ如下:

abstract class Door {
abstract void open();
abstract void close()Q?
abstract void alarm();
}


或?

interface Door {
void open();
void close();
void alarm();
}


那么h报警功能的AlarmDoor的定义方式如下:

class AlarmDoor extends Door {
void open() { ?}
void close() { ?}
void alarm() { ?}
}


或?

class AlarmDoor implements Door ?
void open() { ?}
void close() { ?}
void alarm() { ?}
?

q种Ҏq反了面向对象设计中的一个核心原则ISPQInterface Segregation PricipleQ,在Door的定义中把Door概念本n固有的行为方法和另外一个概?报警?的行为方法؜在了一赗这样引L一个问题是那些仅仅依赖于Doorq个概念的模块会因ؓ"报警?q个概念的改变(比如Q修改alarmҎ的参敎ͼ而改变,反之依然?

解决Ҏ二:

既然open、close和alarm属于两个不同的概念,ҎISP原则应该把它们分别定义在代表q两个概늚抽象cM。定义方式有Q这两个概念都用abstract class方式定义Q两个概念都使用interface方式定义Q一个概念用abstract class方式定义Q另一个概念用interface方式定义?

昄Q由于Java语言不支持多重承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明?

如果两个概念都用interface方式来定义,那么反映出两个问题Q?、我们可能没有理解清楚问题领域,AlarmDoor在概忉|质上到底是Doorq是报警器?2、如果我们对于问题领域的理解没有问题Q比如:我们通过对于问题领域的分析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均用interface方式定义Q反映不Zq含义?

如果我们对于问题领域的理解是QAlarmDoor在概忉|质上是DoorQ同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU承关p,而承关pd本质上是"is a"关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行ؓQ所以报警概念可以通过interface方式定义。如下所C:

abstract class Door {
abstract void open();
abstract void close()Q?
}
interface Alarm {
void alarm();
}
class AlarmDoor extends Door implements Alarm {
void open() { ?}
void close() { ?}
void alarm() { ?}
}


q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是"is a"关系Qinterface表示的是"like a"关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来了?



l论

abstract class和interface是Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ它们表现了概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法?/font>

水煮三国 2006-07-28 09:11 发表评论
]]>
避免NullPointerException异常的几U常用方?/title><link>http://www.tkk7.com/os586/archive/2006/03/03/33370.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 03 Mar 2006 01:53:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/03/03/33370.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/33370.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/03/03/33370.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/33370.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/33370.html</trackback:ping><description><![CDATA[在写JAVAE序的时候,特别是jsp/servlet之类的东西,l常会有q样一U情况:当然你辛辛苦苦地打下了千百行字母的时候,写完最后一个大括号Q当你运行这个程序进行调试时Q忽然出现NullPointerException的字P你是不是很懊丧呢。在以前我肯定会随手拿v桌上的杯子砸了?BR>l过了一q多的打字母l历Q我渐渐的ȝZ一些经验,关于NullPointerExceptionq个恶棍?BR>NullPointerExceptionq个异常出现在处理对象时对象不存在但又没有捕捉到q行处理的时候,但是在JAVA里面它又是被大多断片的类所抛出Q所以它l常会不l意的出现在你的面前。在api里的原文说明是这LQThrown when an application attempts to use null in a case where an object is required. These include:<BR><BR>* Calling the instance method of a null object.<BR>* Accessing or modifying the field of a null object.<BR>* Taking the length of null as if it were an array.<BR>* Accessing or modifying the slots of null as if it were an array.<BR>* Throwing null as if it were a Throwable value. <BR><BR>Applications should throw instances of this class to indicate other illegal uses of the null object. <BR>据我自己的统计,在我的代码中Q出现频率最多的cLString.classQ因此我们就以StringZ来看一下怎么避免在用这个类的时候遇到NullPointerException?BR>从JAVA的源代码来看QStringq个cM共在两个地方抛ZNullPointerExceptionq个异常Q一个是String的一个构造方法,一个是toLowerCaseq个ҎQ所以在用到q两个方法的时候最好捕捉一下异常?BR>q有l常遇到的是equalsq个ҎQequals出现NullPointerException异常是因为对象不存在造成的。如果是变量和常量的比较Q比如str.equals("this is a string."),如果str == null。那么就会出现NullPointerExceptionQ怎么解决呢,是把常量和变量的位|互换,"this is a string.".equals(str),q样׃会再见到NullPointerException了?BR>在jsp中经怼有一些form来提交表单给服务器,但是有时候表单项q没有填Q那么在jspE序对传上来的数据进行处理时Q就会有异常出现。这时就要在使用q些数据前进行一ơ判断,如:request.getParameter("str")Q如果没有Q何处理就直接使用的话有可能出错Q但是如果这?BR><BR>String tmp = "";<BR>if(request.getParameter("str") != null)<BR>tmp = request.getParameter("str");<BR><BR>然后再对tmpq行操作没有问题了。当Ӟ几乎所有的NullPointerException问题差不多都可以用这个方法解冟?BR>q有在用JDBC的时候,ResultSetq个对象使用的时候也会经常有NullPointerException异常Q一般来说ResultSet出现q个问题主要是sql不对的原因?img src ="http://www.tkk7.com/os586/aggbug/33370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-03-03 09:53 <a href="http://www.tkk7.com/os586/archive/2006/03/03/33370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全面理解Java中的String数据cdhttp://www.tkk7.com/os586/archive/2006/03/03/33359.html水煮三国水煮三国Fri, 03 Mar 2006 01:33:00 GMThttp://www.tkk7.com/os586/archive/2006/03/03/33359.htmlhttp://www.tkk7.com/os586/comments/33359.htmlhttp://www.tkk7.com/os586/archive/2006/03/03/33359.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/33359.htmlhttp://www.tkk7.com/os586/services/trackbacks/33359.html
  因ؓ对象的默认值是nullQ所以String的默认g是nullQ但它又是一U特D的对象Q有其它对象没有的一些特性?

  2. new String()和new String(“?都是x一个新的空字符Ԍ是空串不是nullQ?

  3. String str=”kvill”;
String str=new String (“kvill?;的区别:

  在这里,我们不谈堆,也不谈栈Q只先简单引入常量池q个单的概念?

  帔R?constant pool)指的是在~译期被定Qƈ被保存在已编译的.class文g中的一些数据。它包括了关于类、方法、接口等中的帔RQ也包括字符串常量?

  看例1Q?

String s0=”kvill?
String s1=”kvill?
String s2=”kv?+ “ill?
System.out.println( s0==s1 );
System.out.println( s0==s2 );

  l果为:

true
true

  首先Q我们要知道Java会确保一个字W串帔R只有一个拷贝?

  因ؓ例子中的s0和s1中的”kvill”都是字W串帔RQ它们在~译期就被确定了Q所以s0==s1为trueQ而”kv”和”ill”也都是字符串常量,当一个字W串由多个字W串帔Rq接而成Ӟ它自p定也是字W串帔RQ所以s2也同样在~译期就被解析ؓ一个字W串帔RQ所以s2也是帔R池中”kvill”的一个引用?

  所以我们得出s0==s1==s2;

  用new String() 创徏的字W串不是帔RQ不能在~译期就定Q所以new String() 创徏的字W串不放入常量池中,它们有自q地址I间?

  看例2Q?

String s0=”kvill?
String s1=new String(”kvill?;
String s2=”kv?+ new String(“ill?;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );

  l果为:

false
false
false

  ?中s0q是帔R池中”kvill”的应用Qs1因ؓ无法在编译期定Q所以是q行时创建的新对象”kvill”的引用Qs2因ؓ有后半部分new String(“ill?所以也无法在编译期定Q所以也是一个新创徏对象”kvill”的应用;明白了这些也q道ؓ何得出此l果了?

  4. String.intern()Q?

  再补充介l一点:存在?class文g中的帔R池,在运行期被JVM装蝲Qƈ且可以扩充。String的intern()Ҏ是扩充帔R池的一个方法;当一个String实例str调用intern()ҎӞJava查找帔R池中是否有相同Unicode的字W串帔RQ如果有Q则q回其的引用Q如果没有,则在帔R池中增加一个Unicode{于str的字W串q返回它的引用;看例3清楚了

  ?Q?

String s0= “kvill?
String s1=new String(”kvill?;
String s2=new String(“kvill?;
System.out.println( s0==s1 );
System.out.println( ?*********?);
s1.intern();
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );

  l果为:

false
**********
false //虽然执行了s1.intern(),但它的返回值没有赋ls1
true //说明s1.intern()q回的是帔R池中”kvill”的引用
true

  最后我再破除一个错误的理解Q?

  有h_“用String.intern()Ҏ则可以将一个Stringcȝ保存C个全局String表中Q如果具有相同值的Unicode字符串已l在q个表中Q那么该Ҏq回表中已有字符串的地址Q如果在表中没有相同值的字符Ԍ则将自己的地址注册到表中“如果我把他说的q个全局的String表理解ؓ帔R池的话,他的最后一句话Q“如果在表中没有相同值的字符Ԍ则将自己的地址注册到表中”是错的Q?

  看例4Q?

String s1=new String("kvill");
String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );

  l果Q?

false
kvill kvill
true

  在这个类中我们没有声名一个”kvill”常量,所以常量池中一开始是没有”kvill”的Q当我们调用s1.intern()后就在常量池中新d了一个”kvill”常量,原来的不在常量池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了?

  s1==s1.intern()为false说明原来的“kvill”仍然存在;

  s2现在为常量池中“kvill”的地址Q所以有s2==s1.intern()为true?

  5. 关于equals()?=:

  q个对于String单来说就是比较两字符串的Unicode序列是否相当Q如果相{返回true;?=是比较两字符串的地址是否相同Q也是是否是同一个字W串的引用?

  6. 关于String是不可变?BR>
  q一说又要说很多Q大家只要知道String的实例一旦生成就不会再改变了Q比如说QString str=”kv?”ill???”ans?
是?个字W串帔RQ首先”kv”和”ill”生成了”kvill”存在内存中Q然后”kvill”又和??生成 ”kvill “存在内存中Q最后又和生成了”kvill ans?q把q个字符串的地址赋给了str,是因ؓString的“不可变”生了很多临时变量Q这也就是ؓ什么徏议用StringBuffer的原因了Q因为StringBuffer是可改变?

水煮三国 2006-03-03 09:33 发表评论
]]>
l典的Object转ؓString的几UŞ式[摘]http://www.tkk7.com/os586/archive/2006/03/03/33356.html水煮三国水煮三国Fri, 03 Mar 2006 01:18:00 GMThttp://www.tkk7.com/os586/archive/2006/03/03/33356.htmlhttp://www.tkk7.com/os586/comments/33356.htmlhttp://www.tkk7.com/os586/archive/2006/03/03/33356.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/33356.htmlhttp://www.tkk7.com/os586/services/trackbacks/33356.html
Ҏ1Q采?Object#toString()Ҏ
L下面的例子:

  Object object = getObject();

System.out.println(object.toString());

在这U用方法中Q因为java.lang.Objectc里已有publicҎ.toString()Q所以对M严格意义上的java对象都可以调用此Ҏ。但在用时要注意,必须保证object不是null|否则抛出NullPointerException异常。采用这U方法时Q通常zcM覆盖Object里的toStringQ)Ҏ?BR>
Ҏ2Q采用类型{换(StringQobjectҎ
q是标准的类型{换,object转成Stringcd的倹{用这U方法时Q需要注意的是类型必能转成Stringcd。因此最好用instanceof做个cd查,以判断是否可以{换。否则容易抛出CalssCastException异常。此外,需特别心的是因定义ؓObject cd的对象在转成String时语法检查ƈ不会报错Q这可能导致潜在的错误存在。这时要格外心。如Q?BR>
Object obj = new Integer(100);

String strVal = (String)obj;

在运行时会出错Q因为将Integercd强制转换为StringcdQ无法通过。但是,

Integer obj = new Integer(100);

String strVal = (String)obj;

如是格式代码Q将会报语法错误?BR>
此外Q因null值可以强制{换ؓMjavacȝ型,(String)null也是合法的?BR>
Ҏ3Q采用String.valueOf(Object)
String.valueOf(Object)的基是Object#toString()。但它与Object#toString()又有所不同。在前面Ҏ1的分析中提到Q用后者时需保证不ؓnull。但采用W三U方法时Q将不用担心object是否为nullD一问题。ؓ了便于说明问题,我们来分析一下相关的源代码。Jdk里String# valueOf(Object)源码如下Q?BR>
  /**

   * Returns the string representation of the Object argument.

   *

   * @param  obj  an Object.

   * @return if the argument is null, then a string equal to

   *     "null"; otherwise, the value of

   *     obj.toString() is returned.

   * @see   java.lang.Object#toString()

   */

  public static String valueOf(Object obj) {

    return (obj == null) ? "null" : obj.toString();

}

从上面的源码可以很清晰的看出nullg用担心的理由。但是,q也恰恰l了我们隐患。我们应当注意到Q当object为nullӞString.valueOfQobjectQ的值是字符东ynull”,而不是nullQ!Q在使用q程中切记要注意。试想一下,如果我们?if(String.valueOfQobjectQ?=null){System.out.println(“传入的值是nullQ?;}q样的语句将可能会发生什么问题。再想一下,向控制台输出Ӟ在视觉上如下语句在执行的l果上有什么不同:

System.out.println(String.valueOf(null));

System.out.println(null);

我们看到的输出将是一模一L东西QnullQ但它们意义相同吗?

水煮三国 2006-03-03 09:18 发表评论
]]>
վ֩ģ壺 Ƭ뿴| պ| ձһѸ| ޾ƷƵ| ʮ˽վ| ˾þô߽AV| ޹ƷëƬa| Ļһ| ޳aƬëƬ| ¸߳60Ƶ| һỵĺʹȫƵƵ߹ۿ | ߹ۿɫëƬ| ƷĻѹۿҹ| tomӰԺ޹һ| Ļ˾Ʒ| һëƬѿ| ĻƵ| У԰ɫС˵| 91鶹ƷԲ߹ۿ| Ļ| ߹ۿѹۿ| Ů߲ͬ| һƷ| ݹѾþþ91| þۺϸϾþù| v߹ۿ| ޵һ| ˳߹ۿ| ɫƵɫ¶¶ѹۿ| ձ߿Ƭ˳Ƶ1000| 鶹ȫַ| ޹AV| ۵Ӱ߹ۿ| ִֻˬƵ| רAVվ| AAAձ߲ѹۿ| Ʒ| Ʒ˿߲| ޳߹ۿ| Ļߵ| Ƶ|