標籤

二元樹 (1) 字串常數池 (1) 投資 (3) 每月損益 (37) 例外處理 (1) 泛型 (2) 股票 (15) 指標 (5) 英文 (8) 基本資料型別 (1) 期貨 (1) 程式交易 (10) 量化投資 (5) 亂亂寫 (3) 概念 (3) 資料結構 (3) 演算法 (3) 數學 (3) 轉型 (1) AMA (1) ArrayList (1) assert (1) BeautifulSoup (1) C/C++ (8) casting (1) ClassCastException (1) classpath (1) Collection (4) Comparable (1) comparTo() (1) constructor (1) database (3) Debian (1) Dropbox (2) EA (2) enum (1) equals() (2) exception (3) extends (1) ffmpeg (1) final (1) Git (1) HashMap (1) HashSet (1) hasNext() (1) HTS (3) instanceof (1) IS-A (1) Iterator (1) JAVA (43) length (1) Linux (31) List (1) Mac (6) Map (1) ML (2) MT4 (6) MySQL (2) next() (1) NullPointerException (1) Number (1) Numpy (2) OpenCart (1) OpenCV (3) OSX (1) overloading (1) overriding (3) pandas (2) PHP (8) PriorityQueue (1) Python (11) Queue (1) random() (1) reverse() (1) Samba (1) SCJP (21) sqrt() (1) synchronized (1) talib (1) ufw (1) uTorrent (1) var-args (2) VHF (1) vim (2) Yhoo知識+ (4)

2012年10月26日 星期五

equals()和==

equals():值相等
==:指向同一物件


public class EqualsTest{
        public static void main(String[] args){
                String a = "foo";
                String b = "foo";
                String c = new String("foo");
                String d = new String("foo");
                EqualsTest et1 = new EqualsTest();
                EqualsTest et2 = new EqualsTest();

                if(a == b)      System.out.println("Same objects");  //同物件:指向字串常數池的"foo"
                if(a == c)      System.out.println("Same objects");  //不同物件:c的"foo"不在字串池
                else    System.out.println("Different objects");

                if(c == d)      System.out.println("Same objects");  //不同物件
                else    System.out.println("Different objects");

                if(a.equals(b)) System.out.println("Same string");  //回傳true,String有覆寫equals()
                if(a.equals(c)) System.out.println("Same string");  //回傳true,String有覆寫equals()

                if(et1 == et2)  System.out.println("Same objects");  //不同物件
                else    System.out.println("Different objects");

                if(et1.equals(et2))     System.out.println("Same objects");  //不同物件,沒有覆寫equals()

                else    System.out.println("Different objects");


        }
}


==========


Same objects
Different objects
Different objects
Same string
Same string
Different objects
Different objects


2012年10月25日 星期四

參考變數的轉型

class A{}
class B extends A{}
public class CastTest{
        public static void main(String[] args){
                A a = new B();
                B b = (B)new A();    //不能通過IS-A的測試:A IS-A B
                B bb = (B)a;
                a = (A)new B();
        }
}

output:
Exception in thread "main" java.lang.ClassCastException: A
at CastTest.main(CastTest.java:6)

所以可證明物件轉型是看參考變數所指向的物件


==========================

class A{ void showA(){System.out.println("A");} }
class B extends A{ void showB(){System.out.println("B");} }
public class CastTest{
        public static void main(String[] args){
                A a = new B();
                a.showA();
                ((B)a).showB();   //a看不到showB(),必須向下轉型
        }
}

output: 
A
B

method執行看型別,A要執行B的mothed,必須向下轉型成B

覆寫與多載的判斷

覆寫(overriding):
1、基本上要跟原函式一模一樣,包括修飾子、回傳型別及函式名稱,如:
    public void show(){...}
2、可以稍微不一樣的只有修飾子範圍不能小於原修飾子,跟回傳型別可以為原型別的子型別。
3、你不可以覆寫標示為final、static的函式。但可以重新定義標示為static的函式(各自定義)
4、若你不能繼承該函式,你就不能覆寫它。
5、不能宣告原函式沒有宣告的可控式例外。(若父函式沒有宣告可控式例外,則表示它可能丟出任何Exception;所以子函式可宣告任何在Exception內的例外,但不含自定義的例外)

多載(overloading):
1、必須變更參數。(光這項就能抓出一堆偽覆寫函式了)
2、可變更回傳型別。
3、可變更修飾子。
4、可宣告新的或範圍更大的可控式異常。

關於列舉的成員存取

1、enum其實是一個static的類別。
2、在class內的enum就等於是其內部的靜態類別。(inner class)
3、enum內的元素皆為static的String物件。

所以在類別外要存取一個類別內之enum成員,必須當做static類別的static成員來看待:
OuterClass.enumName.enumElement

class Foo{ public enum Direction{ NORTH, SOUTH,  EAST, WEST }}
public class Bar{ Foo.Direction d = Foo.Direction.NORTH; }

2012年10月24日 星期三

javac編譯時選項

-d
指定編譯時class檔存放路徑
javac -d mydir source/MyClass.java    //MyClass.class會存放到mydir目錄裡

-cp 或 -classpath
執行時搜尋class檔的路徑
-cp /dirA:/dirB:.     //以冒號分開不同目錄,句點為目前所在目錄
若編譯時需要用到其他存放在jar檔的class時,需指定class所在目錄或jar檔:
javac -classpath /foo/myLib.jar Book.java

jar檔預設目錄為 $/JAVA_HOME/jre/lib/ext

2012年10月23日 星期二

重要單字

encapsulate     [ɪnˋkæpsə͵let]    封裝

demonstrate    [ˋdɛmən͵stret]    證明;顯示


polymorphism     [͵pɑlɪˋmɔrfɪzm]    多型


suggest    建議


expend    秏盡


effort    [ˋɛfɚt]    盡力


toward    [təˋwɔrd]    朝、向


exhibit    [ɪgˋzɪbɪt]   展示


environment     [ɪnˋvaɪrənmənt]     環境


eligible    [ˋɛlɪdʒəb!]    有資格的


invocation     [͵ɪnvəˋkeʃən]    調用


outcome    [ˋaʊt͵kʌm]     結果


represent    [͵rɛprɪˋzɛnt]    描繪、表現


qualified    [ˋkwɑlə͵faɪd]    合格的、勝任的


indicate    [ˋɪndə͵ket]    指示; 指出


assure    保證


guaranteed    [ˋgærənˋtid]    肯定的


instead     [ɪnˋstɛd]     作為替代


candidate    [ˋkændədet]    候補者[(+for)]


separate    [ˋsɛprɪt]    個別的, 不同的


coupling    [ˋkʌplɪŋ]    耦合    低耦合,即不要跟其它有太多關聨
cohesion    [koˋhiʒən]     內聚     高內聚,功能單一

2012年10月22日 星期一

繼承後的成員變數

class Father{
        int money = 500;
        void spendMoney(int n){
                money -= n;
                System.out.println("Father spend " +n+ ",remain " +money);
        }
}
class Son extends Father{ }

public class Money{
        public static void main(String[] args){
                Father father = new Father();
                Son son = new Son();

                System.out.print("Before father spend money, son has ");
                System.out.println(son.money+ ".");
                father.spendMoney(250);
                System.out.print("After father spend money, son has ");
                System.out.println(son.money+ ".");
        }
}


output:
Before father spend money, son has 500.
Father spend 250,remain 250
After father spend money, son has 500.
自父類別繼承而來的實體變數,會變成自己的實體變數,與父類別無關。

========================================================


class Father{
        int money = 500;
        void spendMoney(int n){ money -= n; }
}
class Son extends Father{
        void spendMoney(int n){
                money -= n;
                super.spendMoney(n);    //這裡呼叫父函式來用,並不是用父物件去呼叫函式
        }
}

public class Money2{
        public static void main(String[] args){
                Father father = new Father();
                Son son = new Son();

                System.out.print("Before son spend money, son has ");
                System.out.println(son.money+ ".");
                son.spendMoney(250);
                System.out.print("After son spend money, son has ");
                System.out.println(son.money+ ".");
                System.out.println("Father has " +father.money);
        }


output:
Before son spend money, son has 500.
After son spend money, son has 0.
Father has 500
呼叫super.spendMoney(n)的意思是,Son物件呼叫父函式(spendMoney())來改變本身value的值,並不是叫Father物件呼叫自已的spendMoney()。因此父物件的value的值並不會變成250。


==================================================



class Father{
        int money = 500;
        void spendMoney(int n){ money -= n; }
}      
class Son extends Father{
        void spendMoney(int n){ super.spendMoney(n); }
        int getMoney(){ return super.money; }
}
           
public class Money2{
        public static void main(String[] args){;
                Son son = new Son();
             
                System.out.print("Before son spend money, he has ");
                System.out.println(son.money+ ".");
                son.spendMoney(250);
                System.out.print("After son spend money, he has ");
                System.out.println(son.getMoney()+ ".");
        }
}

output:

Before son spend money, he has 500.
After son spend money, he has 250.

這裡Son類別內的方法全是存取自Father類別內的方法,仍可正常運作,不會因沒有Father實體而不能存取其實體成員;所以應該可以這樣想:Son類別繼承了Father的field:money、spendMoney(),雖然在Son把spendMoney()給覆寫了,但在呼叫super.spendMoney()時,在編譯器眼裡其實是長這樣:spendMoney(250){ money -=250;}

所以我可以大膽的說,在Son繼承父類別時,在Son裡的spendMoney方法其實有兩個:
void spendMoney(int n){ money -= n; } 跟 void spendMoney(int n){ super.spendMoney(n); }
當呼叫super.spendMoney(n)時,就是呼叫自己的spendMoney(int n){ money -= n; }。
至於為什麼可以這樣想呢?因為啊,就Father類別在程式碼內沒有建立實體啊,所以它的spendMoney()根本不存在啊。Son因為繼承了Father,而且又建立了實體,所以當呼叫super.spendMoney()時,其實就是在跟編譯器說:“嘿,幫我跑一下spendMoney函式,不是跑我覆寫的那一個,是我老爸留給我的那一個spendMoney喔!謝謝!“

====================================================


class Father{
        int money = 500;
        void spendMoney(int n){ money -= n; }
}
class Son extends Father{
        int money = 250;
        void spendMoney(int n){ super.spendMoney(n); }
        void getFathersMoney(Father f){ money = f.money; }
}

public class Money3{
        public static void main(String[] args){;
                Son son = new Son();

                System.out.println("Son has " +son.money+ ".");
                son.getFathersMoney(son);
                System.out.println("Son has " +son.money+ ".");
        }
}



output:

Son has 250.
Son has 500.
這段程式碼是說,兒子偽裝成爸爸去銀行提爸爸的錢。