??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品视频在线看,22288色视频在线观看,超碰免费97在线观看http://www.aygfsteel.com/EricGu/category/38212.html专注 学习(fn) 实践 创新zh-cnWed, 01 Jul 2009 04:34:01 GMTWed, 01 Jul 2009 04:34:01 GMT60Java语法ȝ - Ҏ(gu)http://www.aygfsteel.com/EricGu/archive/2009/06/30/284798.htmlEric GuEric GuTue, 30 Jun 2009 09:17:00 GMThttp://www.aygfsteel.com/EricGu/archive/2009/06/30/284798.htmlhttp://www.aygfsteel.com/EricGu/comments/284798.htmlhttp://www.aygfsteel.com/EricGu/archive/2009/06/30/284798.html#Feedback0http://www.aygfsteel.com/EricGu/comments/commentRss/284798.htmlhttp://www.aygfsteel.com/EricGu/services/trackbacks/284798.html
1、重写只能出现在l承关系之中。当一个类l承它的父类Ҏ(gu)Ӟ都有Z(x)重写该父cȝҎ(gu)。一个特例是父类的方法被标识为final。重写的主要优点是能够定义某个子cdҎ(gu)的行为?br />     class Animal {
        public void eat(){
            System.out.println ("Animal is eating.");
        }
    }
    
    class Horse extends Animal{
        public void eat(){
            System.out.println ("Horse is eating.");
        }
    }

2、对于从父类l承来的抽象Ҏ(gu)Q要么在子类用重写的方式设计该方法,要么把子cM标识为抽象的。所以抽象方法可以说是必要被重写的Ҏ(gu)?br />
3、重写的意义?br /> 重写Ҏ(gu)可以实现多态,用父cȝ引用来操U子cd象,但是在实际运行中对象运行其自己Ҏ(gu)的方法?br />     public class Test {
        public static void main (String[] args) {
            Animal h = new Horse();
            h.eat();    
        }
    }

    class Animal {
        public void eat(){
            System.out.println ("Animal is eating.");
        }
    }
    
    class Horse extends Animal{
        public void eat(){
            System.out.println ("Horse is eating.");
        }
        public void buck(){
        }
    }

一个原则是Q用了(jin)什么引用,~译器就?x)只调用引用cL拥有的方法。如果调用子cȝ有的Ҏ(gu)Q如上例的h.buck(); ~译器会(x)抱怨的。也是_(d)~译器只看引用类型,而不是对象类型?br />
4、重写方法的规则?br /> 若想实现一个合格重写方法,而不是重载,那么必须同时满下面的要求!

A、重写规则之一Q重写方法不能比被重写方法限制有更严格的讉KU别?br /> Q但是可以更q泛Q比如父cL法是包访问权限,子类的重写方法是public讉K权限。)(j)
比如QObjectcL个toString()Ҏ(gu)Q开始重写这个方法的时候我们d易忘记public修饰W,~译器当然不?x)放qQ何教训我们的Z(x)。出错的原因是Q没有加M讉K修饰W的Ҏ(gu)h包访问权限,包访问权限比public当然要严g(jin)Q所以编译器?x)报错的?br />
B、重写规则之二:(x)参数列表必须与被重写Ҏ(gu)的相同?br /> 重写有个孪生的弟弟叫重蝲Q也是后面要出场的。如果子cL法的参数与父cd应的Ҏ(gu)不同Q那么就是你认错Z(jin)Q那是重载,不是重写?br />
C、重写规则之三:(x)q回cd必须与被重写Ҏ(gu)的返回类型相同?br /> 父类Ҏ(gu)AQvoid eat(){}  子类Ҏ(gu)BQint eat(){}  两者虽然参数相同,可是q回cd不同Q所以不是重写?br /> 父类Ҏ(gu)AQint eat(){}   子类Ҏ(gu)BQlong eat(){}  q回cd虽然兼容父类Q但是不同就是不同,所以不是重写?br />
D、重写规则之四:(x)重写Ҏ(gu)不能抛出新的异常或者比被重写方法声明的(g)查异常更q的(g)查异常。但是可以抛出更,更有限或者不抛出异常?br />     import java.io.*;
    public class Test {
        public static void main (String[] args) {
            Animal h = new Horse();
            try {
                h.eat();    
            }
            catch (Exception e) {
            }
        }
    }

    class Animal {
        public void eat() throws Exception{
            System.out.println ("Animal is eating.");
            throw new Exception();
        }
    }
    
    class Horse extends Animal{
        public void eat() throws IOException{
            System.out.println ("Horse is eating.");
            throw new IOException();
        }
    }
q个例子中,父类抛出?jin)检查异常ExceptionQ子cL出的IOException是Exception的子c,也即是比被重写的Ҏ(gu)抛出?jin)更有限的异常,q是可以的。如果反q来Q父cL出IOExceptionQ子cL出更为宽泛的ExceptionQ那么不?x)通过~译的?br /> 注意Q这U限制只是针Ҏ(gu)查异常,至于q行时异常RuntimeException?qing)其子类不再q个限制之中?br />
E、重写规则之五:(x)不能重写被标识ؓ(f)final的方法?br />
F、重写规则之六:(x)如果一个方法不能被l承Q则不能重写它?br /> 比较典型的就是父cȝprivateҎ(gu)。下例会(x)产生一个有的现象?br />     public class Test {
        public static void main (String[] args) {
            //Animal h = new Horse();
            Horse h = new Horse();
            h.eat();
        }
    }

    class Animal {
        private void eat(){
            System.out.println ("Animal is eating.");
        }
    }
    
    class Horse extends Animal{
        public void eat(){
            System.out.println ("Horse is eating.");
        }
    }
q段代码是能通过~译的。表面上看来q反?jin)第六条规则Q但实际上那是一点y合。Animalcȝeat()Ҏ(gu)不能被(h)承,因此HorsecM的eat()Ҏ(gu)是一个全新的Ҏ(gu)Q不是重写也不是重蝲Q只是一个只属于Horsecȝ全新的方法!q点让很多hqh?jin),但是也不是那么难以理解?br /> main()Ҏ(gu)如果是这P(x)
    Animal h = new Horse();
    //Horse h = new Horse();
    h.eat();
~译器会(x)报错Qؓ(f)什么呢QHorsecȝeat()Ҏ(gu)是public的啊Q应该可以调用啊Q请牢记Q多态只看父cd用的Ҏ(gu)Q而不看子cd象的Ҏ(gu)Q?br />

二、方法的重蝲?br /> 重蝲是有好的Q它不要求你在调用一个方法之前{换数据类型,它会(x)自动地寻扑֌配的Ҏ(gu)。方法的重蝲是在~译时刻决定调用哪个方法了(jin)Q和重写不同。最最常用的地方就是构造器的重载?br />
1、基本数据类型参数的重蝲?br />     public class Test {
        static void method(byte b){
            System.out.println ("method:byte");
        }
        static void method(short s){
            System.out.println ("method:short");
        }
        static void method(int i){
            System.out.println ("method:int");
        }
        static void method(float f){
            System.out.println ("method:float");
        }
        static void method(double d){
            System.out.println ("method:double");
        }
        public static void main (String[] args) {
            method((byte)1);
            method('c');
            method(1);
            method(1L);
            method(1.1);
            method(1.1f);
        }
    }
输出l果Q?br /> method:byte
method:int
method:int
method:float
method:double
method:float

可以看出Q首先要L的是数据cd正好匚wҎ(gu)。如果找不到Q那么就提升达能力更强的数据cdQ如上例没有正好容纳long的整数类型,那么p{换ؓ(f)floatcd的。如果通过提升也不能找到合适的兼容cdQ那么编译器׃(x)报错。反正是不会(x)自动转换?yu)的数据cd的,必须自己强制转换Q自己来承担转变后果?br />
charcd比较Ҏ(gu)Q如果找不到正好匚w的类型,它会(x)转化为int而不是shortQ虽然char?6位的?br />

2、重载方法的规则?br />
A、被重蝲的方法必L变参数列表?br /> 参数必须不同Q这是最重要的!不同有两个方面,参数的个敎ͼ参数的类型,参数的顺序?br />
B、被重蝲的方法与q回cd无关?br /> 也就是说Q不能通过q回cd来区分重载方法?br />
C、被重蝲的方法可以改变访问修饰符?br /> 没有重写Ҏ(gu)那样严格的限制?br />
D、被重蝲的方法可以声明新的或者更q的(g)查异常?br /> 没有重写Ҏ(gu)那样严格的限制?br />
E、方法能够在一个类中或者在一个子cM被重载?br />

3、带对象引用参数的方法重载?br />     class Animal {}
    class Horse extends Animal{}
    
    public class Test {
        static void method(Animal a){
            System.out.println ("Animal is called.");
        }
        static void method(Horse h){
            System.out.println ("Horse is called.");
        }
        public static void main (String[] args) {
            Animal a = new Animal();
            Horse h = new Horse();
            Animal ah = new Horse();
            
            method(a);
            method(h);
            method(ah);
        }
    }
输出l果是:(x)
Animal is called.
Horse is called.
Animal is called.
前两个输出没有Q何问题。第三个Ҏ(gu)Z么不是输?#8220;Horse is called.”呢?q是那句老话Q要看引用类型而不是对象类型,Ҏ(gu)重蝲是在~译时刻决定的?jin),引用cd军_?jin)调用哪个版本的重蝲?gu)?br />

4、重载和重写Ҏ(gu)区别的小l?br /> 如果能彻底弄明白下面的例子,说明你对重蝲和重写非怺(jin)解了(jin)Q可以结束这节的复习(fn)?jin)?br />     class Animal {
        public void eat(){
            System.out.println ("Animal is eating.");    
        }
    }
    class Horse extends Animal{
        public void eat(){
            System.out.println ("Horse is eating.");    
        }
        public void eat(String food){
            System.out.println ("Horse is eating " + food);
        }
    }
    
    public class Test {
        public static void main (String[] args) {
            Animal a = new Animal();
            Horse h = new Horse();
            Animal ah = new Horse();
            
            a.eat();
            h.eat();
            h.eat("apple");
            ah.eat();
            //a.eat("apple");
            //ah.eat("apple");
        }
    }

四个输出分别是什么?被注释的两条语句Z么不能通过~译Q?br /> W一条:(x)a.eat(); 普通的Ҏ(gu)调用Q没有多态,没什么技术含量。调用了(jin)Animalcȝeat()Ҏ(gu)Q输出:(x)Animal is eating.
W二条:(x)h.eat(); 普通的Ҏ(gu)调用Q也没什么技术含量。调用了(jin)Horsecȝeat()Ҏ(gu)Q输出:(x)Horse is eating.
W三条:(x)h.eat("apple"); 重蝲。Horsecȝ两个eat()Ҏ(gu)重蝲。调用了(jin)Horsecȝeat(String food)Ҏ(gu)Q输出:(x)Horse is eating apple
W四条:(x)ah.eat(); 多态。前面有例子?jin),不难理解。输出:(x)Horse is eating.
W五条:(x)a.eat("apple"); 低的错误,AnimalcM没有eat(String food)Ҏ(gu)。因此不能通过~译?br /> W六条:(x)ah.eat("apple"); 关键点就在这里。解决的Ҏ(gu)q是那句老话Q不能看对象cdQ要看引用类型。AnimalcM没有eat(String food)Ҏ(gu)。因此不能通过~译?br />
结一下:(x)多态不军_调用哪个重蝲版本Q多态只有在军_哪个重写版本时才起作用?br /> 重蝲对应~译Ӟ重写对应q行时。够z的?jin)吧Q?br />

三、构造方法?br /> 构造方法是一U特D的Ҏ(gu)Q没有构造方法就不能创徏一个新对象。实际上Q不仅要调用对象实际cd的构造方法,q要调用其父cȝ构造方法,向上q溯Q直到ObjectcR构造方法不必显式地调用Q当使用new关键字时Q相应的构造方法会(x)自动被调用?br />
1、构造方法的规则?br /> A、构造方法能使用M讉K修饰W。包括privateQ事实上javacd有很多都是这L(fng)Q设计者不希望使用者创cȝ对象?br />
B、构造方法的名称必须与类名相同。这样得构造方法与众不同,如果我们遵守sun的编码规范,g只有构造方法的首字母是大写的?br />
C、构造方法不能有q回cd?br /> 反过来说Q有q回cd的不是构造方?br />     public class Test {
        int Test(){
            return 1;
        }
    }
q个Ҏ(gu)是什么东西?一个冒充李늚李鬼而已Qint Test()和其他Q何普通方法没什么两P是普通的Ҏ(gu)Q只不过看v来很恶心(j)Q类似恶?j)的东西在考试卷子里比较多?br />
D、如果不在类中创q构造方法,~译器会(x)自动生成默认的不带参数的构造函数?br /> q点很容易验证!写一个这L(fng)单的c,~译?br /> class Test {
}
对生成的Test.class文g反编译:(x)javap TestQ可以看刎ͼ(x)
D:"JavaCode"bin>javap Test
Compiled from "Test.java"
class Test extends java.lang.Object{
    Test();
}
看到~译器自动添加的默认构造函C(jin)吧!

E、如果只创徏?jin)带参数的构造方法,那么~译器不?x)自动添加无参的构造方法的Q?br />
F、在每个构造方法中Q如果用了(jin)重蝲构造函数this()Ҏ(gu)Q或者父cȝ构造方法super()Ҏ(gu)Q那么this()Ҏ(gu)或者super()Ҏ(gu)必须攑֜W一行。而且q两个方法只能选择一个,因此它们之间没有序问题?br />
G、除?jin)编译器生成的构造方法,而且没有昑ּ地调用super()Ҏ(gu)Q那么编译器?x)插入一个super()无参调用?br />
H、抽象类有构造方法?br />

四、静(rn)态方法的重蝲与重写(覆盖Q?br />
1、静(rn)态方法是不能被覆盖的。可以分两种情况讨论Q?br />
A、子cȝ非静(rn)态方?#8220;覆盖”父类的静(rn)态方法?br /> q种情况下,是不能通过~译的?br />
class Father{
    
static void print(){
        System.out.println (
"in father  method");
    }
}
class Child extends Father{
    
void print(){
        System.out.println (
"in child method");
    }
}

staticҎ(gu)表示该方法不兌具体的类的对象,可以通过cd直接调用Q也是~译的前期就l定?jin),不存在后期动态绑定,也就是不能实现多态。子cȝ非静(rn)态方法是与具体的对象l定的,两者有着不同的含义?br />
B、子cȝ?rn)态方?#8220;覆盖”父类?rn)态方法?br /> q个覆盖依然是带引号的。事实上把上面那个例子ChildcȝprintҎ(gu)前面加上static修饰W,实能通过~译Q但是不要以是多态!多态的特点是动态绑定,看下面的例子Q?br />
class Father{
    
static void print(){
        System.out.println (
"in father  method");
    }
}
class Child extends Father{
    
static void print(){
        System.out.println (
"in child method");
    }
}

class Test{
    
public static void main (String[] args) {
        Father f 
=new Child();
        f.print();
    }
}

输出l果是:(x)in father  method
从这个结果可以看出,q没有实现多态?br /> 但是q种形式很迷惑hQ貌似多态,实际~程中千万不要这hQ会(x)把大家搞늚Q?br /> 它不W合覆盖表现出来的特性,不应该算是覆盖!
总而言之,?rn)态方法不能被覆盖?br />
2、静(rn)态方法可以和非静(rn)态方法一栯重蝲?br /> q样的例子太多了(jin)Q我不想写例E了(jin)。看看javacd中很多这L(fng)例子?br /> 如java.util.Arrayscȝ一堆重载的binarySearchҎ(gu)?br /> 在这里提一下是因ؓ(f)查资料时看到q样的话“sun的SL275评_(d)?rn)态方法只能控刉(rn)态变量(他们本n没有Q,?rn)态方法不能被重蝲和覆?#8230;…”
大家不要怿啊!可以重蝲的。而且?rn)态与非静(rn)态方法可以重载?br />
从重载的机制很容易就理解?jin),重蝲是在~译时刻决定的?jin),非?rn)态方法都可以Q静(rn)态方法怎么可能不会(x)呢?


Eric Gu 2009-06-30 17:17 发表评论
]]>
Java语法ȝ - 字符?/title><link>http://www.aygfsteel.com/EricGu/archive/2009/06/30/284780.html</link><dc:creator>Eric Gu</dc:creator><author>Eric Gu</author><pubDate>Tue, 30 Jun 2009 07:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/EricGu/archive/2009/06/30/284780.html</guid><wfw:comment>http://www.aygfsteel.com/EricGu/comments/284780.html</wfw:comment><comments>http://www.aygfsteel.com/EricGu/archive/2009/06/30/284780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/EricGu/comments/commentRss/284780.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/EricGu/services/trackbacks/284780.html</trackback:ping><description><![CDATA[Java的String太特别了(jin)Q也太常用了(jin)Q所以重要。我初学Javap它搞蒙了(jin)Q太多؜淆的概念?jin),比如它的不变性。所以必L入机制地ȝ解它?br /> <br /> <br /> 1、String中的每个字符都是一?6位的Unicode字符Q用Unicode很容易表达丰富的国际化字W集Q比如很好的中文支持。甚至Java的标识符都可以用汉字Q但是没Z(x)用吧Q只在一本清华的《Java2实用教程》看q)(j)?br /> <br /> 2、判断空字符丌Ӏ根据需要自己选择某个或者它们的l合<br />     if ( s == null )    //从引用的角度<br />     if ( s.length() == 0 )     //从长度判?br />     if ( s.trim().length () == 0 )     //是否有多个空白字W?br /> trim()Ҏ(gu)的作用是是移除前导和N的Unicode值小?"u0020'的字W,q返?#8220;修剪”好的字符丌Ӏ这U方法很常用Q比如需要用戯入用户名Q用户不心(j)加了(jin)前导或者尾部空|一个好的程序应该知道用户不是故意的Q即使是故意的也应该点地处理?br /> 判断IZ是很常用的操作,但是Javacd直到1.6才提供了(jin)isEmpty()Ҏ(gu)。当且仅?length() ?0 时返?true?br /> <br /> 3、未初始化、空?"与null。它们是不同的概c(din)对未初始化的对象操作会(x)被编译器挡在门外Qnull是一个特D的初始化|是一个不指向M对象的引用,对引用ؓ(f)null的对象操作会(x)在运行时抛出异常NullPointerExceptionQ而空串是长度?的字W串Q和别的字符串的唯一区别是长度??br /> 例子Q?br />     public class StringTest{<br />         static String s1;<br />         public static void main(String[] args) {<br />             String s2;<br />             String s3 = "";<br />             System.out.print(s1.isEmpty());     //q行时异?br />             System.out.print(s2.isEmpty());     //~译出错<br />             System.out.print(s3.isEmpty());     //okQ输出true<br />         }<br />     }<br /> <br /> 4、StringcȝҎ(gu)很多Q在~写相关代码的时候看看JDK文档时有好处的,要不然花?jin)大量时间实C个已l存在的Ҏ(gu)是很不值得的,因ؓ(f)~写、测试、维护自q代码佉K目的成本增加Q利润减,严重的话?x)导致开不出工资……<br /> <br /> 5、字W串的比较?br /> Java不允许自定义操作W重载,因此字符串的比较要用compareTo() 或?compareToIgnoreCase()。s1.compareTo(s2)Q返回值大?则,则前者大Q等?Q一般大Q小?Q后者大。比较的依据是字W串中各个字W的Unicode倹{?br /> <br /> 6、toString()Ҏ(gu)?br /> Java的Q何对象都有toString()Ҏ(gu)Q是从Object对象l承而来的。它的作用就是让对象在输出时看v来更有意义,而不是奇怪的对象的内存地址。对试也是很有帮助的?br /> <br /> 7、String对象是不变的Q可以变化的是String对象的引用?br /> String name = "ray";<br /> name.concat("long");  //字符串连?br /> System.out.println(name); //输出nameQokQ还?ray"<br /> name = name.concat("long");  //把字W串对象q接的结果赋l了(jin)name引用<br /> System.out.println(name);  //输出nameQohQ,变成?raylong"<br /> 上述三条语句其实产生?个String对象Q?ray"Q?long"Q?raylong"。第2条语句确实生了(jin)"raylong"字符Ԍ但是没有指定把该字符串的引用赋给谁,因此没有改变name引用。第3条语句根据不变性,q没有改?ray"QJVM创徏?jin)一个新的对象,?ray"Q?long"的连接赋l了(jin)name引用Q因此引用变?sh)(jin),但是原对象没变?br /> <br /> 8、String的不变性的机制昄?x)在String帔R内有大量的冗余。如Q?1" + "2" + "3" +......+ "n" 产生?jin)n+(n+1)个String对象Q因此JavaZ(jin)更有效地使用内存QJVM留出一块特D的内存区域Q被UCؓ(f)“String帔R?#8221;。对String多么照顾啊!当编译器遇见String帔R的时候,它检查该池内是否已经存在相同的String帔R。如果找刎ͼ把新常量的引用指向现有的StringQ不创徏M新的String帔R对象?br /> <br /> 那么可能出现多个引用指向同一个String帔RQ会(x)不会(x)有别名的危险呢?No problemQString对象的不变性可以保证不?x)出现别名问题!q是String对象与普通对象的一点区别?br /> <br /> 乍看hq是底层的机ӞҎ(gu)们编E没什么媄(jing)响。而且q种机制?x)大q度提高String的效率,实际上却不是q样。ؓ(f)q接n个字W串使用字符串连接操作时Q要消耗的旉是n的^方Q因为每两个字符串连接,它们的内定w要被复制。因此在处理大量的字W串q接Ӟ而且要求性能Ӟ我们不要用StringQStringBuffer是更好的选择?br /> <br /> 8、StringBuffercRStringBuffercL可变的,不会(x)在字W串帔R池中Q而是在堆中,不会(x)留下一大堆无用的对象。而且它可字W串~冲区安全地用于多个U程。每个StringBuffer对象都有一定的定w。只要StringBuffer对象所包含的字W序列的长度没有出此容量,无需分配新的内部~冲区数l。如果内部缓冲区溢出Q则此容量自动增大。这个固定的定w?6个字W。我l这U算法v个名字叫“添饭法”。先l你一满碗饭,不够?jin)再l你一满碗饭?br /> 例子Q?br />     StringBuffer sb = new StringBuffer();    //初始定w?16 个字W?br />     sb.append("1234");    //q是4个字W,那么16个字W的定wp够了(jin)Q没有溢?br />     System.out.println(sb.length());    //输出字符串长度是4<br />     System.out.println(sb.capacity());    //输出该字W串~冲区的定w?6<br /> <br />     sb.append("12345678901234567");        //q是17个字W,16个字W的定w不够?jin),扩容?7+16个字W的定w<br />     System.out.println(sb.length());    //输出字符串长度是17<br />     System.out.println(sb.capacity());    //输出该字W串~冲区的定w?4<br /> <br />     sb.append("890").reverse().insert(10,"-");    <br />     System.out.println(sb);        //输出0987654321-09876543214321<br /> <br /> 字符串的长度和字W缓冲区的容量是两个概念Q注意区别?br /> q有串联的方式看h是不是很P用返回D接v来可以实现这U简z和优雅?br /> <br /> 10、StringBuildercR?从J2SE 5.0 提供?jin)StringBuilderc,它和StringBuffercL孪生兄弟Q很像。它存在的h(hun)值在于:(x)对字W串操作的效率更高。不的是线E安全无法保证,不保证同步。那么两者性能到底差多呢Q很多!<br /> 请参阅:(x)http://book.csdn.net/bookfiles/135/1001354628.shtml<br /> 实践Q?br /> 单个U程的时候用StringBuilderc,以提高效率,而且它的API和StringBuffer兼容Q不需要额外的学习(fn)成本Q物h(hun)廉。多U程时用StringBufferQ以保证安全?br /> <br /> 11、字W串的比较?br /> 下面q条可能?x)让你晕Q所以你可以选择看或者不看。它不会(x)对你的职业生涯造成M影响。而且谨记一条,比较字符串要用equals()ok?jin)!一旦用?#8220;==”׃(x)出现很怪异的现象。之所以把q部分放在最后,是想节省大家的时_(d)因ؓ(f)q条又臭又长。推荐三UhQ一、没事闲着型。二、想深入地理解Java的字W串Q即使明明知道学?jin)也没用。三、和我一L(fng)好研I?#8220;?#8221;字有几种写法?br /> <br /> q是那句老话QString太特D了(jin)Q以至于某些规则对String不v作用。个人感觉这U特D性ƈ不好。看例子Q?br /> 例子AQ?br />     String str1 = "java";<br />     String str2 = "java";<br />     System.out.print(str1==str2);<br /> 地球上有点Java基础的h都知道会(x)输出falseQ因?=比较的是引用Qequals比较的是内容。不是我忽?zhn)大家Q你们可以在自己的机子上q行一下,l果是trueQ原因很单,String对象被放q常量池里了(jin)Q再ơ出?#8220;java”字符串的时候,JVM很兴奋地把str2的引用也指向?#8220;java”对象Q它认ؓ(f)自己节省?jin)内存开销。不隄解吧 呵呵<br /> 例子BQ?br />     String str1 = new String("java");<br />     String str2 = new String("java");<br />     System.out.print(str1==str2);<br /> 看过上例的都学聪明了(jin)Q这ơ肯定会(x)输出trueQ很不幸QJVMq没有这么做Q结果是false。原因很单,例子A中那U声明的方式实是在String帔R池创?#8220;java”对象Q但是一旦看到new关键字,JVM?x)在堆中为String分配I间。两者声明方式貌合神,q也是我?#8220;如何创徏字符串对?#8221;攑ֈ后面来讲的原因。大家要沉住气,q有一个例子?br /> 例子CQ?br />     String str1 = "java";<br />     String str2 = "blog";<br />     String s = str1+str2;<br />     System.out.print(s=="javablog");<br /> 再看q个例子Q很多同志不敢妄a是trueq是false?jin)吧。爱玩脑{急{弯的Z(x)说是false?#8230;…恭喜你,你会(x)抢答?jin)!把那?#8220;?#8221;字去掉你完全正。原因很单,JVM实?x)对型如String str1 = "java"; 的String对象攑֜字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在q行时刻才能知道Q我们当然一眼就看穿?jin),可是Java必须在运行时才知道的Qh脑和?sh)脑的结构不同?j)Q也是说str1+str2是在堆里创徏的,s引用当然不可能指向字W串帔R池里的对象。没崩溃的hl箋(hu)看例子D?br /> 例子DQ?br />     String s1 = "java";<br />     String s2 = new String("java");<br />     System.out.print(s1.intern()==s2.intern());<br /> intern()是什么东东?反正l果是true。如果没用过q个Ҏ(gu)Q而且训练有素的程序员?sh)(x)去看JDK文档?jin)。简单点说就是用intern()Ҏ(gu)可以用“==”比较字符串的内容?jin)。在我看到intern()Ҏ(gu)到底有什么用之前Q我认ؓ(f)它太多余?jin)。其实我写的q一条也很多余,intern()Ҏ(gu)q存在诸多的问题Q如效率、实C的不l一……<br /> 例子EQ?br />     String str1 = "java";<br />     String str2 = new String("java");<br />     System.out.print(str1.equals(str2));<br /> 无论在常量池q是堆中的对象,用equals()Ҏ(gu)比较的就是内容,p么简单!看完此条的h一定很后?zhn)Q但是在开始我劝你别看?#8230;…<br /> <br /> 后记Q用彪哥的话?#8220;有意思吗Q?#8221;Q确实没劌Ӏ在写这D늚时候我也是思量再三Q感觉自己像孔乙q耀“?#8221;字有几种写法。我查了(jin)一下茴 Q回Q囘Q囬Q还有一U是“?#8221;字里面有?#8220;?#8221;字,后面q四个都加上草字?#8230;…<br /> <img src ="http://www.aygfsteel.com/EricGu/aggbug/284780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/EricGu/" target="_blank">Eric Gu</a> 2009-06-30 15:34 <a href="http://www.aygfsteel.com/EricGu/archive/2009/06/30/284780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2SE5中的最新注释功能SuppressWarnings http://www.aygfsteel.com/EricGu/archive/2009/06/16/282626.htmlEric GuEric GuTue, 16 Jun 2009 08:02:00 GMThttp://www.aygfsteel.com/EricGu/archive/2009/06/16/282626.htmlhttp://www.aygfsteel.com/EricGu/comments/282626.htmlhttp://www.aygfsteel.com/EricGu/archive/2009/06/16/282626.html#Feedback0http://www.aygfsteel.com/EricGu/comments/commentRss/282626.htmlhttp://www.aygfsteel.com/EricGu/services/trackbacks/282626.html阅读全文

Eric Gu 2009-06-16 16:02 发表评论
]]>
IntelliJ IDEA使用技巧一览表http://www.aygfsteel.com/EricGu/archive/2009/03/26/262019.htmlEric GuEric GuThu, 26 Mar 2009 01:33:00 GMThttp://www.aygfsteel.com/EricGu/archive/2009/03/26/262019.htmlhttp://www.aygfsteel.com/EricGu/comments/262019.htmlhttp://www.aygfsteel.com/EricGu/archive/2009/03/26/262019.html#Feedback0http://www.aygfsteel.com/EricGu/comments/commentRss/262019.htmlhttp://www.aygfsteel.com/EricGu/services/trackbacks/262019.htmlInelliJ IDEAJavaIDETry it1Alt-InsertCode|Generate…gettersetter
2enable/disable'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
3CodeCompletionCtrl-Alt-Spaceimport'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
4Ctrl-Shift-V5CodeCompletionCtrl-Space '300')this.width='300';if(this.height>'200')this.height='200';" border=0>
6Ctrl-/Ctrl-Shift-//-///…/Ctrl-Shift-// V;}HGn  
dy/?S GW  
/
Ctrl-Shift-/7Alt-QView|Context Info8Refactor|Copy Class…9Ctrl-D10Ctrl-W11Alt-EnterAlt-Enter12CodeCompletion.13EscapeShift-EscapeF1214Ctrl-WAlt-F815JavaShift-F1External JavaDocGeneralOptions | IDE SettingsJavaFile | Project Properties16Ctrl-F12View | File Structure PopupEnterF417Alt-F7Find Usages…18Ctrl-NGo to | Class…'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
Ctrl-Shift-NGo to | File…Java19Ctrl-BCtrl'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
20Ctrl-Alt-B21Ctrl-HBrowse Type Hierarchy
 '300')this.width='300';if(this.height>'200')this.height='200';" border=0>
22Ctrl-Shift-F7Search | Highlight Usages in FileEscape23Alt-F3Search | Incremental SearchSearch for:Escape24Ctrl-JLive TemplateitCtrl-J'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
25Introduce Variable'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
Ctrl-Alt-VRefactor | Introduce Variable'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
26Ctrl-Shift-J27Ctrl-Shift-BackspaceGo to | Last Edit LocationCtrl-Shift-Backspace28Tools | Reformat Code…Options | IDE Setting | Code StyleTools | Optimize Imports…Options | IDE Setting | Code Style | Importsimportsimports29IDEALive Templates | Live Templates'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
Tab'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
TabOptions | Live Templates30Local VCS | Show History…3132Options | IDE Settings | EditorShow method separatorscheckbox33Alt-UpAlt-Down34F2/Shift-F2Ctrl-Alt-Down/Ctrl-Alt-Up35Ctrl-OCode | Override Methods…implementsCtrl-ICode | Implement Methods…36Ctrl-P'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
37JavaCtrl-QShow Quick JavaDoc'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
38Ctrl-QShow Quick JavaDocJavaCtrl-PShow Parameter InfoCtrl-BGo to DeclarationShift-F1External JavaDocJava39Ctrl-EView | Recent FilesEnter40IDEAShift-F6Refactor | Rename…EnterDo Refactor41Project ViewStructure ViewAlt-F1View | Select in…'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
42newSmartType '300')this.width='300';if(this.height>'200')this.height='200';" border=0>
Ctrl-Shift-Space'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
43SmartTypeIDEAimplementationlistener  Component component;
  component.addMouseListener(
    new w w <caret is here> 
  );
Ctrl-Shift-Space44SmartTypeString s = (<caret is here> 
Ctrl-Shift-Space4546Ctrl-Alt-TCode | Surround with…try/catchOptions | File Templates | Code tab'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
47TabEnter48“private FileOutputStream”Ctrl-Space
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
Options | IDE Setting | Code Style

Eric Gu 2009-03-26 09:33 发表评论
]]> վ֩ģ壺 | Ϫ| | | | ǧ| Ǹ| | ˳ƽ| | | | | | | | Ȫ| Զ| | γ| | | | | ɽ| | ڶ| | | | ԭ| Ͳ| | ˳| | ī| | ɽ| | ̩| |