1.Object-Oriented Programming
a.What is a class
說明:一種能夠將資料變數與程序函數(方法),群組起來的一種 "參考型" 資料型態。
資料型態:定義容器的形狀、大小,用來定義變數。
b.What is an object
說明:以某個類別的內容為藍圖,在電腦記憶體中所動態建構出來的一種 "參考型" 變數。
c.What is the object-oriented progeamming
說明:簡言之它滿足封裝性(第8、9、10章)、繼承性(第11、12章)、與多面性(第12、13章)。
1.封裝性:可封裝資料、函數。
2.第八章練習一
仿照 sample1自訂通訊錄類別
class Contact {
String name
int number
String email
String tel
}
3.第八章練習二
設計一個 class compute,此類別可以做加總(sum)、平均(avg)、最大值(max)。
程式碼
class Compute{ //設計一個Compute類別,內含陣列、方法。
int [] data; //宣告一個 int 陣列,命名為 data。(基本資料型態)
//此data不放到下一行裡面而在這獨立是因為可以讓本class 的其他方法也能使用。
void setData(int [] nums){ //void指此方法(叫做 setData)不須回傳資料。(返回值資料型態)
//後面的程式呼叫此方法,可接收一個整數陣列(nums)的資料。
data = nums; //將接收的整數陣列(nums)的資料,一個一個放到上面data 陣列裡。
}
int [] getData(){
return data;
}
int getMax(){ //宣告一個方法,命名為 getMax,用來算最大值。
int max = -1;
for (int i=0; i<data.length; i++){
//data.length從1開始,i 是從 0開始。所以要 <,不能 <=
if (data[i] > max){ //比大小
max = data[i]; //篡位
}
}
return max;
}
int getSum(){ //宣告一個方法,命名為 getSum,用來算加總。
int sum=0;
for (int i=0; i<data.length; i++){
sum = sum + data[i]; //算加總,一個一個將 data[i] 加到 sum。
}
return sum;
}
double getAvg(){ //宣告一個方法,命名為 getAvg,用來算平均值。
double avg = (double) getSum() / data.length; //要用 double 來顯示小數點
return avg;
}
}
public class E81 {
public static void main(String[] args) {
int [] scores ={22,57,80,50,60};
Compute c = new Compute();
c.setData(scores);
System.out.println("max="+c.getMax());
System.out.println("sum="+c.getSum());
System.out.println("avg="+c.getAvg());
}
}
結果
4.第九章 建構子
1. Public & Private
Public > Protected > Default > Private
2.建構子 (constructor)
程式碼
// 車子類別
class Car
{
private int num;
private double gas;
public Car() // 這是一個建構子之1,名稱必須與 class 相同。
{
num = 0;
gas = 0.0;
System.out.println("生產了車子。");
}
public Car(int n, double g) // 這是一個建構子之2,跟建構子之1的差別是參數型別不同。
// 前面2個建構子有相同的名字,但參數個數與型別不同,叫 overloading、重載、或同名異式。
{
num = n;
gas = g;
System.out.println("生產了車號為" + num + ",汽油量為" + gas + "的車子。");
}
public void show()
{
System.out.println("車號是" + num + "。");
System.out.println("汽油量是" + gas + "。");
}
}
class Sample5
{
public static void main(String[] args)
{
Car car1 = new Car(); //使用建構子之1
car1.show();
Car car2 = new Car(1234,25.0); //使用建構子之2
car2.show();
}
}
PS:利用建構子的好處是可以直接輸入參數值,不須再呼叫 setData。
比較:
有建構子
public Car(int n, double g) { //初始建構子之2
num = n;
gas = g;
System.out.println("生產了車號為" + num + ",汽油量為" + gas + "的車子。");
}
//使用建構子之2
Car car2 = new Car(1234,25.0); //new 完就可直接輸入參數
car2.show();
無建構子 (搭配陣列)
int [] data;
void setData(int [] nums){
data = nums;
}
//使用 setData
int [] scores ={22,57,80,50,60}; (三行)
Compute c = new Compute();
c.setData(scores); //new 完需要呼叫方法 setData 來塞入陣列 scores
若要改成有建構子
Compute (int [] nums){
data = nums;
}
//使用建構子 Compute
int [] scores ={22,57,80,50,60}; (二行)
Compute c = new Compute(scores); //new 完 可直接塞入陣列 scores
//直接將陣列 score 放入( ),不須再 new Compute然後呼叫 setData後再放入score
5.第九章 類別變數、物件變數
1.類別變數: eg: static int i;
2.類別方法: eg: static int getMax(int [] score) {
int max = -1;
return max;
}
PS:static 靜態的、類別的、共用的、系統自動 new 的。
3.物件變數:在class 內所宣告的變數,前面沒有 static修飾子。
4.物件方法:在class 內所宣告的方法,前面沒有 static修飾子。
PS:生產物件需要用 new ;物件內的變數是獨自使用,不可給第2物件用。
PS:Google 所得到的資訊
1. 靜態方法沒辦法用實體方法、實體變數
2. 實體變數才能儲存每個物件個別的資料
3. 所以如果沒有要用到每個物件個別的資料,就可以寫成靜態方法 (例如做一個該類別的物件數量計數器)
6.第十章 類別庫的使用
1.字串 String (參考課本P.226)
補充1:split() 切割
使用方法:
補充2:StringBuffer VS String的字串連接
StringBuffer:
預設會先使用16個位子加上我們給的字串長度來規劃記憶體。再用Append的功能,
加上第二次給的字串,所以效能較高。
String的字串連接:
str1 = str1 + str2
會先將原本的str1從記憶體中取出,與str2 做字串相加,再放到另一區塊的記憶體。
因為要做記憶體的取出、存入,所以效能比StringBuffer低。
2.數學 Math (參考課本P.234) --> 大量使用 static,例如:Math.PI、Math.E
3.Wrapper Class:八個基本資料型態的對應類別 (int; float,...)(參考課本P.233)
7.第十章練習 (Homework)
題目:假設字串: String str ="Hello World Java"
請將每個單字取出,並顯示在螢幕上
例如:
Hello
World
Java
Hint:方法有很多
第一用split;
第二用 charAt(i)配合 for迴圈及 if;
第三用 indexof()配合 substring()
程式碼
import java.util.Scanner;
public class Ch81 {
public static void main(String[] args) {
System.out.println("請輸入字串"); //設計成可自行輸入字串,增加彈性。
Scanner scan= new Scanner(System.in);
String str = scan.nextLine();
// String str = "Hello World Java"; (老師給的字串,若要用這行就將前三行去掉)
System.out.println("原字串: "+str);
String [] segment = str.split(" ");
//利用split"" 將輸入的字串用""(空格)分開,此例有2個空格,所以分三段。3
//因此 segment陣列就包含3個字串,編號為 0、1、2。
//System.out.println(segment[0]); 直接指定陣列的編號,較不彈性。
//System.out.println(segment[1]);
//System.out.println(segment[2]);
if (segment.length != 0){ //利用迴圈來抓取陣列編號,完全自動化處理。
for (int i=0; i<segment.length; i++){
System.out.println(segment[i]);
}
}
}
}
結果
No comments:
Post a Comment