JAVA 2 Basic part 10

1.第十一章
多載 ( overloading ):同一類別內的同名異式。
覆寫 (overriding):父、子類別的同名異式。
  (多面性、polymorphism ):透過父類別的變數存取子類別的物件
  a.記誦口訣:藉由父類別的指標 (參考、變數),指向子類別的實體(物件)。
    e.g:Parent p = new child ( ) ;
  b.應用:可以此數指向子類別之同名方法(藉由覆寫),達到橫跨子物件之目的。
  c.應用實例:
         A. 父類別 Car vs. 二個子類別 RacingCar & Taxi
         B. 父類別 Shape vs. 四個子類別 Circle Triangle Rect Square
   ==> 可以達到橫跨子物件之程式呼叫功能,進而用來做加總、平均、等統計或其他應用。

toSring( ):將代表字串的物件作為傳回值並傳回呼叫端。
equals( ):驗證某兩物件是否相同,是就傳回 true,否就傳回 false。
getClass( ):傳回 "該物件究竟屬於哪一個類別"。


2.第十二章
抽象 (abstract):在 class 內的抽象方法就像是未做完的方法,必須等用到該類別的物件來建立方法,而且是強制一定要建立。
介面 (interface):在 interface 內的所有方法都是抽象方法,皆不可完成。以此規則來限制所以繼承此介面的類別,都一定要定義方法。可以在當物件很多時,以免漏掉。
要用 implement 來宣告介面例如:
 class car implement iVehicle

PS:
1. 多執行緒有二種, Thread、Runnable。
   Thread 是要用繼承,用 extends 來宣告。
   Runnable 是要用介面,用 implement 來宣告。
2. 一次只能繼承一個,若要多個要靠介面,但要注意介面是抽象類別。


3.第十六章
Applet:建議的瀏覽器嵌入小程式,可以畫圖。
圖片必須放在bin 資料夾內,與 class 同一層。
名言:Applet 會做成 class 檔案,然後要從 server 端下載 class 檔案到客戶端,所以若 class 檔案太大、頻寬不足或壅塞,會造成反應太慢,客戶不想等。所以漸漸被 Java Script 所取代。


4.重點整理
1.第十一章 (繼承+多形)
5.6.多形
7.toString( )
8.equals( )
9.getClass( )

2.第十二章 (抽象+介面)
1抽象類別   -->   輔助多形
2.instanceof 運算子  --> 判別多形之不同物件
3.介面  --> 輔助單一繼承之不足  --> 規範子類別
4.

3.第十五章
1.繼承 Thread  -->覆寫 run( )  --> 使用 start( )
2.啟動多個 Thread
3.4.使用sleep( )  -->可暫停
5.join
6.利用 Runnable 介面  -->可代替 Thread
7. 同步 Synchronized 可以控制多執行緒在存取同一資料時,可以分開存取,使得被存取的資料可以維持同步。

4.第十六章
1.繼承 Applet  -->覆寫 paint( )  -->可嵌入 HTML內
1.2.可畫線、字、圖
3.可畫 image 圖片
4.5.6.人機介面 mouse
7.動畫 + sleep( ) + repaint( )


PS:自行註解
說明畫圓程式碼的意思:內含建構子、繼承、陣列等觀念
程式碼

class Shape {
//宣告 Shape 類別 (園區S設計圖),沒有用修飾子,代表修子是 default。
double [] edgeOrRadius;
//宣告一個 double陣列(園區設備的設計圖),名稱為 edgeOrRadius
Shape(double... edges) {
//宣告一個 Shape建構子(沒有用public)(工廠1的設計圖),參數為未知固定數量的 double 值,名稱為 edges
// 陣列初始化
edgeOrRadius = new double[edges.length];
for(int i = 0; i< edges.length; i++)
edgeOrRadius[i] = edges[i];
}
double getArea() { return -1; }  //(工廠2的設計圖)
double getCircumference() { return -1; }   //(工廠3的設計圖)
}

class Circle extends Shape {    //圓形,宣告一個 Circle 類別 (園區C設計圖),並繼承  Shape。
Circle(double r) {  
/*
宣告一個 Circle 建構子 (Circle工廠 ),參數為 double 的值,名稱為 r,可以給後面的 main 方法來用。所以 main 會傳給這裡的 r 一個值。
*/
super(r);
/*
這裡使用 super 就是指要宣告一個 Shape 父類別,將上一行的 r 所拿到的值放進來,然後再傳到 Shape 父類別 Shape(double... edges),這裡就可以看出為何Shape(double... edges)要設定未知固定數量的 double 值,因為後面還有三角形、矩形等等,每個參數數量皆不同
*/
}
double getArea() {
return Math.PI * edgeOrRadius[0] * edgeOrRadius[0];
}
double getCircumference() {
return 2 * Math.PI * edgeOrRadius[0];
}
}

class Triangle extends Shape {   // 三角形
Triangle(double a, double b, double c) {
super(a, b, c);
}
double getArea() {
double s = getCircumference() / 2;
// 海龍公式
return Math.sqrt( s*(s-edgeOrRadius[0])*(s-edgeOrRadius[1])*(s-edgeOrRadius[2]));
}
double getCircumference() {
double s = 0;
for(double edge : edgeOrRadius) {
s += edge;
}
return s;
}
}

class Rect extends Shape {  // 矩形
Rect(double w, double h) {
super(w, h, w, h);
}
double getArea() {
return edgeOrRadius[0] * edgeOrRadius[1];
}
double getCircumference() {
double result = 0;
for(int i=0; i< edgeOrRadius.length; i++)
result += edgeOrRadius[i];
return result;
}
}

class Square extends Rect {   // 正方形
Square(double edge) {
super(edge, edge);
}
}

public class TestShapeInheritance {
public static void main(String[] args) {    // main 在這裡
Shape [] shape = new Shape[4];     
//宣告一個Shape 陣列 取名叫 shape (將 Shape園區1設計圖拿來,用 new 指令來蓋 4 個。)
shape[0] = new Circle(10);
// shape [0] 園區用來蓋 Circle工廠 
shape[1] = new Triangle(3, 4, 5);

shape[2] = new Rect(30, 40);

shape[3] = new Square(50);

double total = 0;
for(int i=0; i<shape.length; i++) {
System.out.println("shape[" + i + "]的面積 = " + shape[i].getArea());
total += shape[i].getArea();

System.out.println("shape[" + i + "]的周長 = " + shape[i].getCircumference());
}
System.out.println("total area = "+total);


No comments: