// 在繼承關係中,子類別自行實作,
// 一個方法來取代父類別的程式執行時,
// 會執行子類別的而不會執行父類別。
// ※
// ① 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();
}
}
沒有留言:
張貼留言