一.成員變量與局部變量的區別
成員變量:在類中定義,用來描述對象將要有什么(屬性)。可被本類方法和其他跟當前類有關系的方法使用。
局部變量:在類的方法中定義,在方法中臨時保存數據。(只能在當前的方法中使用)
區別:
- 作用域不同:局部變量的作用域僅限于定義它的方法,成員變量的作用域在整個類內部都是可見的。
- 初始值不同:java會給成員變量一個初始值,java不會給局部變臉賦予初始值。
- 在同一個方法中,不允許有同名局部變量;在不同的方法中,可以有同名局部變量。
- 兩類變量同名時,局部變量具有更高的優先級。
二.構造方法
構造方法是定義在Java類中的一個用來初始化對象的方法,構造方法與類同名且沒有返回值。
構造方法的語法格式:
public 構造方法名(){
//初始化代碼
}
public后面沒有返回值類型,構造方法名與類名相同,括號內可以指定參數。
如果我們沒有指定一個無參的構造方法,那系統會幫我們自動生成一個無參的構造方法,如果我們對系統生成的無參構造方法不滿意,可以自定義一個無參的構造方法。
也就是說當我們創建對象的時候,其實我們執行的是構造方法。
三.Java 中的 static 使用之靜態變量
Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。當然,鑒于他作用的特殊性更推薦用類名訪問。
使用 static 可以修飾變量、方法和代碼塊。
靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員.如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量。
在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量。
靜態方法中可以直接調用靜態方法,但不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。
注意main函數是一個靜態函數。
四.封裝
將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。
java中包的作用:
1.管理java文件。
2.管理同名文件沖突,加上不同的包來區分相同文件名的類。
包的定義:
packege,包名間可以用點來區別文件夾且要放在java程序的第一行。
類名相同的可以用包名來區分:
java.lang.(類) 放置java語言基礎類。
java.util.(類)放置java語言工具類。
java.io.(類)包含輸入輸出相關功能的類。
用import來顯示在某個文件中的其他文件中的類:
在包中不能存放相同名字的類。
默認情況下會把同一個包名導入進來。
包名全部是小寫。
訪問修飾符
private 同類
默認 同類 同包
protected 同類 同包 子類
public 同類 同包 子類 其他
this關鍵字
- this關鍵字代表當前對象
this.屬性 操作當前對象的屬性
this.方法 調用當前對象的方法 - 封裝對象的屬性的時候,經常會使用this關鍵字
public void setJia(double jia){
this.jia=jia;//this.屬性=參數;就是將參數的值付給當前對象的屬性(為了區分屬性和參數)
this.sendMessage();//this.方法;就是調用當前對象的sendMessage()方法。
}
Java中的內部類:
內部類( Inner Class )就是定義在另外一個類里面的類。與之對應,包含內部類的類被稱為外部類。
內部類的主要作用如下:
- 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類。
- 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據。
- 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便。
內部類可分為以下幾種:
成員內部類、靜態內部類、方法內部類、匿名內部類。
五.繼承
繼承是類與類的一種關系;Java中的繼承是單繼承,只有一個父類。子類直接擁有父親的所有屬性和方法。private實現的無效!代碼可復用。
繼承語法:
class 子類 extends 父類{ }
方法的重寫:
如果子類對繼承父類的方法不滿意,是可以重寫父類繼承的方法的,當調用方法時會優先調用子類的方法。
語法:
- 返回值類型
- 方法名
- 參數類型及個數
都要與父類繼承的方法相同,才叫方法的重寫。
繼承的初始化順序:
1.初始化父類再初始化子類。
2.先執行初始化對象中的屬性,再執行構造方法中的初始化。
父類對象-->屬性初始化--->構造方法
子類對象-->屬性初始化--->構造方法
final關鍵字:
表示“最終的”,即不可修改。
final可以修飾類、方法、屬性和變量
- 修飾類:不允許被繼承
- 修飾方法:不允許被重寫
- 修飾屬性:則該屬性不會進行隱式初始化(不會自動初始化),需要手動初始化或者在構造方法中初始化 (但二者只能選一,即只能初始化一次后便不能更改)
- 修飾變量,只能在聲明的時候賦一次值,成為常量。 (static final 會使其成為全局常量)
super關鍵字
在對象內部使用,代表父類對象。
子類構造過程中必須調用父類的構造方法:隱示super();
顯示調用父類構造方法,必須放在構造方法的第一行。
當子類構造方法中既沒有顯示調用父類的構造方法,父類又沒有無參的構造方法則編譯出錯。
Object類
是所有類的父類,如果一個類沒有使用extends關鍵字明確標識繼承另外一個類,那么這個類默認繼承Object類,且Object類中的方法適合所有子類。
toString()方法:
我們經常在輸出對象的時候希望得到子類的屬性值,那么我們就要重寫從父類繼承來的toString()方法,eclipse中右鍵菜單欄-源碼source-生成generate toString(),他就會根據我們對象的屬性幫我們生成一個toString()方法來輸出屬性值。
equals()方法:
返回值是布爾類型,比較的是對象的引用是否指向同一塊內存地址,對象實例化時,即給對象分配內存空間。
getClass()方法:
可以得到類對象,判斷類型是否一樣-----if (getClass() != obj.getClass())
new出來的是類的對象,關注的是類的屬性的具體的數據;
類對象是類的代碼信息,關注的是類有什么屬性和方法。
六.多態
對象的多種形態。
主要分為 引用多態 、方法多態。
繼承是多態的實現基礎,別忘了子父類要有繼承關系。
多態特性:
引用多態
1.父類引用可以指向本類對象 Animal obj1 = new Animal();
2.父類引用可以指向子類對象 Animal obj2 = new Dog();
但是我們不能用子類的引用指向父類對象 Dog obj3 = new Animal();//錯方法多態
1.在父類Animal中定義一個eat()方法,輸出一個語句(動物有吃的能力); 在子類Dog中重寫eat()方法,輸出一個語句(狗是吃肉的); 那么我們在測試類main函數里面,如果obj1.eat() ,那么調用的是父類的方法. 若用obj2調用eat()方法,那么調用的是子類的方法.
2.還有一種情況,比如創建一個繼承父類Animal的子類Cat ,但是Cat里并不重寫繼承的eat()方法. 然后,我們在測試類main函數里創建一個子類對象, Animal obj3 = new Cat(); 然后調用 obj3.eat(); 那么,結果調用的則是子類繼承父類的方法. (輸出結果:動物有吃的能力)
3.最后一種特殊情況,多態的特性是不能使用的. 若在子類添加一個獨有的方法 public void watchDoor() ,含有一句輸出語句(狗具有看門的能力); 那么我們在測試類的main函數當中(得先定義好對象Animal obj2 = new Dog() ),就不能用obj2.watchDoor(),即不能通過父類的引用調用子類的方法.
引用類型轉換:
- 向上類型轉換(隱式/自動類型轉換),是小類型到大類型的轉換。
如:
Dog dog=new Dog();
Animal animal=dog;//正確,自動類型提升,向上類型轉換
- 向下類型轉換(強制類型轉換),是大類型到小類型的轉換(存在風險,溢出)
如:
Dog dog1=(Dog)animal;//向下類型轉換
- instanceof運算符,來解決引用對象的類型,避免類型轉換的安全性問題。如:
Dog dog=new Dog();
Animal animal=dog;
Cat cat=(Cat)animal;//編譯時不會出錯(按Cat類型進行編譯),但運行時會報錯
因為它開辟的是Dog類型的空間,而(無法將引用類型進行轉換)無法將dog對象轉換成Cat類型,并且此方法對程序的安全性有影響。此時應該利用instanceof和if語句結合使用,進行驗證,以保證程序的安全性,如:
if(animal instanceof Cat){//判斷animal類中是否包含Cat類型的元素,若包含則進行轉換,instanceof返回值為布爾類型
Cat cat=(Cat)animal;
}else{
System.out.println("無法進行類型轉換");
}
抽象類
- 語法定義:
抽象類錢使用abstract關鍵字修飾,則該類為抽象類。 - 應用場景:
a、在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法
b、從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免了子類設計的隨意性。 - 作用:
限制規定子類必須實現某些方法,但不關注實現細節。 - 使用規則:
a. abstract定義抽象類
b. abstract定義抽象方法,只有聲明,不需要實現
c. 包含抽象方法的類是抽象類
d. 抽象類中可以包含普通的方法,也可以沒
現有Shape圖形類,用Rectangle矩形和Circle圖形子類,求圖形的周長和面積。
代碼實現:
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 關鍵字。
類是一種具體實現體,而接口定義了某一批類所需要遵守的規范,接口不關心這些類里方法的實現細節
,它只規定這些類里必須提供某些方法。
使用接口:
一個類可以實現一個或多和接口,實現接口使用implements關鍵字。java中一個類只能繼承一個父類,可以通過實現多個接口作補充。
繼承父類實現接口的語法:
[修飾符] class 類名 extends 父類 implements 接口1,接口2……{
類體部分
}//如果繼承的是抽象類,需要實現繼承的抽象方法;要實現接口中的抽象方法
如果要繼承父類,繼承父類必須在實現接口之前,接口命名時首字母為I,以區分類名??赏ㄟ^add繼承父接口。
接口的使用還經常與匿名內部類配合。(匿名內部類就是沒有名字的內部類,多用于關注實現而不關注實現類的名稱)
語法格式:
Interface i=new Interface(){
public void method(){
System.out.print("匿名內部類實現接口的方式……");
}
} //即通過創建接口的對象,直接寫出實現的方法,再調用此方法
還可以直接創建并調用方法,如:
new IPlay(){
public void playGame(){
System.out.println("……");
}
}.playGame();
八.UML
- Unified Modeling Language,統一建模語言/標準建模語言,是支持模型化和軟件系統開發的圖形化語言;是一個支持模型化和軟件系統開發的圖形化語言;為軟件開發的所有階段提供模型化的可視化支持
- 用例圖:可視化表達系統如何滿足業務規則和特定的用戶需求;
- 序列圖:表述計算機角色和相互關系,按照交互發生的順序顯示對象之間的交互;
- 類圖/類別圖:描述類之間的關系,類中的屬性和方法;
- UML類圖、業務邏輯和所有支持結構一同被用于定義全部的代碼結構。
- UML建模工具:如Visio、Rational Rose、PowerDesiner