Java-3-繼承

Ø 課堂討論要點:

 

1.包(package)的概念

 

     一個好的類名,大家都愛使用,那麼在相同類名的情況下,將很難區分類的主人, 所以我們必須給類起一個範圍限定(歸屬), JAVA中是通過包的機制來解決的。

 

     案例:

       張三寫的學生類  zhangsan. Student

       李四寫的學生類  lisi.Student

       王五編寫了一個程序使用到了上述兩個學生類:

         zhangsan.Student s=new zhangsan.Student();

    

     包是一種邏輯結構,是一個類的歸屬標誌,同一個包中不能出現雷同的類名。

包在物理上是如何實現的?是通過磁盤目錄來表示的。

 

包名也有可能出現雷同的現象,爲了避免這種情況的發生,我們一般使用單位的域名倒裝來作爲包名,因爲域名不會出現重複,一個域名作爲包名將可能在磁盤上創建多個層級目錄。

 

爲了避免你所編寫的類,在後續的系統中出現使用上問題,請不要書寫無包類/默認包類(default package).

 

案例:

package edu.fzu.cs;    //package關鍵字,說明這個類所屬的包

public class Student {

 

}

 

2. 包裝類(wrapper)

   任何基本類型:byte, int , long, float ,double, boolean,char (16bits) ….. (JAVA沒有無符號數據類型, char 是 utf-8編碼的)

 

   在JAVA中都有一個類類型與其對應。

   Int à java.lang.Integer  (java.lang java語言包, lang=language, 

java.lang包中的所有的類在任何JAVA程序中都由編譯器默認導入,語法是:

import java.lang.*

由於lang包裏頭的類使用極度頻繁,是語言擴展和服務類,爲降低程序員的導入負擔,該包下的所有類由編譯器幫助導入,用戶無需手動導入。

)

   

   包裝類的主要作用:

a) int à Integer

b) float à Float

c) double à Double

d) boolean à Boolean

e) char à Character

f) long -> Long

g) byte -> Byte

 

1. 彌補基本類型的語意缺失

基本類型無法表示:“沒有”

float mark;     0 

Float mark     0 , null

2. 爲基本類型提供服務

       System.out.println(Integer.toBinaryString(100));

   System.out.println(Integer.toHexString(100));

   System.out.println(Integer.parseInt("12")+1);

 

   裝箱(inbox)和拆箱(outbox)

 

   代表了類類型和基本類型之間的轉換行爲。

 

   手動版本:

   Integer b = new Integer(10);

   Int a = b.intValue;

 

   自動版本:

   Integer b=30;    à  Integer b=new Integer(30);

   Int a=b;         à  int a =b.intValue();

 

   因爲基本類型和類類型之間的換轉操作頻繁,SUN公司在高版本的JDK中提供了自動裝箱和拆箱操作,由編譯器幫助你書寫轉換代碼。

 

   在JDK5以上版本才支持自動裝箱和拆箱操作。

 

3. String類瞭解

    

String s=new String("abc");

String m=new String("abc");

 

通過new String()語法將告訴編譯器創建新對象,所以這裏創建兩個字符串對象。

    System.out.println(s==m);

String a="xyz";

String b="xyz";

System.out.println(a==b);

爲了兼容C開發者的習慣,SUN也允許不寫new String,而字符串賦值。

    當”xyz”這個字符串對象在內存中不存在的時候,系統將創建一個字符串對象,當已經存在的時候,系統將複用這個對象。

 

字符串的不變性(immutable)

任何字符串對象一旦被創建,就不能被更改,通過引用變量導致字符串的修改,都將導致新字符串對象的創建。

 

a=a+"mn";

System.out.println(a==b);

 

    大量的字符串相加操作會產生大量的字符串對象,比如:

    String a=”superstar”;

    a=a+”m”;

    如果有涉及到較多的字符串相加操作,請使用StringBuffer類。

    

     String s=" this is a book! ";

System.out.println(s.length()); //求字符串長度

System.out.println(s.trim().length()); //去除頭尾空格

System.out.println(s.toUpperCase());

System.out.println("aBcD".toLowerCase());

System.out.println(s.indexOf('s')); //找出s這個字符在字符串中首次出現的位置

System.out.println(s.lastIndexOf('s'));//找出s這個字符在字符串中最後一次出現的位置

System.out.println(s.indexOf("book")); //找出子串出現的位置

System.out.println(s.indexOf("world!"));

System.out.println(s.toCharArray()[3]);

System.out.println(s.charAt(3));

System.out.println(s.concat("hello,world!")); //字符串相加

System.out.println("abc".compareTo("bca"));  //-1,0,1

System.out.println("abc".compareTo("abc"));  //-1,0,1

System.out.println("cbc".compareTo("bca"));  //-1,0,1

System.out.println("Abc".compareToIgnoreCase("aBc"));

System.out.println(s.contains("book"));

System.out.println(s.endsWith("! "));

System.out.println(s.isEmpty()); //是否爲空

System.out.println(s.replace('s''m'));

System.out.println(s.valueOf(1));

System.out.println(1+"");

System.out.println("abcdefg".substring(3));

    System.out.println("abcdefg".substring(3,6));

 

    4. 繼承

       一個類可以繼承另外一個類,獲得這個類的所有屬性和方法,然後它可以增加一些自己特有的方法,構成自己的“私有財產”。

        任何一個java類如果沒有指定其繼承哪個類的話,默認都是繼承Object.

        任何一個java類都能且僅能繼承1個類。(單繼承)

        無論一個java類繼承哪個類,其都是Object的子類。

 

a. 繼承環境下的對象構造

 

子類對象的構造,除了完成自身部分的構造之外,還必須完成父類部分的構造。

 

子類構造過程,如果沒有完成體內父類部分構造,則構造未完成,編譯失敗。

 

子類在構造中,必須承擔體內父類部分的構造任務,而這個任務是由子類調用父類構造方法來實現的,有的時候,子類調錯了父類構造方法,導致構造失敗。

 

子類在構造過程中,必須“先父親後自己”的原則完成構造。

 

如果子類構造方法,沒有顯式指出調用哪個父類構造方法,編譯器將自動在子類構造方法的首行寫上super(), 調用父類的無參構造方法完成子類內部父類部分的構造工作。

Given:

1. public class Plant {

2. private String name;

3. public Plant(String name) { this.name = name; }

4. public String getName() { return name; }

5. }

1. public class Tree extends Plant {

2. public void growFruit() { }

3. public void dropLeaves() { }

4. }

Which is true? (choose two)   BD

A. The code will compile without changes.

B. The code will compile if public Tree() { super(“fern”); } is added to the

Tree class.

C. The code will compile if public Plant() { Tree(); } is added to the Plant class.

D. The code will compile if public Plant() { this(”fern”); } is added to

the Plant class.

E. The code will compile if public Plant() { super(”fern”); } is added to

the Plant class.

 

b. 繼承環境下的引用變量指向問題

 

標配指向:

Tiger t=new Tiger("tiger",4,"yellow");

Animal a = new Animal();

 

繼承環境下的非標配指向:

Animal a= new Tiger("tiger",4,"yellow");

Tiger t=new Animal();

 

父類引用變量可以指向子類對象

因爲子類對象中也包含父類部分。

我們可以用”is判斷法”來測試。

 

父類引用變量指向子類對象,在父類引用變量眼中,只看到子類對象的父類部分,只能調用父類部分功能,就好像該對象“萎縮”了一樣。

 

子類引用變量不能指向父類對象

首先,“is判斷法“ 通不過

其次,有“膨脹“的問題

在子類引用變量眼中,其所指向的對象就是子類對象,其會嘗試發出一些父類對象不具備的功能指令,把父類對象膨脹成子類對象,這是不允許的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章