??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区二区中文字幕免费看,欧美一区二区日韩一区二区,911国产精品http://www.aygfsteel.com/EricGu/category/38212.html专注 学习 实践 创新zh-cnWed, 01 Jul 2009 04:34:01 GMTWed, 01 Jul 2009 04:34:01 GMT60Java语法ȝ - Ҏ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承它的父类ҎӞ都有Z重写该父cȝҎ。一个特例是父类的方法被标识为final。重写的主要优点是能够定义某个子cdҎ的行为?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承来的抽象ҎQ要么在子类用重写的方式设计该方法,要么把子cM标识为抽象的。所以抽象方法可以说是必要被重写的Ҏ?br />
3、重写的意义?br /> 重写Ҏ可以实现多态,用父cȝ引用来操U子cd象,但是在实际运行中对象运行其自己Ҏ的方法?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用了什么引用,~译器就会只调用引用cL拥有的方法。如果调用子cȝ有的ҎQ如上例的h.buck(); ~译器会抱怨的。也是_~译器只看引用类型,而不是对象类型?br />
4、重写方法的规则?br /> 若想实现一个合格重写方法,而不是重载,那么必须同时满下面的要求!

A、重写规则之一Q重写方法不能比被重写方法限制有更严格的讉KU别?br /> Q但是可以更q泛Q比如父cL法是包访问权限,子类的重写方法是public讉K权限。)
比如QObjectcL个toString()ҎQ开始重写这个方法的时候我们d易忘记public修饰W,~译器当然不会放qQ何教训我们的Z。出错的原因是Q没有加M讉K修饰W的Ҏh包访问权限,包访问权限比public当然要严gQ所以编译器会报错的?br />
B、重写规则之二:参数列表必须与被重写Ҏ的相同?br /> 重写有个孪生的弟弟叫重蝲Q也是后面要出场的。如果子cL法的参数与父cd应的Ҏ不同Q那么就是你认错ZQ那是重载,不是重写?br />
C、重写规则之三:q回cd必须与被重写Ҏ的返回类型相同?br /> 父类ҎAQvoid eat(){}  子类ҎBQint eat(){}  两者虽然参数相同,可是q回cd不同Q所以不是重写?br /> 父类ҎAQint eat(){}   子类ҎBQlong eat(){}  q回cd虽然兼容父类Q但是不同就是不同,所以不是重写?br />
D、重写规则之四:重写Ҏ不能抛出新的异常或者比被重写方法声明的查异常更q的查异常。但是可以抛出更,更有限或者不抛出异常?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个例子中,父类抛出了检查异常ExceptionQ子cL出的IOException是Exception的子c,也即是比被重写的Ҏ抛出了更有限的异常,q是可以的。如果反q来Q父cL出IOExceptionQ子cL出更为宽泛的ExceptionQ那么不会通过~译的?br /> 注意Q这U限制只是针Ҏ查异常,至于q行时异常RuntimeException及其子类不再q个限制之中?br />
E、重写规则之五:不能重写被标识ؓfinal的方法?br />
F、重写规则之六:如果一个方法不能被l承Q则不能重写它?br /> 比较典型的就是父cȝprivateҎ。下例会产生一个有的现象?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反了第六条规则Q但实际上那是一点y合。Animalcȝeat()Ҏ不能被承,因此HorsecM的eat()Ҏ是一个全新的ҎQ不是重写也不是重蝲Q只是一个只属于Horsecȝ全新的方法!q点让很多hqh了,但是也不是那么难以理解?br /> main()Ҏ如果是这P
    Animal h = new Horse();
    //Horse h = new Horse();
    h.eat();
~译器会报错Qؓ什么呢QHorsecȝeat()Ҏ是public的啊Q应该可以调用啊Q请牢记Q多态只看父cd用的ҎQ而不看子cd象的ҎQ?br />

二、方法的重蝲?br /> 重蝲是有好的Q它不要求你在调用一个方法之前{换数据类型,它会自动地寻扑֌配的Ҏ。方法的重蝲是在~译时刻决定调用哪个方法了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Ҏ。如果找不到Q那么就提升达能力更强的数据cdQ如上例没有正好容纳long的整数类型,那么p{换ؓfloatcd的。如果通过提升也不能找到合适的兼容cdQ那么编译器׃报错。反正是不会自动转换的数据cd的,必须自己强制转换Q自己来承担转变后果?br />
charcd比较ҎQ如果找不到正好匚w的类型,它会转化为int而不是shortQ虽然char?6位的?br />

2、重载方法的规则?br />
A、被重蝲的方法必L变参数列表?br /> 参数必须不同Q这是最重要的!不同有两个方面,参数的个敎ͼ参数的类型,参数的顺序?br />
B、被重蝲的方法与q回cd无关?br /> 也就是说Q不能通过q回cd来区分重载方法?br />
C、被重蝲的方法可以改变访问修饰符?br /> 没有重写Ҏ那样严格的限制?br />
D、被重蝲的方法可以声明新的或者更q的查异常?br /> 没有重写Ҏ那样严格的限制?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果是:
Animal is called.
Horse is called.
Animal is called.
前两个输出没有Q何问题。第三个ҎZ么不是输?#8220;Horse is called.”呢?q是那句老话Q要看引用类型而不是对象类型,Ҏ重蝲是在~译时刻决定的了,引用cd军_了调用哪个版本的重蝲Ҏ?br />

4、重载和重写Ҏ区别的小l?br /> 如果能彻底弄明白下面的例子,说明你对重蝲和重写非怺解了Q可以结束这节的复习了?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一条:a.eat(); 普通的Ҏ调用Q没有多态,没什么技术含量。调用了Animalcȝeat()ҎQ输出:Animal is eating.
W二条:h.eat(); 普通的Ҏ调用Q也没什么技术含量。调用了Horsecȝeat()ҎQ输出:Horse is eating.
W三条:h.eat("apple"); 重蝲。Horsecȝ两个eat()Ҏ重蝲。调用了Horsecȝeat(String food)ҎQ输出:Horse is eating apple
W四条:ah.eat(); 多态。前面有例子了,不难理解。输出:Horse is eating.
W五条:a.eat("apple"); 低的错误,AnimalcM没有eat(String food)Ҏ。因此不能通过~译?br /> W六条:ah.eat("apple"); 关键点就在这里。解决的Ҏq是那句老话Q不能看对象cdQ要看引用类型。AnimalcM没有eat(String food)Ҏ。因此不能通过~译?br />
结一下:多态不军_调用哪个重蝲版本Q多态只有在军_哪个重写版本时才起作用?br /> 重蝲对应~译Ӟ重写对应q行时。够z的了吧Q?br />

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

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

四、静态方法的重蝲与重写(覆盖Q?br />
1、静态方法是不能被覆盖的。可以分两种情况讨论Q?br />
A、子cȝ非静态方?#8220;覆盖”父类的静态方法?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Ҏ表示该方法不兌具体的类的对象,可以通过cd直接调用Q也是~译的前期就l定了,不存在后期动态绑定,也就是不能实现多态。子cȝ非静态方法是与具体的对象l定的,两者有着不同的含义?br />
B、子cȝ静态方?#8220;覆盖”父类静态方法?br /> q个覆盖依然是带引号的。事实上把上面那个例子ChildcȝprintҎ前面加上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果是:in father  method
从这个结果可以看出,q没有实现多态?br /> 但是q种形式很迷惑hQ貌似多态,实际~程中千万不要这hQ会把大家搞늚Q?br /> 它不W合覆盖表现出来的特性,不应该算是覆盖!
总而言之,静态方法不能被覆盖?br />
2、静态方法可以和非静态方法一栯重蝲?br /> q样的例子太多了Q我不想写例E了。看看javacd中很多这L例子?br /> 如java.util.Arrayscȝ一堆重载的binarySearchҎ?br /> 在这里提一下是因ؓ查资料时看到q样的话“sun的SL275评_静态方法只能控刉态变量(他们本n没有Q,静态方法不能被重蝲和覆?#8230;…”
大家不要怿啊!可以重蝲的。而且静态与非静态方法可以重载?br />
从重载的机制很容易就理解了,重蝲是在~译时刻决定的了,非静态方法都可以Q静态方法怎么可能不会呢?


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太特别了Q也太常用了Q所以重要。我初学Javap它搞蒙了Q太多؜淆的概念了,比如它的不变性。所以必L入机制地ȝ解它?br /> <br /> <br /> 1、String中的每个字符都是一?6位的Unicode字符Q用Unicode很容易表达丰富的国际化字W集Q比如很好的中文支持。甚至Java的标识符都可以用汉字Q但是没Z用吧Q只在一本清华的《Java2实用教程》看q)?br /> <br /> 2、判断空字符丌Ӏ根据需要自己选择某个或者它们的l合<br />     if ( s == null )    //从引用的角度<br />     if ( s.length() == 0 )     //从长度判?br />     if ( s.trim().length () == 0 )     //是否有多个空白字W?br /> trim()Ҏ的作用是是移除前导和N的Unicode值小?"u0020'的字W,q返?#8220;修剪”好的字符丌Ӏ这U方法很常用Q比如需要用戯入用户名Q用户不心加了前导或者尾部空|一个好的程序应该知道用户不是故意的Q即使是故意的也应该点地处理?br /> 判断IZ是很常用的操作,但是Javacd直到1.6才提供了isEmpty()Ҏ。当且仅?length() ?0 时返?true?br /> <br /> 3、未初始化、空?"与null。它们是不同的概c对未初始化的对象操作会被编译器挡在门外Qnull是一个特D的初始化|是一个不指向M对象的引用,对引用ؓnull的对象操作会在运行时抛出异常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ȝҎ很多Q在~写相关代码的时候看看JDK文档时有好处的,要不然花了大量时间实C个已l存在的Ҏ是很不值得的,因ؓ~写、测试、维护自q代码佉K目的成本增加Q利润减,严重的话会导致开不出工资……<br /> <br /> 5、字W串的比较?br /> Java不允许自定义操作W重载,因此字符串的比较要用compareTo() 或?compareToIgnoreCase()。s1.compareTo(s2)Q返回值大?则,则前者大Q等?Q一般大Q小?Q后者大。比较的依据是字W串中各个字W的Unicode倹{?br /> <br /> 6、toString()Ҏ?br /> Java的Q何对象都有toString()Ҏ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了name引用<br /> System.out.println(name);  //输出nameQohQ,变成?raylong"<br /> 上述三条语句其实产生?个String对象Q?ray"Q?long"Q?raylong"。第2条语句确实生了"raylong"字符Ԍ但是没有指定把该字符串的引用赋给谁,因此没有改变name引用。第3条语句根据不变性,q没有改?ray"QJVM创徏了一个新的对象,?ray"Q?long"的连接赋l了name引用Q因此引用变了,但是原对象没变?br /> <br /> 8、String的不变性的机制昄会在String帔R内有大量的冗余。如Q?1" + "2" + "3" +......+ "n" 产生了n+(n+1)个String对象Q因此JavaZ更有效地使用内存QJVM留出一块特D的内存区域Q被UCؓ“String帔R?#8221;。对String多么照顾啊!当编译器遇见String帔R的时候,它检查该池内是否已经存在相同的String帔R。如果找刎ͼ把新常量的引用指向现有的StringQ不创徏M新的String帔R对象?br /> <br /> 那么可能出现多个引用指向同一个String帔RQ会不会有别名的危险呢?No problemQString对象的不变性可以保证不会出现别名问题!q是String对象与普通对象的一点区别?br /> <br /> 乍看hq是底层的机ӞҎ们编E没什么媄响。而且q种机制会大q度提高String的效率,实际上却不是q样。ؓq接n个字W串使用字符串连接操作时Q要消耗的旉是n的^方Q因为每两个字符串连接,它们的内定w要被复制。因此在处理大量的字W串q接Ӟ而且要求性能Ӟ我们不要用StringQStringBuffer是更好的选择?br /> <br /> 8、StringBuffercRStringBuffercL可变的,不会在字W串帔R池中Q而是在堆中,不会留下一大堆无用的对象。而且它可字W串~冲区安全地用于多个U程。每个StringBuffer对象都有一定的定w。只要StringBuffer对象所包含的字W序列的长度没有出此容量,无需分配新的内部~冲区数l。如果内部缓冲区溢出Q则此容量自动增大。这个固定的定w?6个字W。我l这U算法v个名字叫“添饭法”。先l你一满碗饭,不够了再l你一满碗饭?br /> 例子Q?br />     StringBuffer sb = new StringBuffer();    //初始定w?16 个字W?br />     sb.append("1234");    //q是4个字W,那么16个字W的定wp够了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不够了,扩容?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 提供了StringBuilderc,它和StringBuffercL孪生兄弟Q很像。它存在的h值在于:对字W串操作的效率更高。不的是线E安全无法保证,不保证同步。那么两者性能到底差多呢Q很多!<br /> 请参阅:http://book.csdn.net/bookfiles/135/1001354628.shtml<br /> 实践Q?br /> 单个U程的时候用StringBuilderc,以提高效率,而且它的API和StringBuffer兼容Q不需要额外的学习成本Q物h廉。多U程时用StringBufferQ以保证安全?br /> <br /> 11、字W串的比较?br /> 下面q条可能会让你晕Q所以你可以选择看或者不看。它不会对你的职业生涯造成M影响。而且谨记一条,比较字符串要用equals()ok了!一旦用?#8220;==”׃出现很怪异的现象。之所以把q部分放在最后,是想节省大家的时_因ؓq条又臭又长。推荐三UhQ一、没事闲着型。二、想深入地理解Java的字W串Q即使明明知道学了也没用。三、和我一L好研I?#8220;?#8221;字有几种写法?br /> <br /> q是那句老话QString太特D了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都知道会输出falseQ因?=比较的是引用Qequals比较的是内容。不是我忽悠大家Q你们可以在自己的机子上q行一下,l果是trueQ原因很单,String对象被放q常量池里了Q再ơ出?#8220;java”字符串的时候,JVM很兴奋地把str2的引用也指向?#8220;java”对象Q它认ؓ自己节省了内存开销。不隄解吧 呵呵<br /> 例子BQ?br />     String str1 = new String("java");<br />     String str2 = new String("java");<br />     System.out.print(str1==str2);<br /> 看过上例的都学聪明了Q这ơ肯定会输出trueQ很不幸QJVMq没有这么做Q结果是false。原因很单,例子A中那U声明的方式实是在String帔R池创?#8220;java”对象Q但是一旦看到new关键字,JVM会在堆中为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了吧。爱玩脑{急{弯的Z说是false?#8230;…恭喜你,你会抢答了!把那?#8220;?#8221;字去掉你完全正。原因很单,JVM实会对型如String str1 = "java"; 的String对象攑֜字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在q行时刻才能知道Q我们当然一眼就看穿了,可是Java必须在运行时才知道的Qh脑和电脑的结构不同)Q也是说str1+str2是在堆里创徏的,s引用当然不可能指向字W串帔R池里的对象。没崩溃的hl箋看例子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个ҎQ而且训练有素的程序员会去看JDK文了。简单点说就是用intern()Ҏ可以用“==”比较字符串的内容了。在我看到intern()Ҏ到底有什么用之前Q我认ؓ它太多余了。其实我写的q一条也很多余,intern()Ҏ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()Ҏ比较的就是内容,p么简单!看完此条的h一定很后悔Q但是在开始我劝你别看?#8230;…<br /> <br /> 后记Q用彪哥的话?#8220;有意思吗Q?#8221;Q确实没劌Ӏ在写这D늚时候我也是思量再三Q感觉自己像孔乙q耀“?#8221;字有几种写法。我查了一下茴 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.html在?/font>InelliJ IDEA的过E中Q通过查找资料以及一些自q摸烦Q发现这个众?/font>JavaE序员喜Ƣ的IDE里有许多值得一提的窍门,如果能熟l的它们应用于实际开发过E中Q相信它会大大节省你的开发时_而且随之而来的还会有那么一点点成就感:Q?/font>Try itQ?/font>
1、写代码时用Alt-InsertQ?/font>Code|Generate…Q可以创建类里面M字段?/font>getter?/font>setterҎ?/font>
2、右键点LҎ讎ͼ在文本的左边栏里Q激z速查菜单Q你可以快速设|?/font>enable/disable断点或者条件它的属性?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
3?/font>CodeCompletionQ代码完成)属性里的一个特D的变量是,Ȁz?/font>Ctrl-Alt-Space可以完成在或不在当前文g里的cd。如果类没有引入?/font>import标志会自动创建?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
4、?/font>Ctrl-Shift-V快捷键可以将最q用的剪脓板内定w择插入到文本。用时pȝ会弹Z个含有剪贴内容的对话框,从中你可以选择你要_脓的部分?/font>
5、利?/font>CodeCompletionQ代码完成)属性可以快速地在代码中完成各种不同地语句,Ҏ是先键入一个类名地前几个字母然后再?/font>Ctrl-Space完成全称。如果有多个选项Q它们会列在速查列表里?/font>
 '300')this.width='300';if(this.height>'200')this.height='200';" border=0>
6、用Ctrl-/?/font>Ctrl-Shift-/来注?/font>/反注释代码行与代码块?/font>
-/用单行注释标讎ͼ“//…”Q来注释/反注释当前行或者选择C码块。?/font>Ctrl-Shift-/则可以用块注释标讎ͼ“/ V;}HGn  
dy/?S GW  
/
”Q把所选块包围h。要反注释一个代码块在块中M一个地ҎCtrl-Shift-/卛_?/font>
7、按Alt-QQ?/font>View|Context InfoQ可以不需要移动代码就能查看当前方法地声明。连l按两次会显C当前所~辑的类名?/font>
8、?/font>Refactor|Copy Class…可以创徏一个所选择的类?#8220;副本”。这一点很有用Q比如,在你惌创徏一个大部分内容都和已存在类相同的类时?/font>
9、在~辑器里Ctrl-D可以复制选择的块或者没有所选块是的当前行?/font>
10?/font>Ctrl-WQ选择字)在编辑器里的功能是先选择脱字W处的单词,然后选择源代码的扩展区域。D例来_先选择一个方法名Q然后是调用q个Ҏ的表辑ּQ然后是整个语句Q然后包容块Q等{?/font>
11、如果你不想让指CZ件细节的“亮球”图标在编辑器上显C,通过?/font>Alt-Enterl合键打开所有事件列表然后用鼠标点击它就可以把这个事件文本附件的亮球|成非活动状态?/font>
q样以后׃会有指示Ҏ事g的亮球出CQ但是你仍然可以?/font>Alt-Enter快捷键用它?/font>
12、在使用CodeCompletionӞ可以用逗点Q?/font>.Q字W,逗号Q,Q分PQ)Q空格和其它字符输入弹出列表里的当前高亮部分。选择的名字会随着输入的字W自动输入到~辑器里?/font>
13、在M工具H口里?/font>Escape键都可以把焦点移到编辑器上?/font>
Shift-Escape不仅可以把焦点移到编辑器上而且q可以隐藏当前(或最后活动的Q工L口?/font>
F12键把焦点从编辑器Ud最q用的工具H口?/font>
14、在调试E序时查看Q何表辑ּ值的一个容易的Ҏ是在编辑器中选择文本Q可以按几次Ctrl-Wl合键更有效地执行这个操作)然后?/font>Alt-F8?/font>
15、要打开~辑器脱字符处用的cL者方?/font>Java文的浏览器Q就?/font>Shift-F1Q右键菜单的External JavaDocQ?/font>
要用这个功能须要把加入览器的路径Q在“General”选项中设|(Options | IDE SettingsQ,另外q要把创建的Java文加入到工E中Q?/font>File | Project PropertiesQ?/font>
16、用Ctrl-F12Q?/font>View | File Structure PopupQ键你可以在当前~辑的文件中快速导航?/font>
q时它会昄当前cȝ成员列表。选中一个要D的元素然后按Enter键或F4键。要L地定位到列表中的一个条目,只需键入它的名字卛_?/font>
17、在代码中把光标|于标记W或者它的检查点上再?/font>Alt-F7Q右键菜单中?/font>Find Usages…Q会很快地查扑ֈ在整个工E中使用地某一个类、方法或者变量的位置?/font>
18、按Ctrl-NQ?/font>Go to | Class…Q再键入cȝ名字可以快速地在编辑器里打开M一个类。从昄出来的下拉列表里选择cR?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
同样的方法你可以通过使用Ctrl-Shift-NQ?/font>Go to | File…Q打开工程中的?/font>Java文g?/font>
19、要D代码中一些地方用到的类、方法或者变量的声明Q把光标攑֜查看上再按Ctrl-B卛_。也可以通过?/font>Ctrl键的同时在查看点上单击鼠标键调{到声明处?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
20、把光标攑ֈ查看点上再按Ctrl-Alt-B可以DC个抽象方法的实现代码?/font>
21、要看一个所选择的类的承层ơ,?/font>Ctrl-HQ?/font>Browse Type HierarchyQ即可。也可以Ȁzȝ辑器中的l承关系视图查看当前~辑cȝl承关系?/font>
 '300')this.width='300';if(this.height>'200')this.height='200';" border=0>
22、?/font>Ctrl-Shift-F7Q?/font>Search | Highlight Usages in FileQ可以快速高亮显C当前文件中某一变量的用地斏V按Escape清除高亮昄?/font>
23、用Alt-F3Q?/font>Search | Incremental SearchQ在~辑器中实现快速查查找功能?/font>
?#8220;Search for:”提示工具里输入字W,使用头键朝前和朝后搜烦。按Escape退出?/font>
24、按Ctrl-Jl合键来执行一些你Ch?/font>Live Template~写。比如,?#8220;it”然后?/font>Ctrl-J看看有什么发生?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
25?/font>Introduce Variable整合帮助你简化代码中复杂的声明。D个例子,在下面的代码片断里,在代码中选择一个表辑ּQ?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
然后?/font>Ctrl-Alt-VQ?/font>Refactor | Introduce VariableQ就会出C面的l果Q?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
26?/font>Ctrl-Shift-J快捷键把两行合成一行ƈ把不必要的空格去掉以匚w你的代码格式?/font>
27?/font>Ctrl-Shift-BackspaceQ?/font>Go to | Last Edit LocationQ让你调转到代码中所做改变的最后一个地斏V?/font>
多按几次Ctrl-Shift-Backspace查看更深的修改历双Ӏ?/font>
28、用Tools | Reformat Code…Ҏ你的代码样式参考(查看Options | IDE Setting | Code StyleQ格式化代码?/font>
使用Tools | Optimize Imports…可以Ҏ讄Q查?/font>Options | IDE Setting | Code Style | ImportsQ自?#8220;优化”importsQ清除无用的imports{)?/font>
29、?/font>IDEA?/font>Live Templates | Live Templates让你在眨眼间创徏许多典型代码。比如,在一个方法里键入
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
再按Tab键看有什么事情发生了?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
?/font>Tab键在不同的模板域内移动。查?/font>Options | Live Templates获取更多的细节?/font>
30、要查看一个文件中修改的本地历ԌȀzd键菜单里?/font>Local VCS | Show History…。也怽可以D不同的文件版本,看看它们的不同之处再回滚C前的M一个版本吧?/font>
使用同样的右键菜单条目还可以看到一个目录里修改的历双Ӏ有了这个特性你׃会丢׃Q何代码了?/font>
31、如果要了解主菜单里每一个条目的用途,把鼠标指针移到菜单条目上再应用程序框架的底部的状态栏里就会显C它们的一些简短描qͼ也许会对你有帮助?/font>
32、要在编辑器里显C方法间的分隔线Q打开Options | IDE Settings | EditorQ选中“Show method separators”查盒Q?/font>checkboxQ?/font>
33?strong>?/strong>Alt-Up?/font>Alt-Down键可以在~辑器里不同的方法之间快速移动?/font>
34、用F2/Shift-F2键在高亮昄的语法错误间跌{?/font>
?/font>Ctrl-Alt-Down/Ctrl-Alt-Up快捷键则可以在编译器错误信息或者查找操作结果间跌{?/font>
35、通过?/font>Ctrl-OQ?/font>Code | Override Methods…Q可以很Ҏ地重载基本类地方法?/font>
要完成当前类implements的(或者抽象基本类的)接口的方法,׃?/font>Ctrl-IQ?/font>Code | Implement Methods…Q?/font>
36、如果光标置于一个方法调用的括号_?/font>Ctrl-P会显CZ个可用参数的列表?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
37、要快速查看编辑器脱字W处使用的类或方法的Java文档Q按Ctrl-QQ在弹出菜单?/font>Show Quick JavaDoc里)卛_?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
38、像Ctrl-QQ?/font>Show Quick JavaDoc昄z?/font>Java文Q,Ctrl-PQ?/font>Show Parameter Info昄参数信息Q,Ctrl-BQ?/font>Go to Declaration跌{到声明)Q?/font>Shift-F1Q?/font>External JavaDoc外部Java文Q以及其它一些快捷键不仅可以在编辑器里用,也可以应用在代码完成右键列表里?/font>
39?/font>Ctrl-EQ?/font>View | Recent FilesQ弹出最q访问的文g右键列表。选中文g?/font>Enter键打开?/font>
40、在IDEA中可以很Ҏ地对你的c,Ҏ以及变量q行重命名ƈ在所有用到它们的地方自动更正?/font>
试一下,把编辑器脱字W置于Q何一个变量名字上然后?/font>Shift-F6Q?/font>Refactor | Rename…Q。在对话框里键入要显C地新名字再?/font>Enter。你会浏览到使用q个变量地所有地方然后按“Do Refactor”按钮l束重命名操作?/font>
41、要在Q何视图(Project View工程视图Q?/font>Structure Viewl构视图或者其它视图)里快?/font>
选择当前~辑地部分(c,文gQ方法或者字D)Q按Alt-F1Q?/font>View | Select in…Q?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
42、在“new”字符后实例化一个已知类型对象时也许你会用到SmartType代码完成q个Ҏ。比如,键入
 '300')this.width='300';if(this.height>'200')this.height='200';" border=0>
再按Ctrl-Shift-SpaceQ?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
43、通过使用SmartType代码完成Q在IDEA中创建接口的整个匿名implementation也是非常Ҏ的,比如Q对于一?/font>listenerQ监听器Q,可以键入
  Component component;
  component.addMouseListener(
    new w w <caret is here> 
  );
然后再按Ctrl-Shift-Space看看有什么发生了?/font>
44、在你需要设|一个已知类型的表达式的值时?/font>SmartType代码完成也很有帮助。比如,键入
String s = (<caret is here> 
再按Ctrl-Shift-Space看看会有什么出现?/font>
45、在所有视N都提供了速查功能Q在树里只需键入字符可以快速定位到一个条目?/font>
46、当你想用代码片断捕捉异常时Q在~辑器里选中q个片断Q按Ctrl-Alt-TQ?/font>Code | Surround with…Q然后选择try/catch。它会自动生代码片断中抛出的所有异常的捕捉块。在Options | File Templates | Code tab中你q可以自己定制生捕捉块的模ѝ?/font>
用列表中的其它项可以包围别的一些结构?/font>
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
47、在使用代码完成Ӟ?/font>Tab键可以输入弹出列表里的高亮显C部分?/font>
不像?/font>Enter键接受输入,q个选中的名字会覆盖掉脱字符双名字的其它部分。这一点在用一个方法或者变量名替换另一个时特别有用?/font>
48、在声明一个变量时代码完成Ҏ会l你昄一个徏议名。比如,开始键?/font>“private FileOutputStream”然后?/font>Ctrl-Space
'300')this.width='300';if(this.height>'200')this.height='200';" border=0>
?/font>Options | IDE Setting | Code Style中还可以为本地变量,参数Q实例及静态字D定制名字?br />


Eric Gu 2009-03-26 09:33 发表评论
]]>
վ֩ģ壺 | | | ʯɽ| | | | | | ߰| | | | µ| | | ʡ| â| | | ƽ| | Ϫ| | ӯ| ˻| | ϲ| Դ| | | ˫| | | | | | °Ͷ| | ذ| ׺|