??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区三区久久,在线观看亚洲,亚洲国产精品久久一线不卡http://www.aygfsteel.com/yesjoy/category/7630.html<font color="red">?lt;/font><font color="blue">d爬山 所以艰?dL 所以苦?lt;/font><font color="red">?lt;/font>zh-cnTue, 31 Aug 2010 23:30:33 GMTTue, 31 Aug 2010 23:30:33 GMT60JAVA中final的用?http://www.aygfsteel.com/yesjoy/articles/125894.html★yesjoy?/dc:creator>★yesjoy?/author>Fri, 22 Jun 2007 09:55:00 GMThttp://www.aygfsteel.com/yesjoy/articles/125894.htmlhttp://www.aygfsteel.com/yesjoy/comments/125894.htmlhttp://www.aygfsteel.com/yesjoy/articles/125894.html#Feedback0http://www.aygfsteel.com/yesjoy/comments/commentRss/125894.htmlhttp://www.aygfsteel.com/yesjoy/services/trackbacks/125894.htmlfinal在Java中ƈ不常用,然而它却ؓ我们提供了诸如在C语言中定义常量的功能Q不仅如此,finalq可以让你控制你的成员、方法或者是一个类是否可被覆写或承等功能Q这些特点final在Java中拥有了一个不可或~的CQ也是学习Java时必要知道和掌握的关键字之一?
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;          //在定义时便给址?
    final int i;            //因ؓ要在构造函Cq行初始化,所以此处便不可再给?
    final List list;        //此变量也与上面的一?
    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会防止你无意的修改而媄响到调用Ҏ?
另外Ҏ中的内部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行Ҏ定义?
finalc?
  当你final用于cn上时Q你需要仔l考虑Q因Z个finalcL无法被Q何hl承的,那也意味着此类在一个承树中是一个叶子类Qƈ且此cȝ设计已被认ؓ很完而不需要进行修Ҏ扩展。对于finalcM的成员,你可以定义其为finalQ也可以不是final。而对于方法,׃所属类为final的关p,自然也就成了final型的。你也可以明的lfinalcM的方法加上一个finalQ但q显然没有意义?
  下面的程序演CZfinalҎ和finalcȝ用法Q?
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只是记住慎用?
final在设计模式中的应?
  在设计模式中有一U模式叫做不变模式,在Java中通过final关键字可以很Ҏ的实现这个模式,在讲解final成员时用到的E序Bat.java是一个不变模式的例子。如果你Ҏ感兴,可以参考阎宏博士编写的《Java与模式》一书中的讲解?
  到此为止Qthis,static,super和final的用已l说完了Q如果你对这四个关键字已l能够大致说出它们的区别与用法,那便说明你基本已l掌握。然而,世界上的M东西都不是完无~的QJava提供q四个关键字Q给E序员的~程带来了很大的便利Q但q不是说要让你到处用,一旦达到滥用的E序Q便适得其反Q所以在使用时请一定要认真考虑

]]>
static到底有什么用http://www.aygfsteel.com/yesjoy/articles/125121.html★yesjoy?/dc:creator>★yesjoy?/author>Tue, 19 Jun 2007 06:53:00 GMThttp://www.aygfsteel.com/yesjoy/articles/125121.htmlhttp://www.aygfsteel.com/yesjoy/comments/125121.htmlhttp://www.aygfsteel.com/yesjoy/articles/125121.html#Feedback0http://www.aygfsteel.com/yesjoy/comments/commentRss/125121.htmlhttp://www.aygfsteel.com/yesjoy/services/trackbacks/125121.htmljava的static关键字是非常有用?
有两U情冉|non-static无法做到的,q时你就要用statice?br>W一U:你希望不Z生了多少个对象,或不存在M对象的情形下Q那些特定数据的存储I间都只有一份;
W二U:你希望某个函C要和class objectl在一赗即使没有生Q何objectQ外界还是可以调用其static函数Q或是取用其static data?br>如何理解呢,看完下面的小例子Q就会理解了?/p>
public class StaticTest {
    
static int i = 47;
}

public class Test {
    
public static void main(String[] args) {
        System.out.println(StaticTest.i);
        StaticTest.i 
= 30;
        System.out.println(StaticTest.i);

        StaticTest t1 
= new StaticTest();
        StaticTest t2 
= new StaticTest();
        t1.i 
= 50;
        System.out.println(t1.i);
        System.out.println(t2.i);
    }

}

输出l果为:
47
30
50
50
Z么会有这Ll果呢?q是因ؓ它们都指向同一块内存?br>另外Q调用static函数或变量,除了利用对象定址外(t1.i = 50Q,也可以直接用其class名,卻IStaticTest.i = 50)?/p> 参考来自:http://www.tianya.cn/techforum/Content/414/4347.shtml

]]>
java里抽象类和接口的区别 http://www.aygfsteel.com/yesjoy/articles/31673.html★yesjoy?/dc:creator>★yesjoy?/author>Mon, 20 Feb 2006 09:11:00 GMThttp://www.aygfsteel.com/yesjoy/articles/31673.htmlhttp://www.aygfsteel.com/yesjoy/comments/31673.htmlhttp://www.aygfsteel.com/yesjoy/articles/31673.html#Feedback0http://www.aygfsteel.com/yesjoy/comments/commentRss/31673.htmlhttp://www.aygfsteel.com/yesjoy/services/trackbacks/31673.html下面的这文章讲的十分透彻了,所以{载之
abstract class和interface是Java语言中对于抽象类定义q行支持的两U机Ӟ正是׃q两U机制的存在Q才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的怼性,甚至可以怺替换Q因此很多开发者在q行抽象cd义时对于abstract class和interface的选择昑־比较随意。其实,两者之间还是有很大的区别的Q对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意囄理解是否正确、合理。本文将对它们之间的区别q行一番剖析,试图l开发者提供一个在二者之间进行选择的依据?nbsp;

理解抽象c?nbsp;

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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


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

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

前面已经提到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行说明?nbsp;

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

使用abstract class方式定义DoorQ?nbsp;

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


  
使用interface方式定义DoorQ?nbsp;


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


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

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

解决Ҏ一Q?nbsp;

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

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


  
或?nbsp;

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


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

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


  
或?nbsp;

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

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

解决Ҏ二: 

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

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

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

如果我们对于问题领域的理解是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?nbsp;

interface Alarm { 
 void alarm(); 

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


  
q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是"is a"关系Qinterface表示的是"like a"关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来了?nbsp;
posted on 2005-10-11 08:56 jackyrong的世?/A> 阅读(954) 评论(7)  ~辑 收藏 收藏?65Key 所属分c? JAVA


]]>
վ֩ģ壺 ۽| | | | ۰| | ʡ| ɽ| | | | | | | Դ| | | ͩ®| | | ǹ| | | | | ̨| | ֽ| ֦| ̳| ƽ| | | ɫ| | ̨| Ӽ| | ̴| ʹ| ͨ|