// test0816_1.java
// 以父類別變數存取子類別物件成員
class Circle{
protected double radius;
Circle(double radius){
this.radius = radius;
}
void show(){
System.out.println("area = " + radius*radius);
}
}
class App extends Circle{
private int value;
App(double r, int v){
super(r);
value = v;
}
void show(){
super.show(); //想印出 Circle.show() 要使用 super
System.out.println("radius = " + radius + ", value = " + value);
}
}
public class test0816_1{
public static void main(String args[]){
Circle a = new App(0.2,3);
a.show(); //發生 override,只會印 App.show()
}
}
/*---------------------------------------------------------------------------------------------*/
//Demo.java
// 繼承、多型、轉型練習
class Father{
String name = "Father";
String getName(){
return name;
}
String greeting(){
return "Class Father";
}
}
class Son extends Father{
String name = "Son";
String greeting(){
return "Class Son";
}
void foo(){
System.out.println(name); //Son
System.out.println(this.name); //Son
System.out.println(super.name); //Father
System.out.println(((Son)this).name); //Son
System.out.println(((Father)this).name); //Father
System.out.println(((Son)this).greeting()); //Class Son
System.out.println(((Father)this).greeting()); //Class Son
System.out.println(super.greeting()); //Class Father
}
}
public class Demo{
public static void main(String args[]){
new Son().foo();
}
}
/*---------------------------------------------------------------------------------------------*/
// RJG.java(Role.java, Magician.java, Swordman.java)
public class RPG{
public static void showBlood(Swordman swordman){
System.out.printf("%s 血量 %d %n", swordman.getName(), swordman.getBlood());
}
public static void showBlood(Magician magician){
System.out.printf("%s 血量 %d %n", magician.getName(), magician.getBlood());
}
public static void main(String args[]){
Swordman swordMan = new Swordman();
swordMan.setName("Justin");
swordMan.setLevel(1);
swordMan.setBlood(200);
//System.out.println(swordMan.toString());
System.out.printf("劍士:(%s %d %d)%n", swordMan.getName(), swordMan.getLevel(), swordMan.getBlood());
Magician magician = new Magician();
magician.setName("Monica");
magician.setLevel(1);
magician.setBlood(100);
//System.out.println(magician.toString());
System.out.printf("魔法師:(%s %d %d)%n", magician.getName(),magician.getLevel(), magician.getBlood());
showBlood(swordMan);
showBlood(magician);
}
}
// Role.java
public class Role{
protected String name;
protected int level;
protected int blood;
//name
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//level
public void setLevel(int level){
this.level = level;
}
public int getLevel(){
return level;
}
//blood
public void setBlood(int blood){
this.blood = blood;
}
public int getBlood(){
return blood;
}
public String toString(){
return String.format("(%s, %d, %d)%n", this.name, this.level, this.blood);
}
public void fight(){}
// public static void showBlood(Role role){
// System.out.printf("%s 血量 %d %n", role.getName(), role.getBlood());
// }
}
//Magician.java
class Magician extends Role{
public void fight(){
System.out.println("魔法攻擊");
}
public void cure(){
System.out.println("魔法治療");
}
// public void showBlood(){
// System.out.printf("%s 血量 %d %n", getName(), getBlood());
// }
}
//Swordman.java
class Swordman extends Role{
public void fight(){
System.out.println("揮劍攻擊");
}
// public void showBlood(){
// System.out.printf("%s 血量 %d %n", getName(), getBlood());
// }
}
/*---------------------------------------------------------------------------------------------*/
.is-a
是一個,是一種上下的關係,利用 extends 來實作延伸類別。
.has-a
有一個,是一種聚合的關係,表示類別的成員變數。
class machine{
}
// is-a 電腦類別繼承電子機械產品類別
class computer extends machine{
CPU theCpu;
RAM theRam;
HD TheHd;
}
/*---------------------------------------------------------------------------------------------*/
.interface 介面
介面也是類別的一種,它是用戶端的程式碼,與類別之間的溝通管道,
利用相同的介面可讓程式有一定的規範可循,介面類別完成後就不允許更改。
(主要做用為解決 extends 單一繼承問題)
.宣告
存取權限 interface 介面名稱[]
存取權限 interface 介面名稱 extends //可以讓範圍更大
※
介面的屬性宣告時一定要給定初始值。
compile 值,屬性會自動加上 public static final,
方法會自動加上 public abstract。
利用 implements 關鍵字來實作 interface。
interface 的方法皆為實作區塊,所以當 implements 時,都一定要將其方法加以實作。
class 類別名稱 implements 介面名稱
/*---------------------------------------------------------------------------------------------*/
.final 修飾字
類別加上 final 不可以被繼承。
方法加上 final 不可以被 override。
屬性加上 final 不可以放更改。
/*---------------------------------------------------------------------------------------------*/
// 練習 interface 及 implements
interface Pet{
String name="cute";
void move();
void skill();
}
public class Dog implements Pet{
// 存取權限一定要大於 interface
public void move(){
System.out.println("移動");
}
public void skill(){
System.out.println("跑跳");
}
public static void main(String args[]){
Dog d = new Dog();
d.skill();
d.move();
}
}
/*---------------------------------------------------------------------------------------------*/
.練習 implement 及 extends ,建立檔案:
//1. Swimmer.java
interface Swimmer{
void swim();
}
//2. Flyer.java
interface Flyer{
void fly();
}
//3. Driver.java
interface Driver extends Swimmer{
void drive();
}
//4. Fish.java
public class Fish implements Swimmer{
protected String name;
public Fish(String name){
this.name = name;
}
public String getName(){
return name;
}
public void swim(){}
}
//5. Airplane.java
public class Airplane implements Flyer{
protected String name;
Airplane(String name){
this.name = name;
}
public void fly(){
System.out.printf("飛機 %s 在飛%n", name);
}
}
//6. Boat.java
public class Boat implements Swimmer{
protected String name;
Boat(String name){
this.name = name;
}
public void swim(){
System.out.printf("%s 小船在水面航行%n", name);
}
}
//7. Human.java
public class Human{
protected String name;
public Human(String name){
this.name = name;
}
public String getName(){
return name;
}
public void swim(){}
}
//8. Helicopter.java
public class Helicopter extends Airplane{
Helicopter(String name){
super(name);
}
public void fly(){
System.out.printf("直升機 %s 在飛%n", name);
}
}
//9. SeaPlan.java
public class SeaPlan extends Airplane implements Swimmer{
SeaPlan(String name){
super(name);
}
public void fly(){
System.out.printf("海上飛機 %s 空中飛行%n", name);
}
public void swim(){
System.out.printf("海上飛機 %s 水面划行%n", name);
}
}
//10. Shark.java
public class Shark extends Fish{
Shark(String name){
super(name);
}
public void swim(){
System.out.printf("鯊魚 %s 游泳 %n", name);
}
}
//11. Anemonefish.java
public class Anemonefish extends Fish{
Anemonefish(String name){
super(name);
}
public void swim(){
System.out.printf("小丑魚 %s 游泳 %n", name);
}
}
//12. Piranha.java
public class Piranha extends Fish{
Piranha(String name){
super(name);
}
public void swim(){
System.out.printf("食人魚 %s 游泳 %n", name);
}
}
//13. FlyingFish.java
public class FlyingFish extends Fish implements Flyer{
FlyingFish(String name){
super(name);
}
public void swim(){
System.out.printf("飛魚 %s 游泳%n", name);
}
public void fly(){
System.out.printf("飛魚 %s 會飛%n",name);
}
}
//14. SwimPlayer.java
public class SwimPlayer extends Human implements Swimmer{
SwimPlayer(String name){
super(name);
}
public void swim(){
System.out.printf("潛水夫 %s 在游泳%n", name);
}
}
//15. DemoOcean.java //主程式
public class DemoOcean{
public static void doSwim(Swimmer swimmer){
swimmer.swim();
}
public static void doFly(Flyer flyer){
flyer.fly();
}
public static void doDriver(Driver driver){
driver.drive();
}
public static void main(String args[]){
SeaPlan s = new SeaPlan("S");
FlyingFish f = new FlyingFish("f");
//Swimmer
doSwim(new Anemonefish("anemonefish"));
doSwim(new Shark("shark"));
doSwim(new Piranha("piranha"));
doSwim(new SwimPlayer("swimmer"));
doSwim(s);
doSwim(f);
//Flyer
doFly(new Helicopter("helicopter"));
doFly(s);
doFly(f);
}
}
/*---------------------------------------------------------------------------------------------*/
// 練習 interface method()
// Service.java
interface Other{
void execute();
void doOther();
}
interface Some{
void execute();
void doSome();
}
public class Service implements Some,Other{
public void execute(){
System.out.println("execute");
}
public void doSome(){
System.out.println("doSome");
}
public void doOther(){
System.out.println("doOther");
}
public static void main(String args[]){
Service d = new Service();
d.execute();
d.doSome();
d.doOther();
}
}
// 以父類別變數存取子類別物件成員
class Circle{
protected double radius;
Circle(double radius){
this.radius = radius;
}
void show(){
System.out.println("area = " + radius*radius);
}
}
class App extends Circle{
private int value;
App(double r, int v){
super(r);
value = v;
}
void show(){
super.show(); //想印出 Circle.show() 要使用 super
System.out.println("radius = " + radius + ", value = " + value);
}
}
public class test0816_1{
public static void main(String args[]){
Circle a = new App(0.2,3);
a.show(); //發生 override,只會印 App.show()
}
}
/*---------------------------------------------------------------------------------------------*/
//Demo.java
// 繼承、多型、轉型練習
class Father{
String name = "Father";
String getName(){
return name;
}
String greeting(){
return "Class Father";
}
}
class Son extends Father{
String name = "Son";
String greeting(){
return "Class Son";
}
void foo(){
System.out.println(name); //Son
System.out.println(this.name); //Son
System.out.println(super.name); //Father
System.out.println(((Son)this).name); //Son
System.out.println(((Father)this).name); //Father
System.out.println(((Son)this).greeting()); //Class Son
System.out.println(((Father)this).greeting()); //Class Son
System.out.println(super.greeting()); //Class Father
}
}
public class Demo{
public static void main(String args[]){
new Son().foo();
}
}
/*---------------------------------------------------------------------------------------------*/
// RJG.java(Role.java, Magician.java, Swordman.java)
public class RPG{
public static void showBlood(Swordman swordman){
System.out.printf("%s 血量 %d %n", swordman.getName(), swordman.getBlood());
}
public static void showBlood(Magician magician){
System.out.printf("%s 血量 %d %n", magician.getName(), magician.getBlood());
}
public static void main(String args[]){
Swordman swordMan = new Swordman();
swordMan.setName("Justin");
swordMan.setLevel(1);
swordMan.setBlood(200);
//System.out.println(swordMan.toString());
System.out.printf("劍士:(%s %d %d)%n", swordMan.getName(), swordMan.getLevel(), swordMan.getBlood());
Magician magician = new Magician();
magician.setName("Monica");
magician.setLevel(1);
magician.setBlood(100);
//System.out.println(magician.toString());
System.out.printf("魔法師:(%s %d %d)%n", magician.getName(),magician.getLevel(), magician.getBlood());
showBlood(swordMan);
showBlood(magician);
}
}
// Role.java
public class Role{
protected String name;
protected int level;
protected int blood;
//name
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//level
public void setLevel(int level){
this.level = level;
}
public int getLevel(){
return level;
}
//blood
public void setBlood(int blood){
this.blood = blood;
}
public int getBlood(){
return blood;
}
public String toString(){
return String.format("(%s, %d, %d)%n", this.name, this.level, this.blood);
}
public void fight(){}
// public static void showBlood(Role role){
// System.out.printf("%s 血量 %d %n", role.getName(), role.getBlood());
// }
}
//Magician.java
class Magician extends Role{
public void fight(){
System.out.println("魔法攻擊");
}
public void cure(){
System.out.println("魔法治療");
}
// public void showBlood(){
// System.out.printf("%s 血量 %d %n", getName(), getBlood());
// }
}
//Swordman.java
class Swordman extends Role{
public void fight(){
System.out.println("揮劍攻擊");
}
// public void showBlood(){
// System.out.printf("%s 血量 %d %n", getName(), getBlood());
// }
}
/*---------------------------------------------------------------------------------------------*/
.is-a
是一個,是一種上下的關係,利用 extends 來實作延伸類別。
.has-a
有一個,是一種聚合的關係,表示類別的成員變數。
class machine{
}
// is-a 電腦類別繼承電子機械產品類別
class computer extends machine{
CPU theCpu;
RAM theRam;
HD TheHd;
}
/*---------------------------------------------------------------------------------------------*/
.interface 介面
介面也是類別的一種,它是用戶端的程式碼,與類別之間的溝通管道,
利用相同的介面可讓程式有一定的規範可循,介面類別完成後就不允許更改。
(主要做用為解決 extends 單一繼承問題)
.宣告
存取權限 interface 介面名稱[]
存取權限 interface 介面名稱 extends //可以讓範圍更大
※
介面的屬性宣告時一定要給定初始值。
compile 值,屬性會自動加上 public static final,
方法會自動加上 public abstract。
利用 implements 關鍵字來實作 interface。
interface 的方法皆為實作區塊,所以當 implements 時,都一定要將其方法加以實作。
class 類別名稱 implements 介面名稱
/*---------------------------------------------------------------------------------------------*/
.final 修飾字
類別加上 final 不可以被繼承。
方法加上 final 不可以被 override。
屬性加上 final 不可以放更改。
/*---------------------------------------------------------------------------------------------*/
// 練習 interface 及 implements
interface Pet{
String name="cute";
void move();
void skill();
}
public class Dog implements Pet{
// 存取權限一定要大於 interface
public void move(){
System.out.println("移動");
}
public void skill(){
System.out.println("跑跳");
}
public static void main(String args[]){
Dog d = new Dog();
d.skill();
d.move();
}
}
/*---------------------------------------------------------------------------------------------*/
.練習 implement 及 extends ,建立檔案:
- Swimmer.java //interface
- Flyer.java //interface
- Driver.java //interface
- Fish.java //父類別 實作 Swimmer
- Airplane.java //父類別 實作 Flyer
- Boat.java //父類別 實作 Swimmer
- Human.java //父類別
- Helicopter.java //繼承 Airplane
- SeaPlan.java //繼承 Airplane 實作 Swimmer
- Shark.java //繼承 Fish
- Anemonefish.java //繼承 Fish
- Piranha.java //繼承 Fish
- FlyingFish.java //繼承 Fish 實作 Flyer
- SwimPlayer.java //繼承 Human 實作 Swimmer
- DemoOcean.java //主程式
//1. Swimmer.java
interface Swimmer{
void swim();
}
//2. Flyer.java
interface Flyer{
void fly();
}
//3. Driver.java
interface Driver extends Swimmer{
void drive();
}
//4. Fish.java
public class Fish implements Swimmer{
protected String name;
public Fish(String name){
this.name = name;
}
public String getName(){
return name;
}
public void swim(){}
}
//5. Airplane.java
public class Airplane implements Flyer{
protected String name;
Airplane(String name){
this.name = name;
}
public void fly(){
System.out.printf("飛機 %s 在飛%n", name);
}
}
//6. Boat.java
public class Boat implements Swimmer{
protected String name;
Boat(String name){
this.name = name;
}
public void swim(){
System.out.printf("%s 小船在水面航行%n", name);
}
}
//7. Human.java
public class Human{
protected String name;
public Human(String name){
this.name = name;
}
public String getName(){
return name;
}
public void swim(){}
}
//8. Helicopter.java
public class Helicopter extends Airplane{
Helicopter(String name){
super(name);
}
public void fly(){
System.out.printf("直升機 %s 在飛%n", name);
}
}
//9. SeaPlan.java
public class SeaPlan extends Airplane implements Swimmer{
SeaPlan(String name){
super(name);
}
public void fly(){
System.out.printf("海上飛機 %s 空中飛行%n", name);
}
public void swim(){
System.out.printf("海上飛機 %s 水面划行%n", name);
}
}
//10. Shark.java
public class Shark extends Fish{
Shark(String name){
super(name);
}
public void swim(){
System.out.printf("鯊魚 %s 游泳 %n", name);
}
}
//11. Anemonefish.java
public class Anemonefish extends Fish{
Anemonefish(String name){
super(name);
}
public void swim(){
System.out.printf("小丑魚 %s 游泳 %n", name);
}
}
//12. Piranha.java
public class Piranha extends Fish{
Piranha(String name){
super(name);
}
public void swim(){
System.out.printf("食人魚 %s 游泳 %n", name);
}
}
//13. FlyingFish.java
public class FlyingFish extends Fish implements Flyer{
FlyingFish(String name){
super(name);
}
public void swim(){
System.out.printf("飛魚 %s 游泳%n", name);
}
public void fly(){
System.out.printf("飛魚 %s 會飛%n",name);
}
}
//14. SwimPlayer.java
public class SwimPlayer extends Human implements Swimmer{
SwimPlayer(String name){
super(name);
}
public void swim(){
System.out.printf("潛水夫 %s 在游泳%n", name);
}
}
//15. DemoOcean.java //主程式
public class DemoOcean{
public static void doSwim(Swimmer swimmer){
swimmer.swim();
}
public static void doFly(Flyer flyer){
flyer.fly();
}
public static void doDriver(Driver driver){
driver.drive();
}
public static void main(String args[]){
SeaPlan s = new SeaPlan("S");
FlyingFish f = new FlyingFish("f");
//Swimmer
doSwim(new Anemonefish("anemonefish"));
doSwim(new Shark("shark"));
doSwim(new Piranha("piranha"));
doSwim(new SwimPlayer("swimmer"));
doSwim(s);
doSwim(f);
//Flyer
doFly(new Helicopter("helicopter"));
doFly(s);
doFly(f);
}
}
/*---------------------------------------------------------------------------------------------*/
// 練習 interface method()
// Service.java
interface Other{
void execute();
void doOther();
}
interface Some{
void execute();
void doSome();
}
public class Service implements Some,Other{
public void execute(){
System.out.println("execute");
}
public void doSome(){
System.out.println("doSome");
}
public void doOther(){
System.out.println("doOther");
}
public static void main(String args[]){
Service d = new Service();
d.execute();
d.doSome();
d.doOther();
}
}
沒有留言:
張貼留言