2015年8月2日 星期日

JAVA SL-110_08/02

// Override 覆寫:
// 在繼承關係中,子類別自行實作,
// 一個方法來取代父類別的程式執行時,
// 會執行子類別的而不會執行父類別。

// ※
// ① override 是發生在 extends 關係中。
// ② override 方法的名稱必須相同。
// ③ 若方法有回傳值,其型態必須是原方法的型態或其型態的子類別。
// ④ 參數列不管是(型態、數量、順序)皆需相同。
// ⑤ 在取權限不可小於原方法。
//-------------------------------------------------------------------------------------------------------
// Override 覆寫練習1,印出:
/*
兒子的事業:電腦網路
市值: $100
-----------------------------
父親的事業:房地產
市值: $80000000
*/

class Father{
        public int money = 80000000;
        public void undertaking(){
                System.out.println("父親的事業:房地產");
        }
}

class Son extends Father{
        public int money;
        Son (int money){
                this.money = money;
        }
        public void undertaking(){
                System.out.println("兒子的事業:電腦網路");
        }
        public void go(){
                undertaking();
                System.out.println("市值: $" + money);
                System.out.println("-----------------------------");
                super.undertaking();
                System.out.println("市值: $" + super.money);
        }
}
public class Extends_0802_1{
        public static void main(String args[]){
        new Son(100).go();
        }
}
//-------------------------------------------------------------------------------------------------------
// Override 覆寫練習2,印出:
/*
call Father
call Son
*/
class Father{
        void aMethod(){
        System.out.println("call Father");
        }
}

class Son extends Father{
        public Son(){
                super.aMethod();
        }
        public void aMethod(){
                System.out.println("call Son");
        }

}
public class Extends_0802_2{
        public static void main(String args[]){
        Son s = new Son();
        s.aMethod();
        }
}
//-------------------------------------------------------------------------------------------------------
// IOException 練習

import java.io.*;

class Father{
        void aMethod()throws IOException{
        }
}

public class Son_0802_3 extends Father{
        public static void main(String args[]){
        Son_0802_3 s = new Son_0802_3();
                try{
                        s.aMethod();
                }catch(IOException e){
                        System.out.println("s.aMethod() not found.");
                }
        }
        void aMethod()throws IOException{
                System.out.println("call Son");
        }
}
//-------------------------------------------------------------------------------------------------------
// 寫成一個 .bat 執行檔

// IoDemo.java
public class IoDemo{
        public static void main(String args[]){
        System.out.println("----------");
        System.out.println("|     程式設計     |");
        System.out.println("|  Java程式設計組  |");
        System.out.println("|                  |");
        System.out.println("|                  |");
        System.out.println("| 主持人:聯成電腦 |");
        System.out.println("|    聯 成 電 腦   |");
        System.out.println("----------");
        }
}

// IoDemo.bat
SET PATH=%PATH%
javac -encoding utf-8 IoDemo.java
java IoDemo
pause
//-------------------------------------------------------------------------------------------------------
// Overloading 超載
// 同一種方法可以產生不同的實作,
// 例如:同一個方法名稱依傳入的參數不同,而實作出相異的程式碼

method
void aMethod(){}
void aMethod(int a){}
void aMethod(String s, int a){}
void aMethod(int a, String s){}
//-------------------------------------------------------------------------------------------------------
// 練習 Override and Overloading
class Animal{
        void aMethod(){}
}


class Dog extends Animal{
                String aMethod(String a){return a;} //overloading
                void aMethod(int a){} //overloading
                void aMethod(){} //override
/*方法 overloading 除了在參數列不一樣下,其回傳型態也可以不一樣
}
public class Dog_1{
        public static void main(String args[]){
        Dog d = new Dog();
        d.aMethod("String");
        d.aMethod(10);
        d.aMethod();
        }
}


//-------------------------------------------------------------------------------------------------------
// vararg 建構變長參數
// 語法
// 存取權限 傳回值 方法名稱(型態…變數名稱)

public void aMethod(int...c){}
//-------------------------------------------------------------------------------------------------------
// 例題,輸出: 13

public class AddInt{
 public static void main(String args[]){
        AddInt ai = new AddInt();
        int a = ai.newCalc(1,2);
        int b = ai.newCalc(1,2,3,4);
        int c = ai.newCalc(a,b);
        System.out.println(c);
 }
 public int newCalc(int...c){ // c 會類似陣列,故可以用 for-each 印出
        int sum = 0;
        for(int i:c){
                sum += i;
        }
        return sum;
 }
}
//-------------------------------------------------------------------------------------------------------
// 例題,輸出:int 版本被呼叫
// java 機制,遇到整數優先找 int ,故 integer 不會印出來。
// 若要印出 integer,只能將 int 註解掉。

class Some{
        void someMethod(int i){
                System.out.println("int 版本被呼叫");
        }
        void someMethod(Integer integer){ // Integer 為物件化
                System.out.println("Integer 版本被呼叫");
        }
}
public class overloadBoxing{
        public static void main(String args[]){
                Some s = new Some();
                s.someMethod(1);
        }
}
//-------------------------------------------------------------------------------------------------------
//※ 封裝
/*
物件狀態的隱藏過程,也就是透過統一的方法或介面實作,
來取得類別中那些不被外部直接存取的內部資料,
以維護物件資源的完整性與安全性。
*/
// get
// set
// 建構子
//-------------------------------------------------------------------------------------------------------
// 例題: get, set

public class EncDemo{
        public static void main(String args[]){
        MyAccount account = new MyAccount();
        account.setMoney(1000000);
        System.out.println("$" + account.getMoney());
        }
}

class MyAccount{
        private int money;
        public void setMoney(int money){
                this.money = money;
                // this.money 是指 MyAccount 的 money
                // money 是指 setMoney(int money) 的 money
        }
        public int getMoney(){
                return money;
        }
}
//-------------------------------------------------------------------------------------------------------
// 封裝流程練習
// 練習分兩個 .java 寫:CashCard.java、CardApp.java
// 點數卡儲值且每大於一仟就給紅利 1 點。

// CashCard.java
class CashCard{
        private String number;
        private int balance;
        private int bonus;
        CashCard(String number, int balance, int bonus){
                this.number = number;
                this.balance = balance;
                this.bonus = bonus;
        }
        void store(int money){
                if(money > 0){
                        this.balance += money;
                        if(money >= 1000){
                                this.bonus+=(money/1000);
                        }
                }
                else
                        System.out.println("儲值是負的,來亂的嗎");
        }
        String getNumber(){
                return number;
        }
        int getBalance(){
                return balance;
        }
        int getBonus(){
                return bonus;
        }
}
//----------------------------------
// CardApp.java
import java.util.*;
public class CardApp{
        public static void main(String args[]){
                CashCard[] cards = {
                        new CashCard("A001", 500, 0),
                        new CashCard("A002", 300, 0),
                        new CashCard("A003", 1000, 1)};

                Scanner scanner = new Scanner(System.in);

                for(CashCard card:cards){
                        System.out.printf("為(%s, %d, %d)儲值:",card.getNumber(), card.getBalance(), card.getBonus());
                        card.store(scanner.nextInt());
                        System.out.printf("明細(%s, %d, %d)%n", card.getNumber(), card.getBalance(), card.getBonus());
                        System.out.println("------------------------------");
                }
        }
}
//-------------------------------------------------------------------------------------------------------
// ※多型
/*
開發出可擴充的程式,在程式撰寫上更有彈性,也就是說泛指在繼承關係下,單一實體卻可以有多種型別。
*/

父類別 = 子類別實體

Animal a = new Cat();
//-------------------------------------------------------------------------------------------------------



// 練習上方架構設計:
class Animal{
        void move(){
                System.out.println("移動");
        }
}

class Cat extends Animal{
        void skill(){
                System.out.println("抓老鼠");
        }
        void move(){
                System.out.println("跑跳");
        }
}

class Tiger extends Cat{
        void skill(){
                System.out.println("獅王");
        }
}

public class Demo_0802_1{
        public static void main(String args[]){
                Animal a = new  Cat();
                //a.skill();
                ((Cat)a).skill();
                a.move();

                Cat c = new Tiger();
                c.skill();
                c.move();

                Animal a1 = new Tiger();
                //a1.skill();
                ((Tiger)a1).skill();
                a1.move();
}
}

沒有留言:

張貼留言