- Apr 15 Thu 2010 17:31
-
我期待、我等待
- Apr 03 Sat 2010 10:37
-
0402.靈魂在屏東
- Mar 31 Wed 2010 12:50
-
Java講義7 -- 再喝咖啡, 再靠近一點
Java 雖然抄自 C++ 語言, 但是還是有許多改變需要注意。
* Java 的運算符號(operator)及其運算次序跟C++相同 (修正一些C/C++未規定清楚的),
且&&與||也有short cut evaluation(或稱short circuit或lazy evaluation)的特性。
* Java 沒有指標, 保留了"參考"(reference), 但是一些規定跟C++ 也不太一樣。
-- 八大原始型態(Primitive type) 的單一變數不能宣告出"參考"
==> 在C++中可以 long salary; long& pay=salary; 使pay與salary參考同位址,
再來寫 pay=38; 就如同寫 salary=38;
但是在Java中沒有辦法這樣做。
-- 事實上, 除了八大原始型態的單一變數外, 所有其它變數都是"參考",
包括八大原始型態的array(陣列)變數也都是"參考"(即陣列是object)。
-- 既然array是參考, 宣告時不能宣告它的size
例如 int x[60]; 是錯的, 只能寫 int x[]; 或 int[] x;
之後再用如 x = new int[60]; 使 x 參考到新建的 array object,
當然宣告時也可以順便new啦, 如 int x[]= new int[60];
-- 注意 int [] x, y; 相當於 int x[], y[];
-- 複習:
Java中任何東東(包括原始型態)的 array 一律為 object, 只是個"reference"
就是說array和任何object宣告後並不會自動creat, 一定要用 new 才能生出來
* 注意對"參考"所做的assignment是改變"參考", 不是改變其參考的物件!
-- 例如假設已有 Student 這class,
Student x = new Student("張三");
Student y = new Student("李四");
y = x; // 這使 y 和 x 都參考到 "張三", 而"李四"就不見了!
// 因為Java有Auto Garbage Collection的能力, "李四"所佔記憶體會被自動回收
-- 注意如上的 y=x; 是複製"參考"而已, 若你是要複製出另一份object,
必須用clone() 這method, 例如:
y = x.clone();
這樣會複製出另一個"張三", 則y和x各參考到不同的object(不同的"張三")。
* 再注意對"參考"所做的比較也只是比較"參考"本身, 不是比較其參考到的object
所以如果x, y 仍如上述的Student, 則
if(x == y) ... // 是說如果 x和y 參考到同一個 object ...
-- 若是要比較其object 的內容是否相同, 須用equals() 這method, 例如:
if(x.equals(y)) ... // object 之內容相同
* 八大原始型態(Primitive type) 都有對應的class, 如下:
boolean ==> Boolean byte ==> Byte
char ==> Character short ==> Short
int ==> Integer long ==> Long
float ==> Float double ==> Double
(就是除了char對應Character還有int對應Integer外, 其它直接將第一字母大寫。)
所以必要時, 你可以將原始型態資料包裝成object (物件, 個體)。
* class, object, reference
-- object(物件,物體) 是 class(類別) 的一個 Instance (範例, 案例)。
-- reference(參考)可參考到object, 有點類似指標但不是指標, 不可對它作運算。
-- 萬海歸宗: Java 程式所有Class都源自 Object (沒寫extends就是extends Object)
-- base class 的reference可以參考到它所演生出的class之object
-- 在super class中除了帶有final的function外, 都為 virtual(用於Polymorphism)
* Class (static) variables vs. Instance variables
-- class中帶有 static 的變數不附屬於任一object, 所以又稱 class 變數。
-- 注意寫法跟 C++ 不同:
C++ 中寫 Student::TOTAL 表示Student這class中的TOTAL這field
Java 中要寫成 Student.TOTAL (注意在此 Student 是 class)
-- 不帶有static的變數使用時一定要配合object, 故稱Instance variables
-- 常數就是帶有final的變數, 表示不可再被改變的變數; 不是用 const 這保留字。
* Class (static) methods vs. Instance methods
-- class中帶有 static 的函數(方法)不附屬於任一object, 所以稱 class method
-- 注意使用時也是要寫成ClassName.method() 而不是 C++ 的 ClassName::method()
* 數學函數: java.lang.Math 這class提供很多常用的數學函數
-- 包括abs, min, max, ceil, floor, round, random, sqrt 以及三角函數等。
-- 還有PI值以及自然對數E兩個double常數(Math.PI 和 Math.E)。
* Java 的運算符號(operator)及其運算次序跟C++相同 (修正一些C/C++未規定清楚的),
且&&與||也有short cut evaluation(或稱short circuit或lazy evaluation)的特性。
* Java 沒有指標, 保留了"參考"(reference), 但是一些規定跟C++ 也不太一樣。
-- 八大原始型態(Primitive type) 的單一變數不能宣告出"參考"
==> 在C++中可以 long salary; long& pay=salary; 使pay與salary參考同位址,
再來寫 pay=38; 就如同寫 salary=38;
但是在Java中沒有辦法這樣做。
-- 事實上, 除了八大原始型態的單一變數外, 所有其它變數都是"參考",
包括八大原始型態的array(陣列)變數也都是"參考"(即陣列是object)。
-- 既然array是參考, 宣告時不能宣告它的size
例如 int x[60]; 是錯的, 只能寫 int x[]; 或 int[] x;
之後再用如 x = new int[60]; 使 x 參考到新建的 array object,
當然宣告時也可以順便new啦, 如 int x[]= new int[60];
-- 注意 int [] x, y; 相當於 int x[], y[];
-- 複習:
Java中任何東東(包括原始型態)的 array 一律為 object, 只是個"reference"
就是說array和任何object宣告後並不會自動creat, 一定要用 new 才能生出來
* 注意對"參考"所做的assignment是改變"參考", 不是改變其參考的物件!
-- 例如假設已有 Student 這class,
Student x = new Student("張三");
Student y = new Student("李四");
y = x; // 這使 y 和 x 都參考到 "張三", 而"李四"就不見了!
// 因為Java有Auto Garbage Collection的能力, "李四"所佔記憶體會被自動回收
-- 注意如上的 y=x; 是複製"參考"而已, 若你是要複製出另一份object,
必須用clone() 這method, 例如:
y = x.clone();
這樣會複製出另一個"張三", 則y和x各參考到不同的object(不同的"張三")。
* 再注意對"參考"所做的比較也只是比較"參考"本身, 不是比較其參考到的object
所以如果x, y 仍如上述的Student, 則
if(x == y) ... // 是說如果 x和y 參考到同一個 object ...
-- 若是要比較其object 的內容是否相同, 須用equals() 這method, 例如:
if(x.equals(y)) ... // object 之內容相同
* 八大原始型態(Primitive type) 都有對應的class, 如下:
boolean ==> Boolean byte ==> Byte
char ==> Character short ==> Short
int ==> Integer long ==> Long
float ==> Float double ==> Double
(就是除了char對應Character還有int對應Integer外, 其它直接將第一字母大寫。)
所以必要時, 你可以將原始型態資料包裝成object (物件, 個體)。
* class, object, reference
-- object(物件,物體) 是 class(類別) 的一個 Instance (範例, 案例)。
-- reference(參考)可參考到object, 有點類似指標但不是指標, 不可對它作運算。
-- 萬海歸宗: Java 程式所有Class都源自 Object (沒寫extends就是extends Object)
-- base class 的reference可以參考到它所演生出的class之object
-- 在super class中除了帶有final的function外, 都為 virtual(用於Polymorphism)
* Class (static) variables vs. Instance variables
-- class中帶有 static 的變數不附屬於任一object, 所以又稱 class 變數。
-- 注意寫法跟 C++ 不同:
C++ 中寫 Student::TOTAL 表示Student這class中的TOTAL這field
Java 中要寫成 Student.TOTAL (注意在此 Student 是 class)
-- 不帶有static的變數使用時一定要配合object, 故稱Instance variables
-- 常數就是帶有final的變數, 表示不可再被改變的變數; 不是用 const 這保留字。
* Class (static) methods vs. Instance methods
-- class中帶有 static 的函數(方法)不附屬於任一object, 所以稱 class method
-- 注意使用時也是要寫成ClassName.method() 而不是 C++ 的 ClassName::method()
* 數學函數: java.lang.Math 這class提供很多常用的數學函數
-- 包括abs, min, max, ceil, floor, round, random, sqrt 以及三角函數等。
-- 還有PI值以及自然對數E兩個double常數(Math.PI 和 Math.E)。
- Mar 31 Wed 2010 12:21
-
Java講義 -- 再談 Java 的 繼承
(1) 此程式中有一列 super(999);
第一個做出含該列以及不含該列之 running script
並且正確說明有何不同的可以賺到期中考3分
(2) 此程式改自以前給大家的man.C 之C++程式(Animal, Mankind 繼承範例)
試著與之對照看看, (man.C 在/net/ftp/pub/CSIE/course/cs2/man.C )
第一個正確列出C++和Java在這範例看出哪些不同規定的可以賺到期中考3分
follow up 時注意你的引言形式
1 //to test constructor / inheritance, CopyLeft by tsaiwn@csie.nctu.edu.tw
2 // this testM.java will generate three .class files; 也可拆成三個.java程式檔
3 class Animal {
4 int pv1; //注意沒寫屬性並非"private", 是package available,此與C++不同
5 private double pv2;
6 protected int pt1[]={0,1,2,3,4};
7 public float pb1;
8 public int pb2[]={10, 11,12,13,14,15,16};
9 public Animal(){ System.out.println("Animal pop out!");};
10 public Animal(String x){ System.out.println("Animal String "+x);};
11 public Animal(int x){
12 pv1=x; pv2=45.67;
13 this.pb1=135.246f;
14 System.out.println("Animal shows up");
15 };
16 void talk() {
17 System.out.println("Animal talk, pv1="+pv1);
18 System.out.println("\t pv2="+ pv2);
19 System.out.println("\t pb1="+ pb1);
20 System.out.println("\t pb2[6]="+ pb2[6]);
21 };
22 };
23 class Mankind extends Animal{
24 String pv3;
25 public Mankind(String name) { // Constructor
26 super(999); // TRY to COMMENT OUT this line and Test again
27 pv3=name; // .. 注意若沒寫super(999); 等於寫 super();
28 System.out.println("Mankind "+ pv3 + " appears");
29 }
30 public int pb3[]={30,31,32,33,34,35,36,37,38};
31 public void talk() {
32 System.out.print("Mankind talk, pb2[0]=" + pb2[0]);
33 System.out.println(", pv3=" + pv3 );
34 System.out.println("Mankind talk, pt1[3]=" + pt1[3]);
35 System.out.println("Mankind talk, pb3[3]=" + pb3[3]);
36 System.out.println(" pv1="+pv1);
37 // System.out.println(" pv2="+pv2); //error, 因private
38 };
39 } // C++ 需要用 ";" 結束class, 但 Java 不必了
40 public class testM{ // filename 必須與此public class 同名: testM.java
41 static Animal a, aa1=new Animal(123), aa2= new Animal(456);
42 static Mankind mm1, mm2; // object reference only, no object yet
43 public static void main(String s[]){ //別忘了static且參數是String array
44 System.out.println("Welcome to taste Java ---first let aa1 talk:");
45 aa1.talk();
46 mm1= new Mankind("Chang-3");
47 mm2= new Mankind("Lee-4");
48 System.out.println("mm1.pb1=" + mm1.pb1);
49 System.out.print(" (Let mm1 talk)\n"); mm1.talk();
50 System.out.print(" (and then DO a=mm2; a.talk();)\n");
51 a = mm2; // 這是可以的, 因為 a 屬於 mm2 所屬的父類別(super class)
52 a.talk(); // 仍會用 Mankind 裡的 talk(); 因Polymorphism 多型!
53 System.out.print(" (and then DO mm2=(Mankind)aa1; mm2.talk();)\n");
54 mm2 = (Mankind) aa1; // "cast" is required! 但仍會Runtime Exception
55 //mm2.talk();
56 }
57 } //(別告訴我說你到現在還不會將此篇存檔然後去掉line numbers)
第一個做出含該列以及不含該列之 running script
並且正確說明有何不同的可以賺到期中考3分
(2) 此程式改自以前給大家的man.C 之C++程式(Animal, Mankind 繼承範例)
試著與之對照看看, (man.C 在/net/ftp/pub/CSIE/course/cs2/man.C )
第一個正確列出C++和Java在這範例看出哪些不同規定的可以賺到期中考3分
follow up 時注意你的引言形式
1 //to test constructor / inheritance, CopyLeft by tsaiwn@csie.nctu.edu.tw
2 // this testM.java will generate three .class files; 也可拆成三個.java程式檔
3 class Animal {
4 int pv1; //注意沒寫屬性並非"private", 是package available,此與C++不同
5 private double pv2;
6 protected int pt1[]={0,1,2,3,4};
7 public float pb1;
8 public int pb2[]={10, 11,12,13,14,15,16};
9 public Animal(){ System.out.println("Animal pop out!");};
10 public Animal(String x){ System.out.println("Animal String "+x);};
11 public Animal(int x){
12 pv1=x; pv2=45.67;
13 this.pb1=135.246f;
14 System.out.println("Animal shows up");
15 };
16 void talk() {
17 System.out.println("Animal talk, pv1="+pv1);
18 System.out.println("\t pv2="+ pv2);
19 System.out.println("\t pb1="+ pb1);
20 System.out.println("\t pb2[6]="+ pb2[6]);
21 };
22 };
23 class Mankind extends Animal{
24 String pv3;
25 public Mankind(String name) { // Constructor
26 super(999); // TRY to COMMENT OUT this line and Test again
27 pv3=name; // .. 注意若沒寫super(999); 等於寫 super();
28 System.out.println("Mankind "+ pv3 + " appears");
29 }
30 public int pb3[]={30,31,32,33,34,35,36,37,38};
31 public void talk() {
32 System.out.print("Mankind talk, pb2[0]=" + pb2[0]);
33 System.out.println(", pv3=" + pv3 );
34 System.out.println("Mankind talk, pt1[3]=" + pt1[3]);
35 System.out.println("Mankind talk, pb3[3]=" + pb3[3]);
36 System.out.println(" pv1="+pv1);
37 // System.out.println(" pv2="+pv2); //error, 因private
38 };
39 } // C++ 需要用 ";" 結束class, 但 Java 不必了
40 public class testM{ // filename 必須與此public class 同名: testM.java
41 static Animal a, aa1=new Animal(123), aa2= new Animal(456);
42 static Mankind mm1, mm2; // object reference only, no object yet
43 public static void main(String s[]){ //別忘了static且參數是String array
44 System.out.println("Welcome to taste Java ---first let aa1 talk:");
45 aa1.talk();
46 mm1= new Mankind("Chang-3");
47 mm2= new Mankind("Lee-4");
48 System.out.println("mm1.pb1=" + mm1.pb1);
49 System.out.print(" (Let mm1 talk)\n"); mm1.talk();
50 System.out.print(" (and then DO a=mm2; a.talk();)\n");
51 a = mm2; // 這是可以的, 因為 a 屬於 mm2 所屬的父類別(super class)
52 a.talk(); // 仍會用 Mankind 裡的 talk(); 因Polymorphism 多型!
53 System.out.print(" (and then DO mm2=(Mankind)aa1; mm2.talk();)\n");
54 mm2 = (Mankind) aa1; // "cast" is required! 但仍會Runtime Exception
55 //mm2.talk();
56 }
57 } //(別告訴我說你到現在還不會將此篇存檔然後去掉line numbers)
- Mar 31 Wed 2010 12:17
-
Java講義 -- 補充 Java Applet 範例
Sample Java Applet
第一杯熱咖啡 MyFirstCoffee.java tsaiwn@csie.nctu.edu.tw
-- Applet 程式要配合 HTML 檔讓Browser 由 Server 端抓到Browser端執行
(當然要有內建 Java VM 之 瀏覽器) (可用 appletviewer <HTML_FILE> 測試)
1.) 先寫一個 Java 程式 MyFirstCoffee.java
import java.applet.Applet;
import java.awt.*; // Graphics, Font, Color, ...
public class MyFirstCoffee extends Applet {
///////////// 注意檔名要與 Class 名相同
String s;
public void init() {
s= getParameter("MSG");
}
public void paint(Graphics g) {
if(s == null ) s= "Ha Ha Ha !\nHee Heeee!";
// 在appletviewer抓不到ㄟ, 阿只好 ...(bug?)
g.clearRect(0, 0, getSize().width, getSize().height);
g.setColor(Color.blue); // 所有顏色常數是小寫 ! 怪哉?
g.setFont( new Font("Courier", Font.BOLD, 32) );
setBackground(Color.green); //這是Applet的method
g.drawString("Hey You!", 44, 80 );
g.setColor(Color.red); // 所有顏色常數是小寫 ! 怪哉?
g.drawRect(55, 160-32, 20*s.length() , 36); // red
g.setColor(Color.yellow);
g.fillRect(57, 160-32+2, 20*s.length()-4 , 36-4);
///
g.setFont( new Font("Courier", Font.PLAIN, 24) );
g.drawString("s.length()="+s.length(), 60, 220);
g.setFont( new Font("Courier", Font.BOLD, 32) );
g.setColor(Color.magenta); // magenta
g.drawString(s, 60, 160 );
g.setFont( new Font("標楷體", Font.BOLD, 32) );
g.setColor(Color.orange); // orange
g.drawString(s, 60, 280 );
}
}
2.) 將該.java檔案用javac 編譯(compile)成為含bytecode的檔案MyFirstCoffee.class
ccsun5 > /usr/local/jdk/jdk1.2.2/bin/javac MyFirstCoffee.java
3.) 再來寫一個配合的HTML網頁檔 test.html
<HTML>
<BODY>
<HR width=66%>
<APPLET code="MyFirstCoffee.class" width=580 height=320>
<PARAM name="MSG" value="I am Big Head Lee 李大頭!"
<param name="P2" value = "No use this time">
</applet>
<HR width=88%>
<!-- 注意在 APPLET tag 中的class檔名大小寫要與你的 class 檔完全相同!
--------------- -->
</body>
</html>
4.) 可以先用 JDK 所提供的 appletviewer 試試看:
ccsun5 > /usr/local/jdk/jdk1.2.2/bin/appletviewer test.html
5.) 依照WWW Server(httpd)設定之規定把 test.html 和 MyFirstCoffee.class
兩檔案一起放到適當的目錄, 然後到有Web瀏覽器(Browser, 如IE或Netscape)的
電腦上瀏覽該 test.html 看看, 怎麼樣, 第一杯熱咖啡的滋味 :-)
第一杯熱咖啡 MyFirstCoffee.java tsaiwn@csie.nctu.edu.tw
-- Applet 程式要配合 HTML 檔讓Browser 由 Server 端抓到Browser端執行
(當然要有內建 Java VM 之 瀏覽器) (可用 appletviewer <HTML_FILE> 測試)
1.) 先寫一個 Java 程式 MyFirstCoffee.java
import java.applet.Applet;
import java.awt.*; // Graphics, Font, Color, ...
public class MyFirstCoffee extends Applet {
///////////// 注意檔名要與 Class 名相同
String s;
public void init() {
s= getParameter("MSG");
}
public void paint(Graphics g) {
if(s == null ) s= "Ha Ha Ha !\nHee Heeee!";
// 在appletviewer抓不到ㄟ, 阿只好 ...(bug?)
g.clearRect(0, 0, getSize().width, getSize().height);
g.setColor(Color.blue); // 所有顏色常數是小寫 ! 怪哉?
g.setFont( new Font("Courier", Font.BOLD, 32) );
setBackground(Color.green); //這是Applet的method
g.drawString("Hey You!", 44, 80 );
g.setColor(Color.red); // 所有顏色常數是小寫 ! 怪哉?
g.drawRect(55, 160-32, 20*s.length() , 36); // red
g.setColor(Color.yellow);
g.fillRect(57, 160-32+2, 20*s.length()-4 , 36-4);
///
g.setFont( new Font("Courier", Font.PLAIN, 24) );
g.drawString("s.length()="+s.length(), 60, 220);
g.setFont( new Font("Courier", Font.BOLD, 32) );
g.setColor(Color.magenta); // magenta
g.drawString(s, 60, 160 );
g.setFont( new Font("標楷體", Font.BOLD, 32) );
g.setColor(Color.orange); // orange
g.drawString(s, 60, 280 );
}
}
2.) 將該.java檔案用javac 編譯(compile)成為含bytecode的檔案MyFirstCoffee.class
ccsun5 > /usr/local/jdk/jdk1.2.2/bin/javac MyFirstCoffee.java
3.) 再來寫一個配合的HTML網頁檔 test.html
<HTML>
<BODY>
<HR width=66%>
<APPLET code="MyFirstCoffee.class" width=580 height=320>
<PARAM name="MSG" value="I am Big Head Lee 李大頭!"
<param name="P2" value = "No use this time">
</applet>
<HR width=88%>
<!-- 注意在 APPLET tag 中的class檔名大小寫要與你的 class 檔完全相同!
--------------- -->
</body>
</html>
4.) 可以先用 JDK 所提供的 appletviewer 試試看:
ccsun5 > /usr/local/jdk/jdk1.2.2/bin/appletviewer test.html
5.) 依照WWW Server(httpd)設定之規定把 test.html 和 MyFirstCoffee.class
兩檔案一起放到適當的目錄, 然後到有Web瀏覽器(Browser, 如IE或Netscape)的
電腦上瀏覽該 test.html 看看, 怎麼樣, 第一杯熱咖啡的滋味 :-)
- Mar 22 Mon 2010 06:56
-
又天亮了
- Mar 22 Mon 2010 00:01
-
害怕
- Mar 21 Sun 2010 23:26
-
黑夜還沒過去,天就垮了。
- Mar 16 Tue 2010 04:25
-
神啊!請再多給我一點時間




