Java入門第二季學(xué)習(xí)總結(jié)

課程總概


該門課程作為java入門學(xué)習(xí)的第二季,是在有一定的java基礎(chǔ)上進(jìn)行的進(jìn)一步學(xué)習(xí)。由于該季涉及到了java的一些核心內(nèi)容,所以相對(duì)第一季來說,課程難度有所提升。大致可將該季的課程分為五部分:第一部分,類和對(duì)象(第一章);第二部分,封裝(第二章);第三部分,繼承(第三章);第四部分,封裝(第四章4-1~4-6);第五部分,項(xiàng)目練習(xí)(第四章4-7、第五章、第六章)。(課程來源:慕課網(wǎng)Java入門第二季

一、類和對(duì)象


1、面向?qū)ο?/h4>

即人關(guān)注事物信息。

2、類和對(duì)象

(1)類:即模子,確定對(duì)象將會(huì)擁有的特征(屬性)和行為(方法)。

(2)類的特點(diǎn):類是對(duì)象的類型,是具有相同屬性和方法的一組對(duì)象的集合。

(3)屬性:對(duì)象具有的各種特征(每個(gè)對(duì)象的屬性都擁有特定值)。

(4)方法:對(duì)象執(zhí)行的操作。

(5)類和對(duì)象的關(guān)系:類是抽象的概念,僅僅是模板;對(duì)象是一個(gè)你能夠看得到、摸得著的具體實(shí)體。

3、定義類

(1)類的重要性:所有java程序都已類class為組織單位。

(2)類的定義:

① 定義類名;② 編寫類的屬性;③ 編寫類的方法。

public class 類名{
//定義屬性部分(成員變量)
屬性1的類型 屬性1;
屬性2的類型 屬性1;
……
//定義方法部分
方法1;
方法2;
……
}

4、使用對(duì)象

(1)創(chuàng)建對(duì)象:類名 對(duì)象名=new 類名();

(2)使用對(duì)象

引用對(duì)象的屬性:對(duì)象名.屬性

引用對(duì)象的方法:對(duì)象名.方法名()

PS:float類型數(shù)據(jù)后面要加上字母f。

5、成員變量和局部變量

(1)成員變量:在類中定義,用來描述對(duì)象將要有什么。

(2)局部變量:在類的方法中定義,在方法中臨時(shí)保存數(shù)據(jù)。

(3)兩者區(qū)別

成員變量:可以被本類的所有方法使用,也可以被與本類有關(guān)系的類中的方法使用(作用域:整個(gè)類)。

局部變量:只能在當(dāng)前方法中使用(作用域:本方法)。

(4)同名問題

① 在同一個(gè)方法中,不能有同名的局部變量,而在不同方法中可以;

② 兩類變量同名時(shí),局部變量擁有更高的優(yōu)先級(jí)。

6、構(gòu)造方法

(1)定義:是定義在java類中的一個(gè)用來初始化對(duì)象的方法,構(gòu)造方法與類同名,且沒有返回值。

(2)語法:public 構(gòu)造方法名(){}

PS:① 無返回值類型;② ()中可以指定參數(shù)。

(3)注意

① 若無構(gòu)造方法,會(huì)自動(dòng)生成一個(gè)無參構(gòu)造方法,可以自定義構(gòu)造方法;

② 若已有構(gòu)造方法,則不會(huì)自動(dòng)生成無參構(gòu)造方法;

③ 構(gòu)造方法可以重載。

7、static

(1)靜態(tài)變量

① static修飾的成員被稱為靜態(tài)成員或類成員,它屬于整個(gè)類所有,而不是某個(gè)對(duì)象所有,即被類的所有對(duì)象所共享,靜態(tài)成員可以使用類名直接訪問,也可以使用對(duì)象名進(jìn)行訪問,更推薦類名訪問;

語法:類名.靜態(tài)變量名對(duì)象.靜態(tài)變量名

② 使用static可以修飾變量、方法和代碼塊;

③ 靜態(tài)成員屬于整個(gè)類,當(dāng)系統(tǒng)第一次使用該類時(shí),就會(huì)為其分配內(nèi)存空間,直到該類被缺載時(shí)才會(huì)進(jìn)行資源回收。

(2)靜態(tài)方法

① 靜態(tài)方法可以直接調(diào)用同類中的靜態(tài)成員,但不能直接調(diào)用非靜態(tài)成員。如果想調(diào)用非靜態(tài)變量,可以通過創(chuàng)建類的對(duì)象,然后通過對(duì)象來訪問非靜態(tài)變量;

語法:類名 對(duì)象名=new 類名();System.out.println(對(duì)象名.非靜態(tài)變量名);

② 在普通成員方法中,則可以直接訪問同類的非靜態(tài)變量和靜態(tài)變量;

③ 靜態(tài)方法中不能直接調(diào)用非靜態(tài)方法,需要通過對(duì)象來訪問非靜態(tài)方法。

(3)靜態(tài)初始化塊

① 在類的聲明中,可以包含多個(gè)初始化塊(用{}包含),當(dāng)創(chuàng)建類的實(shí)例時(shí),就會(huì)依次執(zhí)行這些代碼塊。如果使用static修飾代碼塊,就稱為靜態(tài)初始化塊;

② 靜態(tài)初始化塊只在類加載時(shí)執(zhí)行,且只會(huì)執(zhí)行一次,同時(shí)靜態(tài)初始化塊只能給靜態(tài)變量賦值,不能初始化普通的變量成員;

語法:static{};

③ 程序運(yùn)行時(shí),靜態(tài)初始化塊最先被執(zhí)行,然后執(zhí)行普通的初始化塊,最后才執(zhí)行構(gòu)造方法。

二、封裝


1、封裝

(1)面向?qū)ο蟮娜筇匦裕?/strong>封裝性、繼承性、多態(tài)性

(2)封裝性

將類的某些信息隱藏在類的內(nèi)部,不允許外部程序直接訪問,而是通過該類提供的方法來實(shí)現(xiàn)對(duì)隱藏信息的操作和訪問。

(3)好處

① 只能通過規(guī)定的方法訪問數(shù)據(jù);

② 隱藏類的實(shí)例細(xì)節(jié),方便修改和實(shí)現(xiàn)。

(4)實(shí)現(xiàn)步驟

封裝實(shí)現(xiàn)步驟

點(diǎn)擊Eclipse菜單欄的源碼->點(diǎn)擊生成getter和setter方法

2、包

(1)作用:管理java文件,解決同名沖突問題。

(2)定義:pacakage 包名;

PS:必須放在源程序的第一行,包名之間可以用“.”隔開(分級(jí)),如com.helloworld.hello。

(3)系統(tǒng)中的包

樣式:java.(功能).(類)

① java.lang.(類)?????包含java語言基礎(chǔ)的類

② java.util.(類)?????包含java語言中的各種工具類

③ java.io.(類)?????包含輸入輸出相關(guān)功能的類

(4)包的使用

① 可以通過import關(guān)鍵字,在某個(gè)文件中使用其它文件中的類;,如:import com.helloworld.music.Myclass;

② java中,包的命名規(guī)范是全小寫字母拼寫;

③ 使用的時(shí)候不但可以加載某個(gè)包下的所有文件,如com.helloworld.*;,也可以加載某個(gè)具體子包下的所有文件,如com.helloworld.music.*;

3、訪問修飾符

作用:可以修飾數(shù)屬性和方法的訪問范圍。

控制符

4、this

(1)作用:代表當(dāng)前對(duì)象。

this.屬性?????操作當(dāng)前對(duì)象的屬性

this.方法?????調(diào)用當(dāng)前對(duì)象的方法

(2)封裝對(duì)象的屬性的時(shí)候,經(jīng)常會(huì)使用this。

5、內(nèi)部類

(1)定義:內(nèi)部類(Inner Class)就是定義在另外一個(gè)類里面的類,與之對(duì)應(yīng),包含內(nèi)部類的類被稱為外部類;

(2)作用

① 內(nèi)部類提供了更好的封裝,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包中的其他類訪問該類;

② 內(nèi)部類的方法可以直接訪問外部類的所有數(shù)據(jù),包括私有的數(shù)據(jù);

③ 內(nèi)部類所實(shí)現(xiàn)的功能使用外部類同樣可以實(shí)現(xiàn),只是有時(shí)使用內(nèi)部類更方便。

(3)種類

① 成員內(nèi)部類;② 靜態(tài)內(nèi)部類;③ 方法內(nèi)部類;④ 匿名內(nèi)部類。

6、成員內(nèi)部類

(1) Inner 類定義在 Outer 類的內(nèi)部,相當(dāng)于 Outer 類的一個(gè)成員變量的位置,Inner 類可以使用任意訪問控制符,如 public 、 protected 、 private 等;

(2)Inner 類中定義的方法可以直接訪問 Outer 類中的數(shù)據(jù),而不受訪問控制符的影響,如直接訪問 Outer 類中的私有屬性;

(3)定義了成員內(nèi)部類后,必須使用外部類對(duì)象來創(chuàng)建內(nèi)部類對(duì)象,而不能直接去 new 一個(gè)內(nèi)部類對(duì)象,即內(nèi)部類 對(duì)象名 = 外部類對(duì)象.new 內(nèi)部類( );;

(4)編譯含有內(nèi)部類的程序后,會(huì)發(fā)現(xiàn)產(chǎn)生了兩個(gè) .class 文件,其中,第二個(gè)是外部類的 .class 文件,第一個(gè)是內(nèi)部類的 .class 文件,即成員內(nèi)部類的 .class 文件總是這樣:外部類名$內(nèi)部類名.class

內(nèi)部類class文件

(5)注意

① 外部類不能直接使用內(nèi)部類的成員和方法, 可先創(chuàng)建內(nèi)部類的對(duì)象,然后通過內(nèi)部類的對(duì)象來訪問其成員變量和方法;

② 如果外部類和內(nèi)部類具有相同的成員變量或方法,內(nèi)部類默認(rèn)訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關(guān)鍵字。

語法:外部類名.this.屬性/方法

7、靜態(tài)內(nèi)部類

(1) 靜態(tài)內(nèi)部類不能直接訪問外部類的非靜態(tài)成員,但可以通過 外部類().成員 的方式訪問 ;

(2)如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱相同,可通過外部類名.靜態(tài)成員訪問外部類的靜態(tài)成員;如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱不相同,則可通過“成員名”直接調(diào)用外部類的靜態(tài)成員;

(3) 創(chuàng)建靜態(tài)內(nèi)部類的對(duì)象時(shí),不需要外部類的對(duì)象,可以直接創(chuàng)建 內(nèi)部類 對(duì)象名= new 內(nèi)部類();

8、方法內(nèi)部類

(1)定義:方法內(nèi)部類就是內(nèi)部類定義在外部類的方法中,方法內(nèi)部類只在該方法的內(nèi)部可見,即只在該方法內(nèi)可以使用。

(2)由于方法內(nèi)部類不能在外部類的方法以外的地方使用,因此方法內(nèi)部類不能使用訪問控制符和static修飾符。

三、繼承


1、繼承

(1)定義:繼承是類與類的一種關(guān)系(java中的繼承是單繼承,即只有一個(gè)父類)。

(2)繼承的好處

① 子類擁有父類的所有屬性和方法(private的不行);

② 實(shí)現(xiàn)代碼復(fù)用。

(3)語法:class 子類 extends 父類{ }

PS:Eclipse可以在創(chuàng)建類的時(shí)候選擇外層類和超類。

2、子類方法的重寫

(1)子類可重寫父類的方法,調(diào)用時(shí)會(huì)優(yōu)先調(diào)用子類方法;

(2)需要① 返回值類型;② 方法名;③ 參數(shù)個(gè)數(shù)與類型都相同,才能稱為子類方法的重寫。

3、繼承初始化順序

(1)初始化父類再初始化子類;

(2)如果類中對(duì)屬性進(jìn)行了初始化,構(gòu)造方法中也進(jìn)行了初始化,則先執(zhí)行初始化對(duì)象中屬性,在執(zhí)行構(gòu)造方法中的初始化。

4、final

作用:使用final關(guān)鍵字做標(biāo)識(shí)有“最終的”含義,它可以修飾類、方法、屬性和變量。

(1) 修飾類:則不允許被繼承;

(2)修飾方法:則不允許被重寫;

(3)修飾屬性:則該類的屬性的兩種方法只能選其一(類聲明屬性時(shí)賦值和在構(gòu)造方法中賦值),即只能賦一次值;

(4)修飾變量:則它只能賦一次值,即常量。

5、super

作用:在對(duì)象內(nèi)部使用,可代表父類對(duì)象,如super.屬性/方法。

(1)子類的構(gòu)造過程當(dāng)中必須調(diào)用其父類的構(gòu)造方法,子類構(gòu)造方法中會(huì)隱式顯示 super();語句;

(2)如果子類構(gòu)造方法中沒有顯示調(diào)用父類的構(gòu)造方法,則系統(tǒng)會(huì)默認(rèn)調(diào)用父類的無參構(gòu)造方法;

(3)如果顯示地調(diào)用父類的構(gòu)造方法,必須在子類的構(gòu)造方法的第一行;

(4)如果子類構(gòu)造方法中既無顯式調(diào)用父類的構(gòu)造方法,而父類又無無參構(gòu)造方法,則編譯出錯(cuò)。

6、Object類

(1)定義:Object類是所有類的父類,如果一個(gè)類沒有使用extends關(guān)鍵字明確標(biāo)識(shí)繼承于另外一個(gè)類,那么這個(gè)類默認(rèn)繼承Object類,Object類中的方法,適合所有子類;

(2)toString()方法

對(duì)象調(diào)用toString方法返回的是對(duì)象的哈希code碼(對(duì)象地址字符串),可以通過重寫toString()方法表示出對(duì)象的屬性。

(3)equals()方法

比較的是對(duì)象的引用是否指向同一塊內(nèi)存地址。

引用

如:Dog dog = new Dog();

其中的dog并不是所創(chuàng)建的對(duì)象,它只是對(duì)象的地址,稱為引用。

② 一般情況下,比較兩個(gè)對(duì)象時(shí)比較它的值是否一致,所以要重寫

點(diǎn)擊Eclipse菜單欄的源碼->生成hashCode()和equals()方法

語法:對(duì)象名.equals(另一個(gè)對(duì)象名);結(jié)果為布爾值

(4)類對(duì)象關(guān)注的是屬性;類的對(duì)象關(guān)注的是屬性的值。

類對(duì)象和類的對(duì)象

System.out.println(person.getClass());
//getClass方法用來返回對(duì)象所屬類的相關(guān)信息,結(jié)果為class person.Person
System.out.println(person.getClass().getName());
//getName方法用來返回對(duì)象所屬類的類名,結(jié)果為person.Person

四、多態(tài)


1、 定義

即對(duì)象的多種形態(tài)。

2、多態(tài)種類

(1)引用多態(tài)

父類的引用可以指向本類和子類的對(duì)象。

Animal obj1 = new Animal();
Animal obj2 = new Dog();
Dog obj3 = new Animal();//此行錯(cuò)誤

(2)方法的多態(tài)

① 創(chuàng)建本類對(duì)象時(shí),調(diào)用的方法為本類方法;

② 創(chuàng)建子類對(duì)象時(shí),調(diào)用的方法為子類重寫的方法或繼承的方法;

③ 無法通過父類調(diào)用子類的獨(dú)有方法。

3、引用類型轉(zhuǎn)換

(1)向上類型轉(zhuǎn)換:(隱式/自動(dòng)類型轉(zhuǎn)換)是小類型到大類型的轉(zhuǎn)換;

(2)向下類型轉(zhuǎn)換:(強(qiáng)制類型轉(zhuǎn)換)是大類型到小類型的轉(zhuǎn)換;

(3)instanceof運(yùn)算符:用來解決引用對(duì)象類型轉(zhuǎn)換的安全性問題;

Dog dog = new Dog();
Animal animal = dog;//自動(dòng)類型提升
Dog dog2 = (Dog) animal;//向下類型轉(zhuǎn)換
Cat cat = (Cat) animal;//1.編譯時(shí)為Cat類型;2.運(yùn)行時(shí)為Dog類型.兩個(gè)類型不匹配,所以會(huì)報(bào)錯(cuò).

改為

Dog dog = new Dog();
Animal animal = dog;
//判斷animal對(duì)象所屬類是否包Dogt類
//animal對(duì)象最先為Dog類,肯定是包含Dog類的
if(animal instanceof Dog){
  Dog dog2 = (Dog) animal;
}
else Syatem.out.println("無法進(jìn)行類型轉(zhuǎn)換!");
//判斷animal對(duì)象所屬類是否包含Cat類
//animal對(duì)象最先為Dog類,肯定是不包含Cat類的
if(animal instanceof cat){
  Cat cat = (Cat) animal;
}
else Syatem.out.println("無法進(jìn)行類型轉(zhuǎn)換!");

4、抽象類

(1)應(yīng)用場景

① 在某些情況下,某個(gè)父類只是知道了其子類應(yīng)該包含怎樣的方法,但無法準(zhǔn)確知道這些子類如何實(shí)現(xiàn)這些方法;

② 從多個(gè)具有相同特征的類中抽象出一個(gè)抽象類,以這個(gè)抽象類作為子類的模板,從而避免了子類設(shè)計(jì)的隨意性。

(2)作用:限制規(guī)定子類必須實(shí)現(xiàn)某些方法,但不關(guān)注實(shí)現(xiàn)細(xì)節(jié)。

(3)使用規(guī)則

① abstract 定義抽象類;

② abstract 定義抽象方法,只有聲明,不需要實(shí)現(xiàn)(無方法體);

③ 包含抽象方法的類是抽象類;

④ 抽象類可以包含普通的方法,也可以沒有抽象方法;

⑤ 抽象類不能直接創(chuàng)建對(duì)象,它可以創(chuàng)建引用變量指向子類對(duì)象。

如:public abstract class Telphone;

使用

Telphone tel1 = new Cellphone();
Telphone tel2 = new Smartphone();

或者直接

Cellphone tel1 = new Cellphone();
Smartphone tel2 = new Smartphone();

PS:一般抽象類名為大寫A開頭,再加上類名,如:APerson。

5、接口

(1)定義:接口是一種特殊的類,由全局常量和公共的抽象方法組成。

(2)類與接口:類是一種具體實(shí)現(xiàn)體,而接口定義類某一批類所需要遵守的規(guī)范,接口不關(guān)心這些類的內(nèi)部數(shù)據(jù),也不關(guān)心這些類里方法的實(shí)現(xiàn)細(xì)節(jié),她只規(guī)定這些類里必須提供某些方法。

(3)定義的語法

[修飾符] abstract interface 接口名 [extends 父接口1,父接口2...]
//[]內(nèi)為可選項(xiàng);abstract 若未顯式輸入,則系統(tǒng)會(huì)自動(dòng)加上
{
  public static final 數(shù)據(jù)類型 常量名1;
  //屬性必須為常量,即使輸入時(shí)未添加public static final,系統(tǒng)也會(huì)自動(dòng)添加
  public static final 數(shù)據(jù)類型 常量名2;
  ...
  public abstract 方法1{ } 
  //方法必須為抽象方法,即使輸入時(shí)未添加public abstract,系統(tǒng)也會(huì)自動(dòng)添加
  public abstract 方法2{ } 
  ...
}

PS:接口就是用來被繼承的、被實(shí)現(xiàn)的,修飾符一般建議用 public ,不能用 private 和 protected 修飾接口。

(4)接口的使用

① 一個(gè)類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口,java中一個(gè)類只能繼承一個(gè)父類是不夠靈活的,通過實(shí)現(xiàn)多個(gè)接口可以作補(bǔ)充。

實(shí)現(xiàn)接口的語法

[修飾符] abstract class 類名 [extends 父類] implements 接口1,父接口2...
//如果繼承了父類,則extends和implements不能互換位置
{
  類體部分;//如果繼承了抽象類,需要實(shí)現(xiàn)繼承的抽象方法,且要實(shí)現(xiàn)接口中的抽象方法
}

PS:通常會(huì)在接口名前加上字母“I”。

例子

③ 接口的引用可一個(gè)指向?qū)崿F(xiàn)了接口的對(duì)象(類似于父類與子類的使用);

④ 接口在使用過程中還經(jīng)常與匿名內(nèi)部類配合使用,匿名內(nèi)部類就是沒有名字的內(nèi)部類,多用于關(guān)注實(shí)現(xiàn)而不關(guān)注實(shí)現(xiàn)類的名稱,只是在使用時(shí)定義。

接口名 i = new 接口名(){
  public void method(){
    System.out.println("匿名內(nèi)部類實(shí)現(xiàn)接口的方式");
  }
};

或者直接

new 接口名(){
  public void method(){
    System.out.println("匿名內(nèi)部類實(shí)現(xiàn)接口的方式");
  }
}.method();

五、項(xiàng)目練習(xí)


1、UML簡介

(1)定義:(Unified Modeling Language)又稱統(tǒng)一建模語言或標(biāo)準(zhǔn)建模語言,是一個(gè)支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言,為軟件開發(fā)的所有階段提供模型化和可視化支持。

(2)UML圖示:UML2.2中一共定義了14種圖示(diagrams)。

(3)常用UML圖

① 用例圖(The Use Case Diagram)

用例圖能夠以可視化的方式,表達(dá)系統(tǒng)如何滿足所收集的業(yè)務(wù)規(guī)則,以及特定的用戶需求等信息。

用例圖

② 序列圖(The Sequence Diagram)

用于按照交互發(fā)生的一系列順序,顯示對(duì)象之間的這些交互。

序列圖

③ 類圖(The Class Diagram)

UML類圖、業(yè)務(wù)邏輯和所有支持結(jié)構(gòu)一同被用于定義全部的代碼結(jié)構(gòu)(類與類之間的關(guān)系,類中有哪些屬性和方法)。

類圖

(4)建模工具

Visio、Rational Rose、PowerDesign(應(yīng)用最廣)

① - 代表私有,+ 代表公有

② 《override》 代表重寫

③ 空心箭頭 代表繼承(子->父)

④ 虛線箭頭 代表實(shí)現(xiàn)接口(子->接口)

PS:點(diǎn)擊菜單欄的語言->點(diǎn)擊生成代碼,會(huì)根據(jù)圖形生成代碼。

2、項(xiàng)目分析

(1)數(shù)據(jù)模型分析

① 通過對(duì)現(xiàn)實(shí)世界的事與物主及要特征的分析、抽象,為信息系統(tǒng)的實(shí)施提供數(shù)據(jù)存取的數(shù)據(jù)結(jié)構(gòu)以及相應(yīng)的約束。

② 數(shù)據(jù)結(jié)構(gòu)組成:操作(方法)、屬性。

(2)業(yè)務(wù)模型分析

① 在設(shè)計(jì)應(yīng)用程序之前,應(yīng)該明確該應(yīng)用程序必須執(zhí)行哪些業(yè)務(wù)。分析業(yè)務(wù)需求是應(yīng)用程序開發(fā)中最重要的步驟之一。

② 確認(rèn)業(yè)務(wù)需求的目的在于創(chuàng)建一個(gè)能同時(shí)滿足零售商和消費(fèi)者需要的解決方案。

(3)顯示和流程分析

① 顯示:用戶可以看到的信息提示界面。

② 流程:顯示信息執(zhí)行的流程、步驟。

3、嗒嗒租車項(xiàng)目

(1)題目

項(xiàng)目

(2)項(xiàng)目分析

數(shù)據(jù)模型分析
業(yè)務(wù)模型分析
顯示與流程分析
車輛信息

(3)源碼

文件結(jié)構(gòu)
//Car.java文件
package car;
//定義Car抽象類
public abstract class Car {
    String name;
    int rent;
    public String getName() {
        return name;
    }
    public int getRent() {
        return rent;
    }
    public int getPeopleCapacity() {
        return 0;
    }
    public int getGoodCapacity() {
        return 0;
    }
}
//Passenger.java文件
package car;
//定義繼承于Car類的Passenger類
public class Passenger extends Car {
    int peopleCapacity;
    public Passenger(String name,int peopleCapacity,int rent){
        this.name=name;
        this.peopleCapacity=peopleCapacity;
        this.rent=rent;
    }
    public int getPeopleCapacity(){
        return peopleCapacity;
    }
}
//Trunk.java文件
package car;
//定義繼承于Car類的Trunk類
public class Trunk extends Car {
    int goodCapacity;
    public Trunk(String name,int goodCapacity,int rent){
        this.name=name;
        this.goodCapacity=goodCapacity;
        this.rent=rent;
    }
    public int getGoodCapacity(){
        return goodCapacity;
    }
}
//Pickup.java文件
package car;
//定義繼承于Car類的Pickup類
public class Pickup extends Car {
    int peopleCapacity;
    int goodCapacity;
    public Pickup(String name,int peopleCapacity,int goodCapacity,int rent){
        this.name=name;
        this.goodCapacity=goodCapacity;
        this.peopleCapacity=peopleCapacity;
        this.rent=rent;
    }
    public int getPeopleCapacity(){
        return peopleCapacity;
    }
    public int getGoodCapacity(){
        return goodCapacity;
    }
}
//number.java文件
package car;
//定義記錄訂單信息number類
public class number {
    int xuhao;//序號(hào)
    int shuli;//數(shù)量
    int tians;//天數(shù)
    public number(int xuhao,int shuli,int tians){
        this.xuhao=xuhao;
        this.shuli=shuli;
        this.tians=tians;
    }
    public int getXuhao() {
        return xuhao;
    }
    public void setXuhao(int xuhao) {
        this.xuhao = xuhao;
    }
    public int getShuli() {
        return shuli;
    }
    public void setShuli(int shuli) {
        this.shuli = shuli;
    }
    public int getTians() {
        return tians;
    }
    public void setTians(int tians) {
        this.tians = tians;
    }   
}
//Initial.java文件(主方法所在文件)
package car;

//導(dǎo)入java.util.Scanner包,用來獲取用戶輸入的數(shù)據(jù)
import java.util.Scanner;

public class Initial {
    
    //用來關(guān)閉創(chuàng)建的Scanner類的對(duì)象
    @SuppressWarnings("resource")
    
    public static void main(String[] args){
        
        //定義數(shù)組,用來儲(chǔ)存車輛信息
        Car [] cars={
                new Passenger("奧迪A4",4,500),
                new Passenger("馬自達(dá)",4,400),
                new Pickup("皮卡雪",4,2,450),
                new Passenger("金龍",20,800),
                new Trunk("松花江",4,400),
                new Trunk("依維柯",20,1000)        
        };
        
        System.out.println("***歡迎使用嗒嗒租車系統(tǒng)***");
        System.out.println("您是否需要租車服務(wù)?(Y/N)");
        
        //獲取輸入的字符并驗(yàn)證
        String flag=new Scanner(System.in).next();
        if(flag.equals("N")||flag.equals("n")){
            System.out.println("十分感謝您的信賴,歡迎再來!");
            System.exit(0);//退出系統(tǒng)
        }
        
        //輸出車輛信息以供選擇
        else{
            System.out.println("有以下幾種車型供您選擇:");
            System.out.println("序號(hào)"+'\t'+"車型"+'\t'+"租金"+'\t'+"載客量"+'\t'+"載貨量");
        }
        for(int i=0;i<cars.length;i++){
            System.out.println((i+1)+"\t"+cars[i].getName()+"\t"+cars[i].getRent()+"\t"+cars[i].getPeopleCapacity()+"\t"+cars[i].getGoodCapacity());
        }
        
        //創(chuàng)建記錄訂單信息的數(shù)組并把所有數(shù)據(jù)賦值為0
        final int Max=100;
        number []numbers=new number[Max]; 
        for(int i=0;i<numbers.length;i++){
            numbers[i]=new number(0,0,0);
        }
        
        //使用while循環(huán)以重復(fù)進(jìn)行車輛的選擇
        String contin="Y";
        while(contin.equals("Y")||contin.equals("y")){
            
            //利用  while 循環(huán)判斷輸入的序號(hào)正確與否
            System.out.println("請(qǐng)輸入您要租用的車輛的序號(hào):");
            int num=new Scanner(System.in).nextInt();   
            while(num<1||num>cars.length){
                System.out.println("輸入錯(cuò)誤!請(qǐng)輸入大于或等于1且小于或等于"+cars.length+"的整數(shù)!");
                num=new Scanner(System.in).nextInt();   
            }
            
            //利用  while 循環(huán)判斷輸入的數(shù)量正確與否
            System.out.println("請(qǐng)輸入您要租用"+cars[num-1].getName()+"的數(shù)量:");
            int num1=new Scanner(System.in).nextInt();  
            while(num1<0){
                System.out.println("輸入錯(cuò)誤!請(qǐng)輸入大于或等于0的整數(shù)!");
                num1=new Scanner(System.in).nextInt();  
            }
            
            //利用  while 循環(huán)判斷輸入的天數(shù)正確與否
            System.out.println("請(qǐng)輸入您要租用"+cars[num-1].getName()+"的天數(shù):");
            int num2=new Scanner(System.in).nextInt();  
            while(num2<0){
                System.out.println("輸入錯(cuò)誤!請(qǐng)輸入大于或等于0的整數(shù)!");
                num2=new Scanner(System.in).nextInt();  
            }
        
            numbers[num-1].setShuli(num1);
            numbers[num-1].setTians(num2);
            System.out.println("您是否需要繼續(xù)租車?(Y/N)");
            contin=new Scanner(System.in).next();
        }
        
        //輸出租車清單
        
        System.out.println("以下是您的租車清單:");
        System.out.println("車型\t租車數(shù)量\t租車天數(shù)\t載客量\t載貨量\t租金小計(jì)");
        int addShuli=0;
        int addTians=0;
        int addPeopleCapacity=0;
        int addGoodCapacity=0;
        int addRent=0;
        
        //利用for循環(huán)把租車信息輸出,并算出合計(jì)的信息
        for(int i=0;i<numbers.length;i++){
            if(numbers[i].getShuli()!=0&&numbers[i].getTians()!=0){
                System.out.println(cars[i].name+"\t"+numbers[i].getShuli()+"\t"+numbers[i].getTians()+"\t"+cars[i].getPeopleCapacity()*numbers[i].getShuli()+"\t"+cars[i].getGoodCapacity()*numbers[i].getShuli()+"\t"+numbers[i].getShuli()*numbers[i].getTians()*cars[i].getRent());
                addShuli+=numbers[i].getShuli();
                addTians+=numbers[i].getTians();
                addPeopleCapacity+=cars[i].getPeopleCapacity()*numbers[i].getShuli();
                addGoodCapacity+=cars[i].getGoodCapacity()*numbers[i].getShuli();
                addRent+=numbers[i].getShuli()*numbers[i].getTians()*cars[i].getRent();
            }
        }
        System.out.println("總租車數(shù)\t租車總天數(shù)\t總載客量\t總載貨量\t總租金");
        System.out.println(addShuli+"\t"+addTians+"\t"+addPeopleCapacity+"\t"+addGoodCapacity+"\t"+addRent);
        System.out.println("感謝您的光顧,歡迎再來!");
        System.exit(0);//退出系統(tǒng)
    }
}

心得體會(huì)


此次Java入門第二季課程主要學(xué)習(xí)的是面向?qū)ο蟮闹匾枷?,由于之前在學(xué)習(xí)c++的時(shí)候?qū)W習(xí)了這種思想,所以,雖然此次的學(xué)習(xí)深度加深了,但是難度并沒有提升很多。

經(jīng)過此次的學(xué)習(xí),我有如下幾個(gè)心得體會(huì):

1、學(xué)習(xí)時(shí)要做到心無旁騖

在此次課程的學(xué)習(xí)過程中,我總是會(huì)被身邊的事情或者人所影響,不能靜下心來認(rèn)真地學(xué)習(xí),導(dǎo)致學(xué)習(xí)的效率下降。以后學(xué)習(xí)時(shí),盡量做到身邊沒有人,把自己封閉起來認(rèn)真學(xué)。

2、要按照學(xué)習(xí)計(jì)劃來學(xué)

之所以做計(jì)劃,是為了能夠井井有條地做好每一件要做的事,不會(huì)手忙腳亂。按照計(jì)劃學(xué)習(xí),可以使學(xué)習(xí)的效率更高。此次的學(xué)習(xí)被一些突發(fā)的事情打亂,所以沒能高效率地按計(jì)劃完成,導(dǎo)致學(xué)習(xí)總結(jié)一直拖,拖到現(xiàn)在才寫完。

3、編程前要先搭好框架

編程前,你要先思考,你的程序要實(shí)現(xiàn)的功能是什么,需要建立哪些類,你需要哪些數(shù)據(jù),你需要哪些方法,搭好一個(gè)整體的框架,然后再具體思考如何實(shí)現(xiàn)這些功能。

4、一定要掌握面向?qū)ο蟮乃枷?/strong>

面向?qū)ο蟮木幊趟枷胧悄壳按蠖鄶?shù)計(jì)算機(jī)語言的核心思想,這是將來做項(xiàng)目的基礎(chǔ),目前只是小試牛刀,還需要進(jìn)行深入學(xué)習(xí)。

至此,Java入門第二季的學(xué)習(xí)告一段落了,我會(huì)繼續(xù)學(xué)習(xí)第三季的,不過這周要做Asp.net的課設(shè),可能要到下周才能開始呢!加油!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,419評(píng)論 0 2
  • 面向?qū)ο笾饕槍?duì)面向過程。 面向過程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,218評(píng)論 0 4
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,800評(píng)論 0 11
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,241評(píng)論 0 62
  • 很多女性會(huì)為了睡美容覺都會(huì)選擇早睡覺,真正的美容覺是不僅精神好,皮膚也好的那種。但是有一種美容覺會(huì)讓人越睡越丑,你...
    益民互助閱讀 310評(píng)論 0 0

友情鏈接更多精彩內(nèi)容