Ø 課堂討論要點:
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判斷法“ 通不過
其次,有“膨脹“的問題
在子類引用變量眼中,其所指向的對象就是子類對象,其會嘗試發出一些父類對象不具備的功能指令,把父類對象膨脹成子類對象,這是不允許的。