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)

↑兒子不會女兒的方法

arrow
arrow
    全站熱搜

    乙方 發表在 痞客邦 留言(0) 人氣()