程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 抽象方法 繼承-初學Java 有個地方看不懂

抽象方法 繼承-初學Java 有個地方看不懂

編輯:編程綜合問答
初學Java 有個地方看不懂

/*

  • 汽車類
    /
    public abstract class MotoVehicle {
    /

    • 將成員變量封裝隱藏起來,private 權限只在類內顯示 / private String no;//車牌號 private String brand;//品牌 private int perRend;//日租金 public abstract float calRent(int days);//抽象方法 用來計算租金 public abstract void leaseoutFlow();//租車流程 /
    • 使用set get方法實現對成員變量的存取,因為成員變量是private修飾的,只能在類內顯示 */ public String getNo() { return no; } public void setNo(String no) { this.no = no; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getPerRend() { return perRend; } public void setPerRend(int perRend) { this.perRend = perRend; } public MotoVehicle(){

    }
    public MotoVehicle(String no,String brand,int perRend){
    this.no=no;
    this.brand=brand;
    this.perRend=perRend;
    }
    }
    /*

  • 客車類
    */
    public class Bus extends MotoVehicle{
    private int seatCount;//座位數

    public int getSeatCount() {
    return seatCount;
    }

    public void setSeatCount(int seatCount) {
    this.seatCount = seatCount;
    }
    public Bus(){

    }
    public Bus(String no,String brand,int perRent,int seatCount){
    super(no,brand,perRent);//調用父類的構造函數
    this.seatCount=seatCount;
    }
    /*

    • 重寫父類 calRent方法 / public float calRent(int days){ return this.getPerRend()*days; } /
    • 重寫leaseoutFlow / public void leaseoutFlow(){ this.setPerRend(800); this.setNo("京80008000"); } } /
  • 橋車類
    */
    public class Car extends MotoVehicle{
    private String type;//型號

    public String getType() {
    return type;
    }

    public void setType(String type) {
    this.type = type;
    }
    public Car(){

    }

    public Car(String no,String brand,int perRent,String type){
    super(no,brand,perRent);//調用父類的構造函數
    this.type=type;
    }
    /*

    • 重寫父類 calRent方法 */ public float calRent(int days){ return this.getPerRend()*days; }

    /*

    • 重寫leaseoutFlow / public void leaseoutFlow(){ this.setPerRend(600); this.setNo("京60006000"); } } /
  • 汽車業務類
    /
    public class Motooperation {
    public MotoVehicle MotoleaseOut(String MotoType){
    MotoVehicle moto=null;;
    if(MotoType.equals("橋車")){
    moto=new Car();//多態轉型 類型提升 向上轉型 把子類提升為父類
    moto.leaseoutFlow();

    }else if(MotoType.equals("客車")){
    moto=new Bus();//多態轉型 類型提升 向上轉型 把子類提升為父類
    moto.leaseoutFlow();
    }
    return moto;
    }
    }
    /

  • 汽車租賃管理類
    */
    import java.util.Scanner;
    public class RentMgrSys {
    public static void main(String[] args){
    Scanner input=new Scanner(System.in);
    Motooperation motoMrs=new Motooperation();
    MotoVehicle moto=null;
    System.out.println("歡迎來到汽車租賃公司!");
    System.out.print("請輸入要租賃的汽車類型: ");
    System.out.print("1.橋車 2.客車");
    int choose=input.nextInt();//汽車類型
    String MotoType=null;
    if(choose==1){
    MotoType="橋車";
    }else if(choose==2){
    MotoType="客車";
    }
    moto=motoMrs.MotoleaseOut(MotoType);//獲取租賃的汽車類型
    System.out.print("請輸入要租賃的天數");
    int days=input.nextInt();
    float money=moto.calRent(days);//租賃費用
    System.out.println("分配給你的汽車牌號是:"+moto.getNo());
    System.out.println("你需要支付的費用:"+money+"元");
    input.close();
    }
    }
    這句看不懂 float money=moto.calRent(days); moto是父類Motooperation的對象為什麼調用的是子類的calRent()方法

最佳回答:


moto是MotoVehicle類型的變量啊,motoMrs.MotoleaseOut(MotoType)得到的是MotoVehicle類的子類的對象。變量是在棧內存中的,對象是在堆內存中的。
moto變量能調用的方法由MotoVehicle類型決定,而具體怎麼調用還要看子類對象,如果重寫了calRent()方法就用子類的,沒有就去找父類。
這是方法的重載解析。

yihuanxuri
qq_27350929
qq_27350929
yihuanxuri
qq_27350929
yihuanxuri
yihuanxuri
yihuanxuri
yihuanxuri
yihuanxuri
yihuanxuri
qq_27350929
qq_27350929
qq_27350929
qq_27350929
yihuanxuri
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved