一.成員變量與局部變量的區(qū)別
成員變量:在類中定義,用來描述對象將要有什么(屬性)盔性∠忌ィ可被本類方法和其他跟當前類有關(guān)系的方法使用。
局部變量:在類的方法中定義冕香,在方法中臨時保存數(shù)據(jù)蛹尝。(只能在當前的方法中使用)
區(qū)別:
- 作用域不同:局部變量的作用域僅限于定義它的方法,成員變量的作用域在整個類內(nèi)部都是可見的悉尾。
- 初始值不同:java會給成員變量一個初始值突那,java不會給局部變臉賦予初始值。
- 在同一個方法中构眯,不允許有同名局部變量愕难;在不同的方法中,可以有同名局部變量惫霸。
- 兩類變量同名時务漩,局部變量具有更高的優(yōu)先級。
二.構(gòu)造方法
構(gòu)造方法是定義在Java類中的一個用來初始化對象的方法,構(gòu)造方法與類同名且沒有返回值它褪。
構(gòu)造方法的語法格式:
public 構(gòu)造方法名(){
//初始化代碼
}
public后面沒有返回值類型,構(gòu)造方法名與類名相同,括號內(nèi)可以指定參數(shù)饵骨。
如果我們沒有指定一個無參的構(gòu)造方法,那系統(tǒng)會幫我們自動生成一個無參的構(gòu)造方法,如果我們對系統(tǒng)生成的無參構(gòu)造方法不滿意,可以自定義一個無參的構(gòu)造方法。
也就是說當我們創(chuàng)建對象的時候,其實我們執(zhí)行的是構(gòu)造方法茫打。
三.Java 中的 static 使用之靜態(tài)變量
Java 中被 static 修飾的成員稱為靜態(tài)成員或類成員居触。它屬于整個類所有,而不是某個對象所有老赤,即被類的所有對象所共享轮洋。靜態(tài)成員可以使用類名直接訪問,也可以使用對象名進行訪問抬旺。當然弊予,鑒于他作用的特殊性更推薦用類名訪問。
使用 static 可以修飾變量开财、方法和代碼塊汉柒。
靜態(tài)方法中可以直接調(diào)用同類中的靜態(tài)成員,但不能直接調(diào)用非靜態(tài)成員.如果希望在靜態(tài)方法中調(diào)用非靜態(tài)變量责鳍,可以通過創(chuàng)建類的對象碾褂,然后通過對象來訪問非靜態(tài)變量。
在普通成員方法中历葛,則可以直接訪問同類的非靜態(tài)變量和靜態(tài)變量正塌。
靜態(tài)方法中可以直接調(diào)用靜態(tài)方法,但不能直接調(diào)用非靜態(tài)方法,需要通過對象來訪問非靜態(tài)方法乓诽。
注意main函數(shù)是一個靜態(tài)函數(shù)帜羊。
四.封裝
將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問鸠天,而是通過該類提供的方法來實現(xiàn)對隱藏信息的操作和訪問逮壁。
java中包的作用:
1.管理java文件。
2.管理同名文件沖突粮宛,加上不同的包來區(qū)分相同文件名的類窥淆。
包的定義:
packege,包名間可以用點來區(qū)別文件夾且要放在java程序的第一行。
類名相同的可以用包名來區(qū)分:
java.lang.(類) 放置java語言基礎類巍杈。
java.util.(類)放置java語言工具類忧饭。
java.io.(類)包含輸入輸出相關(guān)功能的類。
用import來顯示在某個文件中的其他文件中的類:
在包中不能存放相同名字的類筷畦。
默認情況下會把同一個包名導入進來词裤。
包名全部是小寫。
訪問修飾符
private 同類
默認 同類 同包
protected 同類 同包 子類
public 同類 同包 子類 其他
this關(guān)鍵字
- this關(guān)鍵字代表當前對象
this.屬性 操作當前對象的屬性
this.方法 調(diào)用當前對象的方法 - 封裝對象的屬性的時候鳖宾,經(jīng)常會使用this關(guān)鍵字
public void setJia(double jia){
this.jia=jia;//this.屬性=參數(shù)吼砂;就是將參數(shù)的值付給當前對象的屬性(為了區(qū)分屬性和參數(shù))
this.sendMessage();//this.方法;就是調(diào)用當前對象的sendMessage()方法鼎文。
}
Java中的內(nèi)部類:
內(nèi)部類( Inner Class )就是定義在另外一個類里面的類渔肩。與之對應,包含內(nèi)部類的類被稱為外部類拇惋。
內(nèi)部類的主要作用如下:
- 內(nèi)部類提供了更好的封裝周偎,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個包中的其他類訪問該類撑帖。
- 內(nèi)部類的方法可以直接訪問外部類的所有數(shù)據(jù)蓉坎,包括私有的數(shù)據(jù)。
- 內(nèi)部類所實現(xiàn)的功能使用外部類同樣可以實現(xiàn)胡嘿,只是有時使用內(nèi)部類更方便蛉艾。
內(nèi)部類可分為以下幾種:
成員內(nèi)部類、靜態(tài)內(nèi)部類衷敌、方法內(nèi)部類勿侯、匿名內(nèi)部類。
五.繼承
繼承是類與類的一種關(guān)系逢享;Java中的繼承是單繼承罐监,只有一個父類。子類直接擁有父親的所有屬性和方法瞒爬。private實現(xiàn)的無效!代碼可復用。
繼承語法:
class 子類 extends 父類{ }
方法的重寫:
如果子類對繼承父類的方法不滿意侧但,是可以重寫父類繼承的方法的矢空,當調(diào)用方法時會優(yōu)先調(diào)用子類的方法。
語法:
- 返回值類型
- 方法名
- 參數(shù)類型及個數(shù)
都要與父類繼承的方法相同禀横,才叫方法的重寫屁药。
繼承的初始化順序:
1.初始化父類再初始化子類。
2.先執(zhí)行初始化對象中的屬性柏锄,再執(zhí)行構(gòu)造方法中的初始化酿箭。
父類對象-->屬性初始化--->構(gòu)造方法
子類對象-->屬性初始化--->構(gòu)造方法
final關(guān)鍵字:
表示“最終的”,即不可修改趾娃。
final可以修飾類缭嫡、方法、屬性和變量
- 修飾類:不允許被繼承
- 修飾方法:不允許被重寫
- 修飾屬性:則該屬性不會進行隱式初始化(不會自動初始化)抬闷,需要手動初始化或者在構(gòu)造方法中初始化 (但二者只能選一妇蛀,即只能初始化一次后便不能更改)
- 修飾變量,只能在聲明的時候賦一次值笤成,成為常量评架。 (static final 會使其成為全局常量)
super關(guān)鍵字
在對象內(nèi)部使用,代表父類對象炕泳。
子類構(gòu)造過程中必須調(diào)用父類的構(gòu)造方法:隱示super();
顯示調(diào)用父類構(gòu)造方法纵诞,必須放在構(gòu)造方法的第一行。
當子類構(gòu)造方法中既沒有顯示調(diào)用父類的構(gòu)造方法培遵,父類又沒有無參的構(gòu)造方法則編譯出錯挣磨。
Object類
是所有類的父類,如果一個類沒有使用extends關(guān)鍵字明確標識繼承另外一個類,那么這個類默認繼承Object類,且Object類中的方法適合所有子類。
toString()方法:
我們經(jīng)常在輸出對象的時候希望得到子類的屬性值,那么我們就要重寫從父類繼承來的toString()方法,eclipse中右鍵菜單欄-源碼source-生成generate toString(),他就會根據(jù)我們對象的屬性幫我們生成一個toString()方法來輸出屬性值荤懂。
equals()方法:
返回值是布爾類型茁裙,比較的是對象的引用是否指向同一塊內(nèi)存地址,對象實例化時节仿,即給對象分配內(nèi)存空間晤锥。
getClass()方法:
可以得到類對象,判斷類型是否一樣-----if (getClass() != obj.getClass())
new出來的是類的對象廊宪,關(guān)注的是類的屬性的具體的數(shù)據(jù)矾瘾;
類對象是類的代碼信息,關(guān)注的是類有什么屬性和方法箭启。
六.多態(tài)
對象的多種形態(tài)壕翩。
主要分為 引用多態(tài) 、方法多態(tài)傅寡。
繼承是多態(tài)的實現(xiàn)基礎放妈,別忘了子父類要有繼承關(guān)系北救。
多態(tài)特性:
引用多態(tài)
1.父類引用可以指向本類對象 Animal obj1 = new Animal();
2.父類引用可以指向子類對象 Animal obj2 = new Dog();
但是我們不能用子類的引用指向父類對象 Dog obj3 = new Animal();//錯方法多態(tài)
1.在父類Animal中定義一個eat()方法,輸出一個語句(動物有吃的能力); 在子類Dog中重寫eat()方法芜抒,輸出一個語句(狗是吃肉的); 那么我們在測試類main函數(shù)里面珍策,如果obj1.eat() ,那么調(diào)用的是父類的方法. 若用obj2調(diào)用eat()方法宅倒,那么調(diào)用的是子類的方法.
2.還有一種情況攘宙,比如創(chuàng)建一個繼承父類Animal的子類Cat 讲仰,但是Cat里并不重寫繼承的eat()方法. 然后武福,我們在測試類main函數(shù)里創(chuàng)建一個子類對象, Animal obj3 = new Cat(); 然后調(diào)用 obj3.eat(); 那么德召,結(jié)果調(diào)用的則是子類繼承父類的方法. (輸出結(jié)果:動物有吃的能力)
3.最后一種特殊情況贾费,多態(tài)的特性是不能使用的. 若在子類添加一個獨有的方法 public void watchDoor() 详拙,含有一句輸出語句(狗具有看門的能力); 那么我們在測試類的main函數(shù)當中(得先定義好對象Animal obj2 = new Dog() )岁疼,就不能用obj2.watchDoor()拧粪,即不能通過父類的引用調(diào)用子類的方法.
引用類型轉(zhuǎn)換:
- 向上類型轉(zhuǎn)換(隱式/自動類型轉(zhuǎn)換)铐懊,是小類型到大類型的轉(zhuǎn)換灶搜。
如:
Dog dog=new Dog();
Animal animal=dog;//正確祟蚀,自動類型提升,向上類型轉(zhuǎn)換
- 向下類型轉(zhuǎn)換(強制類型轉(zhuǎn)換)割卖,是大類型到小類型的轉(zhuǎn)換(存在風險前酿,溢出)
如:
Dog dog1=(Dog)animal;//向下類型轉(zhuǎn)換
- instanceof運算符,來解決引用對象的類型鹏溯,避免類型轉(zhuǎn)換的安全性問題罢维。如:
Dog dog=new Dog();
Animal animal=dog;
Cat cat=(Cat)animal;//編譯時不會出錯(按Cat類型進行編譯),但運行時會報錯
因為它開辟的是Dog類型的空間丙挽,而(無法將引用類型進行轉(zhuǎn)換)無法將dog對象轉(zhuǎn)換成Cat類型肺孵,并且此方法對程序的安全性有影響。此時應該利用instanceof和if語句結(jié)合使用颜阐,進行驗證平窘,以保證程序的安全性,如:
if(animal instanceof Cat){//判斷animal類中是否包含Cat類型的元素凳怨,若包含則進行轉(zhuǎn)換瑰艘,instanceof返回值為布爾類型
Cat cat=(Cat)animal;
}else{
System.out.println("無法進行類型轉(zhuǎn)換");
}
抽象類
- 語法定義:
抽象類錢使用abstract關(guān)鍵字修飾,則該類為抽象類肤舞。 - 應用場景:
a紫新、在某些情況下,某個父類只是知道其子類應該包含怎樣的方法李剖,但無法準確知道這些子類如何實現(xiàn)這些方法
b芒率、從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板篙顺,從而避免了子類設計的隨意性偶芍。 - 作用:
限制規(guī)定子類必須實現(xiàn)某些方法充择,但不關(guān)注實現(xiàn)細節(jié)。 - 使用規(guī)則:
a. abstract定義抽象類
b. abstract定義抽象方法腋寨,只有聲明聪铺,不需要實現(xiàn)
c. 包含抽象方法的類是抽象類
d. 抽象類中可以包含普通的方法化焕,也可以沒
現(xiàn)有Shape圖形類萄窜,用Rectangle矩形和Circle圖形子類,求圖形的周長和面積撒桨。
代碼實現(xiàn):
abstract class Shape{
protected float width;
protected float lenth;
public Shape(float a, float b){
width = a;
lenth = b;
}
public abstract float getArea(); //獲得面積
public abstract float getGirth(); //獲得周長
}
class Rectangle extends Shape{
public Rectangle(float a, float b){
super(a, b);
}
public float getGirth(){
return 2*(width + lenth);
}
public float getArea(){
return width*lenth;
}
}
class Circle extends Shape{
public Circle(float a){
super(a, a);
}
public float getGirth(){
return (float)3.14*2*width;
}
public float getArea(){
return (float)3.14*width*width;
}
}
public class HelloWorld{
public static void main (String[] args){
Rectangle rect = new Rectangle(2, 3);
Circle circle = new Circle(3);
System.out.println("rect girth: " + rect.getGirth() + " rect area: " + rect.getArea());
System.out.println("circle girth: " + circle.getGirth() + " circle area: " + circle.getArea());
}
}
七.接口
接口可以理解為一種特殊的類查刻,由全局常量和公共的抽象方法所組成,接口定義使用 interface 關(guān)鍵字凤类。
類是一種具體實現(xiàn)體穗泵,而接口定義了某一批類所需要遵守的規(guī)范,接口不關(guān)心這些類里方法的實現(xiàn)細節(jié)
谜疤,它只規(guī)定這些類里必須提供某些方法佃延。
使用接口:
一個類可以實現(xiàn)一個或多和接口,實現(xiàn)接口使用implements關(guān)鍵字夷磕。java中一個類只能繼承一個父類履肃,可以通過實現(xiàn)多個接口作補充。
繼承父類實現(xiàn)接口的語法:
[修飾符] class 類名 extends 父類 implements 接口1坐桩,接口2……{
類體部分
}//如果繼承的是抽象類尺棋,需要實現(xiàn)繼承的抽象方法;要實現(xiàn)接口中的抽象方法
如果要繼承父類绵跷,繼承父類必須在實現(xiàn)接口之前膘螟,接口命名時首字母為I,以區(qū)分類名碾局【2校可通過add繼承父接口。
接口的使用還經(jīng)常與匿名內(nèi)部類配合净当。(匿名內(nèi)部類就是沒有名字的內(nèi)部類内斯,多用于關(guān)注實現(xiàn)而不關(guān)注實現(xiàn)類的名稱)
語法格式:
Interface i=new Interface(){
public void method(){
System.out.print("匿名內(nèi)部類實現(xiàn)接口的方式……");
}
} //即通過創(chuàng)建接口的對象,直接寫出實現(xiàn)的方法蚯瞧,再調(diào)用此方法
還可以直接創(chuàng)建并調(diào)用方法嘿期,如:
new IPlay(){
public void playGame(){
System.out.println("……");
}
}.playGame();
八.UML
- Unified Modeling Language,統(tǒng)一建模語言/標準建模語言埋合,是支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言备徐;是一個支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言;為軟件開發(fā)的所有階段提供模型化的可視化支持
- 用例圖:可視化表達系統(tǒng)如何滿足業(yè)務規(guī)則和特定的用戶需求甚颂;
- 序列圖:表述計算機角色和相互關(guān)系蜜猾,按照交互發(fā)生的順序顯示對象之間的交互秀菱;
- 類圖/類別圖:描述類之間的關(guān)系,類中的屬性和方法蹭睡;
- UML類圖衍菱、業(yè)務邏輯和所有支持結(jié)構(gòu)一同被用于定義全部的代碼結(jié)構(gòu)。
- UML建模工具:如Visio肩豁、Rational Rose脊串、PowerDesiner