第三次JAVA做業

1、學習要點
認真看書並查閱相關資料,掌握如下內容:
掌握類的繼承概念和設計
掌握構造方法的繼承原則
掌握方法重寫
掌握super鍵字和final關鍵字
掌握對象轉型,理解經過向上轉型實現對象多態。
掌握抽象類的設計
掌握接口的設計
掌握接口回調
理解簡單工廠設計模式
理解抽象類和接口的區別
掌握包裝類的應用
掌握對象的比較方法和比較器的使用
學習使用日期操做類
學習匿名內部類的使用
2、做業要求
發佈一篇隨筆,主要包括如下幾部分的內容:
(一)學習總結
1.閱讀下面程序,分析是否能編譯經過?若是不能,說明緣由。應該如何修改?程序的運行結果是什麼?爲何子類的構造方法在運行以前,必須調用父 類的構造方法?能不能反過來?java

class Grandparent {
    public Grandparent() {
        System.out.println("GrandParent Created.");
    }
    public Grandparent(String string) {
        System.out.println("GrandParent Created.String:" + string);
    }
}
class Parent extends Grandparent {
    public Parent() {        
        System.out.println("Parent Created");
        super("Hello.Grandparent.");
    }
}
class Child extends Parent {
    public Child() {
        System.out.println("Child Created");
    }
}
public class Test{
    public static void main(String args[]) {
        Child c = new Child();
    }
}
不能編譯經過。
構造方法的繼承原則:
子類無條件地繼承父類的不含參數的構造方法。
若子類沒有定義本身的構造方法,它將繼承父類無參數的構造方法做爲本身的構造方法。
若子類定義了本身的構造方法,它先執行繼承自父類的無參數構造方法,再執行本身的構造方法。
對父類含參數的構造方法,子類能夠經過在定義本身的構造方法中使用super關鍵字來調用它,但這個調用語句必須是子類構造方法的第一個可執行語句。
子類構造方法沒有顯式調用父類構造方法,而父類又沒有無參構造方法時,則編譯出錯。

不能在調用父類的構造方法以前,運行子類的構造方法。
構造方法(constructor)是一種特殊的方法 。主要用來在建立對象時初始化對象, 即爲對象成員變量賦初始值,總與new運算符一塊兒使用在建立對象的語句中 。特別的一個類能夠有多個構造函數 ,可根據其參數個數的不一樣或參數類型的不一樣來區分它們 即構造函數的重載。構造函數的功能主要用於在類的對象建立時定義初始化的狀態。
構造一個對象,先調用其構造方法,來初始化其成員函數和成員變量。
子類擁有父的成員變量和成員方法,若是不調用,則從父類繼承而來的成員變量和成員方法得不到正確的初始化。
由於父類不知道子類有什麼變量,子類也得不到初始化的父類變量,致使程序運行出錯!

更改結果:git

class Grandparent {
    public Grandparent() {
        System.out.println("GrandParent Created.");
    }
    public Grandparent(String string) {
        System.out.println("GrandParent Created.String:" + string);
    }
}
class Parent extends Grandparent {
    public Parent() {        
        super("Hello.Grandparent.");
        System.out.println("Parent Created");
        
    }
}
class Child extends Parent {
    public Child() {
        System.out.println("Child Created");
    }
}
public class Test{
    public static void main(String args[]) {
        Child c = new Child();
    }
}

運行結果:編程

GrandParent Created.String:Hello.Grandparent.
Parent Created
Child Created

2.閱讀下面程序,分析程序中存在哪些錯誤,說明緣由,應如何改正?正確程序的運行結果是什麼?設計模式

class Animal{
  void shout(){
      System.out.println("動物叫!");
  }
}
class Dog extends Animal{
      public void shout(){  
          System.out.println("汪汪......!");  
     }
      public void sleep() {
       System.out.println("狗狗睡覺......");
      } 
}
public class Test{
    public static void main(String args[]) {
        Animal animal = new Dog(); 
        animal.shout();
        animal.sleep();
        Dog dog = animal;
        dog.sleep(); 
        Animal animal2 = new Animal();
        dog = (Dog)animal2;
        dog.shout();
    }
}

錯誤:
編譯出錯:
程序中的錯誤:數組

animal.sleep();
Dog dog = animal;

編譯時沒有問題但運行時會出錯安全

Animal animal2 = new Animal();
        dog = (Dog)animal2;
        dog.shout();

緣由:
1.animal是子類Dog的上轉型對象,上轉型對象不能操做子類新增長的成員變量,不能使用子類新增的方法。父類對象定義爲子類對象稱爲向下轉型,對於向下轉型,須要強制轉型,即必須明確指明要轉型的子類類型: 格式:子類名稱 子類對象 =(子類)父類實例;
2.animal2是一個新定義的父類對象,即父類引用的對象是父類自己。父類對象不能肯定dog是本身的子類。須要使用instanceof關鍵字避免此錯誤。
改後程序:
class Animal{
void shout(){
System.out.println("動物叫!");
}
}
class Dog extends Animal{
public void shout(){
System.out.println("汪汪......!");
}
public void sleep() {
System.out.println("狗狗睡覺......");
}
}
public class Test{
public static void main(String args[]) {
Animal animal = new Dog();
animal.shout();
//animal.sleep();
Dog dog = (Dog) animal;
dog.sleep();
Animal animal2 = new Animal();
if(animal2 instanceof Dog)
{
dog = (Dog)animal2;
dog.shout();
}
}
}eclipse

運行結果:

汪......!
狗狗睡覺......函數

3.運行下列程序
class Person { 
   private String name ; 
   private int age ; 
   public Person(String name,int age){ 
         this.name = name ; 
         this.age = age ; 
   } 
}
public class Test{  
      public static void main(String args[]){ 
             Person per = new Person("張三",20) ; 
             System.out.println(per);
             System.out.println(per.toString()) ; 
  } 
}
(1)程序的運行結果以下,說明什麼問題?

Person@166afb3
Person@166afb3工具

輸出的是一個地址,說明per和per.toString()只表示一個地址。
System.out.println(per);默認調用父類Object 的toString方法。
(2)那麼,程序的運行結果究竟是什麼呢?利用eclipse打開println(per)方法的源碼,查看該方法中又調用了哪些方法,可否解釋本例的運行結果?
調用了String.vlueof(per),輸出的結果爲該值,即per的原始值。
(3)在Person類中增長以下方法
public String toString(){ 
        return "姓名:" + this.name + ",年齡:" + this.age ; 
 } 
 
從新運行程序,程序的執行結果是什麼?說明什麼問題?
可參考教材P229
運行結果:

姓名:張三,年齡:20
姓名:張三,年齡:20學習

說明了在沒有寫toSting方法時,默認的toString方法是object中的toString方法
4.汽車租賃公司,出租汽車種類有客車、貨車和皮卡三種,每輛汽車除了具備編號、名稱、租金三個基本屬性以外,客車有載客量,貨車有載貨量,皮卡則同時具備載客量和載貨量。用面向對象編程思想分析上述問題,將其表示成合適的類、抽象類或接口,說明設計思路。如今要建立一個可租車列表,應當如何建立?
定義一個車輛 接口包含三個屬性:編號、名稱、租金。對每一個屬性分別定義get,set方法。
分別定義一個載客量和載貨量接口,分別具備載客量和載貨量屬性而且定義get,set方法。
客車類、貨車類、皮卡類同時繼承車輛接口,客車類繼承載客量接口,貨車類繼承載貨量接口,皮卡類再同是繼承載客量和載貨量接口。
在測試類中完成可租車列表的建立。分別爲客車類、貨車類、皮卡類建立對象數組,每一個類的對象個數表示可租車數量,每次租一輛車去掉一個對象,每進行一次租車從新顯示一次可租車對象,用戶每次從可租車對象中選擇要租用的車輛。
5.閱讀下面程序,分析代碼是否能編譯經過,若是不能,說明緣由,並進行改正。若是能,列出運行結

interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
void eat(){
System.out.println("I'm eating");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}

不能經過編譯
緣由:子類並無所有實現接口原有的方法,而且eat方法下降了繼承方法的可視性(由於接口默認的都是public)。
改正:

interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
public void eat(){
System.out.println("I'm eating");
}
public void run() {}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
```
6.對象轉型:
上轉型對象
向上轉型:子類對象 父類對象
對於向上轉型,程序會自動完成:
格式:父類名稱 父類對象 = 子類實例;
上轉型對象具備以下特色:
上轉型對象不能操做子類新增長的成員變量,不能使用子類新增的方法。
上轉型對象能夠操做子類繼承或隱藏的成員變量,也可使用子類繼承的或重寫的方法。
上轉型對象調用方法時,就是調用子類繼承和重寫過的方法。而不會是新增的方法,也不是父類原有的方法。
下轉型對象
向下轉型:父類對象 子類對象
對於向下轉型,須要強制轉型,即必須明確指明要轉型的子類類型:
格式:子類名稱 子類對象 =(子類)父類實例;
在向下轉型過程當中,分爲兩種狀況:
若是父類引用的對象是指向的子類對象,那麼在向下轉型的過程當中是安全的。也就是編譯是不會出錯誤的。
若是父類引用的對象是父類自己,那麼在向下轉型的過程當中是不安全的,編譯不會出錯,可是運行時會出現java.lang.ClassCastException錯誤。它可使用instanceof來避免出錯此類錯誤。
instanceof關鍵字
經過instanceof關鍵字能夠判斷某一個對象是不是某一個類的實例。
格式:對象 instanceof 類返回boolean類型
(二)實驗總結
本次實驗包括實驗四和實驗五兩次的內容:
對完成實驗內容過程當中遇到的問題、解決方案以及程序的設計思路和思考等進行概括總結。
格式以下:
1.銀行新用戶現金業務辦理
程序設計思路:定義銀行類,完成開戶,存款,取款,而後在測試類中調用。
2.公司職員
程序設計思路:定義員工類,職員類和管理層類,職員類和管理繼承員工類。
3.圖形
程序設計思路:設計圖面圖形抽象類,立體圖形抽象類,做爲父類,還有各種圖形的類,他們做爲子類。
4.寵物商店
寵物種類有貓、狗,寵物信息包括:編號、種類、品種、單價、數量。
要求實現如下功能:
(1)展現全部寵物
(2)購買寵物
(3)展現購買清單:顯示購買的寵物品種,數量,價格合計及購買寵物的總價錢
5.動物聲音「模擬器」
(1)接口Animal:有2個抽象方法cry()和getAnimaName(),要求實現該接口的各類具體動物類給出本身的叫聲和種類名稱。
(2)模擬器類Simulator:有一個playSound(Animal animal)方法。即參數animal能夠調用實現Animal接口類重寫的cry()方法播放具體動物的聲音、調用重寫的getAnimalName()方法顯示動物種類的名稱。
(3)實現Animal接口的Dog類和Cat類
(4)測試類:main方法中至少包含以下代碼:
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
6.模擬物流快遞系統:
(1)定義一個抽象類交通工具類Transportation,屬性:編號,型號,運輸負責人。方法:無參構造和含三個參數的構造方法,get和set方法,抽象方法transport()
(2)定義一個專用運輸車類JDTransportation繼承交通工具類,繼承父類構造方法,實現transport()方法,輸出一個運輸信息。
(3)定義一個接口GPS實現對貨物的定位。接口中有方法showCoordinate()跟蹤貨物的位置信息。
(4)定義一個類Phone實現GPS接口
(5)定義一個快遞任務類SendTask,具備私有屬性:快遞單號、貨物重量。方法:無參和含參構造方法,get和set方法,
sendBefore()方法輸出運輸前的檢查信息和快遞單號。
send(Transportation t,GPS tool)方法輸出運貨人、車輛編號、型號信息,該方法中調用transport方法輸出運輸信息,調用showCoordinate()方法輸出貨物位置座標。
sendAfter( Transportation t )方法輸出貨物運輸完成後的信息。
(6)定義一個測試類,建立一個快遞任務類對象,一個交通工具類對象,一個GPS工具對象。模擬物流快遞過程。輸出運輸前、運輸中和運輸後的信息。
程序運行效果參考以下。
訂單開始處理,倉庫開始驗貨...
貨物重量:13.2kg
訂單已發貨
快遞單號:hx201835 //運輸前信息
運貨人小張正在駕駛編號爲zh1002的長城發送貨物!
京東快遞運輸中......
貨物當前座標:193,485 //運輸中信息
貨物運輸已完成
運貨人小張所駕駛編號爲zh1002的長城已歸還! //運輸後信息
7.修改實驗三的第四題,使用java.util.Date類表示職工的生日和參加工做時間,並將職工信息按照生日大小排序後輸出。(分別用comparable和comparator實現)
設計思路:
將實驗三的第四題中的時間類刪除,本來的時間類數據生日、工做時間用Date類替換,用comparable和comparator接口Arrays類的sort方法排序後輸出。
三)代碼託管(務必連接到你的項目)0
碼雲提交歷史截圖
https://gitee.com/a_father_of_a_small_car/java_CS02wzx
上傳實驗項目代碼到碼雲,在碼雲項目中選擇「統計-提交」,設置搜索時間段,搜索本週提交歷史,並截圖。

相關文章
相關標籤/搜索