爲何子類的構造方法在運行以前,必須調用父 類的構造方法?能不能反過來?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(); } }
不一樣經過編譯,由於在parent構造方法中,調用父類構造方法沒有放在第一行。
應如何修改:將 super("Hello.Grandparent.")放在parent構造方法的第一行。
運行結果: GrandParent Created.String:Hello.Grandparent.
Parent Created
Child Created
構造一個對象,先調用其構造方法,來初始化其成員函數和成員變量。
子類擁有父的成員變量和成員方法,若是不調用,則從父類繼承而來的成員變量和成員方法得不到正確的初始化。
不能反過來調用也是這個緣由,由於父類根本不知道子類有神魔變量並且這樣一來子類也得不到初始化的父類變量,致使程序運行出錯!git
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(); } }
第一行錯誤的緣由是上轉型,只能調用子類繼承或者覆寫的方法,其中沒有sleep方法。 將其去掉
第二行錯誤的緣由是下轉型須要加上「(類型)「, 改正:Dog dog =(Dog) animal;編程
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
緣由:對象輸出時必定會調用Object類中的toString方法打印內容,直接輸出函數名默認調用toString方法。
(2)那麼,程序的運行結果究竟是什麼呢?利用eclipse打開println(per)方法的源碼,查看該方法中又調用了哪些方法,可否解釋本例的運行結果?
print方法中調用了write方法,打印了類自己。
(3)在Person類中增長以下方法eclipse
public String toString(){ return "姓名:" + this.name + ",年齡:" + this.age ; }
從新運行程序,程序的執行結果是什麼?說明什麼問題?
結果函數
姓名:張三,年齡:20 姓名:張三,年齡:20
覆寫了toString方法,調用的爲覆寫後的方法,打印類名也默認調用覆寫後的方法。this
客車有載客量,貨車有載貨量,皮卡則同時具備載客量和載貨量。用面向對象編程思想分析上述問題,
將其表示成合適的類、抽象類或接口,說明設計思路。如今要建立一個可租車列表,應當如何建立?
解:定義一個抽象類(或者接口)「出租汽車」,有抽象方法承載量,定義客車類、火車類、皮卡類去繼承出租汽車(或者實現接口),實現父類中的抽象方法,
客車實現抽象方法,打印載客量,貨車實現抽象方法,打印載貨量,皮卡實現抽象方法,打印載客量和載貨量,
定義租車類,聲明出租汽車類數組,經過構造方法中參數以及上轉型初始化。設計
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(); } }
不能:接口中方法,默認是public abstract 因此在子類實現抽象方法時,應該用public修飾
而且須要實現接口中全部的抽象方法,這裏須要再實習接口中的run方法。code
在寵物商店一題中,商店類中將選中的寵物記錄在購買清單的數組中,不要直接賦值引用,聲明一個寵物類(須要用到instanceof,下轉型),
將寵物信息賦值一份,修改下數量,存在數組,能夠在重載一個構造方法,參數是自身類,做用是實現自身的複製。
Data類中的toString方法返回的字符串格式是英文月份那種格式,不是yyyy-MM-dd。
在進行比較排序時,能夠經過自定義格式(yyyy-MM-dd)的字符串直接比較,也能夠getTime(返回自 1970 年 1 月 1 日 00:00:00 GMT
以來此 Date 對象表示的毫秒數)進行比較。對象
https://gitee.com/hebau_java_cs16/Java_CS02tx