package tw.tinachang.myfirstproject.oop.abstraction;
abstract class Company{
//抽象類別不可new,裡面可以有abstract方法也可以有一般的
//可以有建構子
public abstract void calFuel();
public abstract void calDistance();
//底下的人一定要有上面這兩個方法(同名同型)
//定義非做不可的功能
//是一種框架,就像公司規定一定要穿褲子,但底下各部門可以自己決定哪種花色、長短的褲子
}
class Truck extends Company{//繼承了Company,所以一定得有calFuel()跟calDistance()
public void calFuel(){
System.out.println("Truck cF");
}
public void calDistance(){
System.out.println("Truck cD");
}
public void fly(){
System.out.println("fly");
}
}
class Ship extends Company{
//定義好抽象類別後,子類別必須繼承的方法可以用電腦工具生成
@Override
public void calFuel() {
System.out.println("Ship cF");
}
@Override//這個適用已請電腦確定我有Override,而非多載
public void calDistance() {
System.out.println("Ship cD");
}
public void stop(){
System.out.println("Ship stop");
}
}
public class CallTestAbstractEx1 {
public static void main(String[] args) {
Ship cargoChip = new Ship();
cargoChip.calDistance();
cargoChip.calFuel();
Truck myTruck = new Truck();
myTruck.calDistance();
myTruck.calFuel();
System.out.println("------------");
Company myCompany;
//分兩段宣告就可以在孩子間跳來跳去
myCompany = new Truck();
//多型:透過父親物件代表兒子物件
//等號右邊生成一個新的卡車物件,等號左邊給了這個卡車名字(myCompany),告訴電腦他是一個Company的物件
myCompany.calFuel();
myCompany.calDistance();
//只要父親有定義,兒子有覆載,則可以用兒子的執行
//但是只能執行父親有定義的
((Truck)myCompany).fly();
//要用兒子的獨有方式得強制轉型,不然直接myCompany.fly();會出錯
//((Ship)myCompany).stop();//語法沒錯,但執行會出錯,因為他實際上是卡車實體,沒法使用船的方法
myCompany = new Ship();
myCompany.calFuel();
myCompany.calDistance();
}
}
Ship cD
Ship cF
Truck cD
Truck cF
------------
Truck cF
Truck cD
fly
Ship cF
Ship cD
package tw.xxx.xxx.copy.oop.others;
abstract class Dad{//不可new
abstract public void run();
abstract public void stop();
}
class Son extends Dad{
@Override
public void run() {
System.out.println("兒子跑");
}
@Override
public void stop() {
System.out.println("兒子停");
}
public void walk(){
System.out.println("兒子自己的方法:走路");
}
}
class Daughter extends Dad{
@Override
public void run() {
System.out.println("女兒跑");
}
@Override
public void stop() {
System.out.println("女兒停");
}
public void cry(){
System.out.println("女兒獨有的技能:哭");
}
}
public class CallTestAbstractEx1 {
public static void main(String[] args) {
Son son = new Son();
son.run();
son.stop();
son.walk();
Dad dad = new Son();
dad.run();
dad.stop();
//dad.walk();不行
((Son) dad).walk();//強制轉型才能用walk
((Daughter) dad).cry();//可以寫,但執行會出錯,因為實體(兒子)沒有這個技能
}
}
兒子跑
兒子停
兒子自己的方法:走路
兒子跑
兒子停
兒子自己的方法:走路
Exception in thread "main" java.lang.ClassCastException: tw.xxx.xxx.copy.oop.others.Son cannot be cast to tw.xxx.xxx.copy.oop.others.Daughter
at tw.xxx.xxx.copy.oop.others.CallTestAbstractEx1.main(CallTestAbstractEx1.java:53)
↑兒子不會女兒的方法