?? day03.txt
字號:
CoreJava(day03) 2007-12-5 --- 李艷
面向對象:
1、類:同一類事物的抽象的定義,對象的抽象,客觀對象在人腦中的主觀反映。對象的模版
2、對象:類的個體(實現),客觀存在的一切事物都是對象,有什么(屬性),能做什么(方法)。對象有可能被實例化,也有可能不被實例化。
實例(instance):實現了的對象
例:Student s; //Student是類,s是對象
s=new Student(); //new Student()是實例
3、規范:
package 包名; 0--1個 包名全小寫,各單詞之間用.隔開
import 要導入的包路徑; 0--n個
class 類名{
field; //屬性 0--n
構造方法; //0--n 在編譯后的文件中是1--n個
方法; //0--n
}
package;
import;
class;
這三個順序不可改變
類的定義格式: [修飾符(0--n)] class 類名{}
屬性的定義格式:[修飾符] 類型 屬性名;
方法的定義格式:[修飾符] 返回類型 方法名 參數表 [異常] {}
容易出現的錯誤:class T{
private String name;
System.out.println(name); //這句位置錯誤,因為在類體內只允許放屬性、構造器、方法和語句塊,不允許出現語句。
{
System.out.println(name); //這是正確的,因為是放在了語句塊里,被大括號包圍起來的多行代碼稱為語句塊。
}
}
java中所有的參數類型傳遞都是值傳遞,基本類型傳遞變量中確切的值,引用類型傳地址。
4、this的使用
this不能出現在靜態(static)方法中。
兩種用法:
1)用來區分實例變量與局部變量的沖突
例:public setName(String name){
this.name=name;
}
2)this();在構造器里這樣寫表示調用本類的其它構造器,必須放在此構造器的第一行。
this(name); 小心循環調用造成死循環
5、面象對象的三大特性:封裝,繼承,多態
a)封裝(Encapsulation):(課堂代碼:Person.java,TestPerson.java)
封裝,一個對象和外界的聯系應當通過一個統一的接口,應當公開的公開,應當隱藏的隱藏。
(對象的屬性應當隱藏),一個對象的內部是透明的,就是把對象內部的可透明性和隱藏的特性區分開,該透明的透明,該隱藏的隱藏。
(封裝的屬性)java中類的屬性的訪問權限的默認值不是private,
要想隱藏該屬性或方法,就可以加private(私有)修飾符來限制只能夠在類的內部進行訪問。
對于類中的私有屬性,要對其給出一對方法(getXxx(),setXxx())訪問私有屬性,保證對私有屬性的操作的安全性。
方法公開的是方法的聲明(定義),即(只須知道參數和返回值就可以調用該方法),封裝會使實現的改變對架構的影響最小化。
完全的封裝,類的屬性全部私有化,并且提供一對方法來訪問屬性。給自己用的方法要隱藏
Java Bean 一種組件規范 --> 所有屬性私有,訪問方法按照命名規范setXxx(),getXxx(),isXxx()方法
b)重載:(Overload): (課堂代碼:Calculator.java)
方法名相同,參數表不同,可能相同的返回類型,又叫編譯時多態
方法是否重載與返回類型無關。
參數列表必須不同是為了查找、調用不同的方法,虛擬機按照參數的類型與個數來進行方法的調用。
重載是為了屏蔽對象同類方法由于參數表不同所造成的差異,這個差異對使用者是屏蔽的
向上就近匹配原則(當有多個參數時,選擇少提升的參數)(課堂代碼:TestOverload.java)
API中方法名的規范:獲取某個屬性的內容getXxx(),設置屬性的值setXxx(),判斷是不是isXxx(),返回boolean類型
6、構造器:(課堂代碼:Emp.java)
定義構造器的格式:[修飾符] 類名([參數]){
語句
}
構造器無返回類型,方法名與類名相同,既方法名固定為類名。
實例化
構造器是為了完成由類到對象實例化的過程:類---------->對象 ,(new 構造器)
構造器的功能是為了創造對象,方法是為了操作對象。
一般把初始化的代碼放在構造器里
package----->分配目錄
import------->導入目錄下的文件,引入哪個包里的哪個類文件。import的來源是CLASSPATH(類路徑)
例:import mypack.Welcome; 聲明以下用到Welcome時不帶包名
import mypack.*; *表示mypack包下的所有類,不能表示子包
class 的聲明:
class 類名{
屬性: 類的特征,在命名時用名詞表示
構造器:實現,表示如何實例化類,生成一個具體的對象
方法:標識對象的行為,在命名時使用動賓短語
}
類的使用:new 一個類的構造器,得到該類的對象,用對象.屬性/方法去執行代碼
創建對象格式:類名 對象名=new 類名(參數表)
例:int a; //簡單變量
Student s; //聲明一個Student類的對象變量(或稱引用)
s = new Student(); //調用Student類的無參的構造方法,創建一個對象,把這個對象的地址賦給一個Student類的引用
(引用指向了這個對象,引用中保存對象的首地址,以后都是通過引用訪問這個對象的屬性和方法)
s.age s引用指向對象的age屬性
構造器可以重載,構造器是由系統自動調用的
若對一個類沒有寫構造器,則構造對象時會自動調用默認的無參的空的構造器,但要求最好自己寫構造方法,不要依賴默認的構造方法
若自己寫了任何一個構造器,系統便不再提供無參的空的構造器
java中沒有析構方法,也不允許程序員自己定義析構方法,因為java中有自動垃圾收集器
7、繼承
繼承,是對有著共同特性的多類事物,進行再抽象成一個類。這個類就是多類事物的父類。父類的意義在于可以抽取多類事物的共性。
泛化:把共性從子類中抽取出來。先有子類后有父類叫泛化
特化:先有父類,再有子類的過程。先有父類再有子類叫特化
父類與子類 -> 從一般到特殊的關系
java中的繼承要使用extends關鍵字,并且java中只允許單繼承,也就是一個類只能有一個直接的父類。
這樣就是繼承關系呈樹狀,體現了java的簡單性。
子類只能繼承在父類中可以訪問的屬性和方法(實際上父類中私有的屬性和方法也會被繼承但子類中無法訪問罷了)。
注意:構造器不能被繼承。
實際上一個子類對象中包含一個父類對象
繼承的意義,就在于子類可以在父類的基礎之上對父類的功能進行發展,繼承可以使系統的耦合性降低,
也就是使對象間的聯系便的松散,使多類對象間的聯系用其父類對象代替。
8、super關鍵字
(1)區分父子類間的屬性遮蓋和方法覆蓋,用來區分被子類遮蓋的實例變量和被子類覆蓋的方法,父子類之間的屬性相同時會形成遮蓋
(2)super(),表示在子類的構造方法中調用父類的構造方法(可以通過這種方法在子類的構造方法中初始化父類中的屬性),
super()也只能出現在構造方法的第一句上。super(),在子類的構造方中指明構造父類時調用哪一個父類的構造方法構造父類。
super. 這里所表示的是一個父類的對象,可以通過super來使用父類中可以訪問的方法
(可以在父類中定義setXxx(),getXxx()方法來訪問父類中的私有屬性),super可以屏蔽父子類中同名屬性的沖突。
注意:在寫類的時候,一定要寫默認無參的構造方法,如果一個構造方法的第一句既不是this(),也不是super()時,
那么就會在這里隱含的調用他的父類的無參的構造方法,即隱含的有super()。
this()和super()不能在同一個構造器中出現,因為都必須出現在第一行。既“一山不容二虎”
所有的對象的構造都是先父后子,先調用this的東西,后調用super的東西.
9、多態:
java中的多態 --- 運行時多態
Person p=new Student(); //Person 是編譯時類型,Student是運行時類型。運行時類型得是編譯時類型的子類
引用類型 對象類型
主觀類型 客觀類型
父類的引用賦值給子類的引用需要強制類型轉換,而子類的引用賦值給父類的引用不需要強制類型轉換
多態的用途:可以把不同子類的對象統一當做父類對象來看,屏蔽不同子類的差異
多態可以使代碼變得更通用,以適應需求的變化。也就是定義在父類中的方法,可以在子類中有不同的實現將其覆蓋,
在為父類型的對象變量賦值相應需要功能的子類的對象實例。
多態的種類:
a)簡單類型的多態
b)方法的多態
c)參數的多態
d)類的多態: Person p=new Student();
instanceof的用法: 引用 instanceof 類名----判斷該引用所指向的對象和后面的這個類是否兼容,用在強制類型轉換之前。
p instanceof Student; //p指向的對象是不是Student類
一般用在強制類型轉換之前,避免轉換異常
if(p instanceof Person) 返回true ,因為向上兼容
10、方法的重寫(也叫方法覆蓋):重寫一定要有繼承關系,重載不需要繼承關系
java中方法的覆蓋-----父子類之間
1)重寫的要求:子類與父類的方法名相同,參數表相同,返回類型相同,不能拋出比父類更大的異常
2)需要重寫的子類方法的修飾符要比父類被重寫方法的修飾符相同或更寬
注意:在jdk1.4以前要求方法的覆蓋時,需要方法的返回值,參數表,方法名必須嚴格相同,
而在jdk1.5中方法覆蓋,子類的中覆蓋的方法的返回值可以是父類中被覆蓋的方法的返回值類型的子類型。
注意:子類的方法覆蓋父類的方法時,方法的修飾符要么相同,要么子類中的方法的修飾符表示的訪問權限要大于父類。
父類中的私有方法,不能被繼承到子類,就是說子類中即使將其覆蓋了也不會有多態。
注意:父子類中有同名的屬性不叫子類覆蓋了父類的屬性,這種情況叫作屬性的遮蓋(shadow)。
參考書:java核心技術
作業:寫一個日期類(Mydate): 私有化屬性(用封裝)
int year;
int month;
int day;
對每個屬性給出set,get方法,其中setYear:1900---2100之間,setMonth:1-12之間
setDay:1,3,5,7,8,10,12:31天,
4,6,9,11:30天,
2:28天或者29天?看是否閏年:year%4==0&& year%100!=0||year%400==0
寫兩個構造器,一個無參,一個參數表是(int y,int m,int d)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -