JAVA 2 Basic part 6

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)
   補充1split() 切割
   使用方法:

   補充2StringBuffer 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: