java第四天---類與物件2
1、方法的過載
2、類的構造方法
3、static
4、包
5、許可權修飾符
一、方法的過載
方法的過載要解決的問題:當一個類中存在很多方法時,對開發很不友好,方法名太多太不好記憶。這時候如果能夠讓多個方法的方法名相同,讓引數列表不同,就能實現不同的功能,讓開發者使用時也比較輕鬆。解決這個問題就是方法的過載。
方法過載的特點:
①方法過載是在同一個類中發生的
②方法過載的方法名相同,引數列表不同(可以是引數個數不同,引數型別不同,引數順尋不同)。
③返回值沒有要求,可以相同,可以不同
示例:
View Code二、建構函式
什麼是建構函式?
一個特殊的方法,建構函式存在於類中,作用是建立對像時對其進行初始化,就是為物件中的屬性進行賦值
建構函式的特點:
①函式名和類名相同
②沒有返回值
③沒有static修飾
④建構函式分為有參構造和無參構造,符合方法過載的要求,也就時說可以多個建構函式以滿足不同的初始 化要求。
⑤當類中沒有寫建構函式時,java會預設有個無參的構造方法。但是當你寫了有參構造方法時,這個預設的 無參構造方法就沒有了。我們提議將無參構造方法手寫出來。
示例:
建立一個類:
public class cao {
String color;
int height;
// 無參構造
public cao(){};
// 有參構造
public cao(String color,int height){
/*我們在引數列表中使用的引數名和類的屬性名是相同的,所以我們需要在屬性名前使用
this來對引數名和屬性名進行區分,this指的是當前物件,this.屬性名,就是物件的屬性
*/
this.color=color;
this.height=height;
}
public void instrustor(){
System.out.println("這是"+color+"的草,高為"+height);
}
}
測試類:
public class CaoTest { public static void main(String[] args) { // 使用無參構造建立物件 cao cao = new cao(); cao.height=8; cao.color="黃色"; cao.instrustor(); // 使用有參構造建立物件 cao cao1 = new cao("綠色", 69); cao1.instrustor(); } }View Code
三、static關鍵字
static可以做什麼?
static可以修飾變數,方法,程式碼塊。
靜態變數、靜態方法,靜態程式碼塊。
特點:
①靜態方法只能呼叫靜態變數和靜態方法
②例項方法(除了靜態方法和構造方法)可以呼叫普通成員變數,靜態變數,例項方法,成員方法
③靜態變數和靜態方法通過類直接呼叫:類名.變數/方法名。也可以new物件呼叫,但是不推薦
④被static修飾的變數、方法、程式碼塊都是類的組成,在程式載入時載入,只加載一次
為什麼要使用static關鍵字?
舉個例項大家理解一下,舉一個砍樹的例子,首先宣告,我們要保護環境,保護我們的家園。
目前有50棵樹,由三個伐木工一塊砍伐:
程式碼例項一:第一個例項中,num屬性沒有使用static修飾
public class Rosser { // 樹的數量 int num=50; // 普通類成員變數 int pNum; //人數 public Rosser(){} // 靜態程式碼塊 :此處只為展示靜態程式碼塊的寫法,並無其他意義 // 靜態修飾的各種東西都是在程式載入的時候就載入進記憶體,所以靜態程式碼塊執行的比物件例項化早 static { System.out.println("這是一片樹林"); } // 靜態方法:此處只為展示靜態方法的寫法,所以該方法並無任何實際意義 public static void zhongshu(){ System.out.println("zhognshu"); } public int kanshu(){ return --num; } }View Code
執行結果:
public class ShuTest { public static void main(String[] args) { Rosser rosser1 = new Rosser(); int kanshu = rosser1.kanshu(); System.out.println("伐木工一:還剩"+kanshu+"棵樹"); Rosser rosser2 = new Rosser(); int kanshu2 = rosser2.kanshu(); System.out.println("伐木工二:還剩"+kanshu2+"棵樹"); Rosser rosser3 = new Rosser(); int kanshu3 = rosser3.kanshu(); System.out.println("伐木工一:還剩"+kanshu3+"棵樹"); } } /*控制檯中的執行結果: 這是一片樹林 伐木工一:還剩49棵樹 伐木工二:還剩49棵樹 伐木工一:還剩49棵樹 */View Code
從結果看出,每個伐木工砍過樹之後都是隻剩49棵,這是不符合邏輯的
程式碼示例二:這次使用static修飾num屬性
public class Rosser { // 樹的數量 static int num=50; // 普通類成員變數 int pNum; //人數 public Rosser(){} // 靜態程式碼塊 :此處只為展示靜態程式碼塊的寫法,並無其他意義 // 靜態修飾的各種東西都是在程式載入的時候就載入進記憶體,所以靜態程式碼塊執行的比物件例項化早 static { System.out.println("這是一片樹林"); } // 靜態方法:此處只為展示靜態方法的寫法,所以該方法並無任何實際意義 public static void zhongshu(){ System.out.println("zhognshu"); } public int kanshu(){ return --num; } }View Code
執行結果:
public class ShuTest { public static void main(String[] args) { Rosser rosser1 = new Rosser(); int kanshu = rosser1.kanshu(); System.out.println("伐木工一:還剩"+kanshu+"棵樹"); Rosser rosser2 = new Rosser(); int kanshu2 = rosser2.kanshu(); System.out.println("伐木工二:還剩"+kanshu2+"棵樹"); Rosser rosser3 = new Rosser(); int kanshu3 = rosser3.kanshu(); System.out.println("伐木工一:還剩"+kanshu3+"棵樹"); } } /*控制檯輸出的結果: 這是一片樹林 伐木工一:還剩49棵樹 伐木工二:還剩48棵樹 伐木工一:還剩47棵樹 */View Code
這次的輸出是沒有問題的,符合現實邏輯。
詳解:沒有被static修飾的num屬性,會隨著每次建立物件而初始化,也就導致了每個伐木工的物件的num數量都是50棵。被static修飾的屬性,是類的屬性,在程式載入時載入,早已經存在於記憶體中,不會再隨物件的例項化而例項化,每個物件都是訪問記憶體的同一個num.
四、許可權修飾
什麼是許可權修飾符?
許可權修飾符共四種:private(私有的)、protected(受保護的)、public(公共的)、default
許可權修飾符做什麼使用?
許可權修飾符用來對類、方法、屬性進行修飾,用來控制各個東西的訪問許可權。預設是default.
以下是每個修飾符修飾的東西的作用範圍:
_____________同一類______同一包________同一包的子類________不同包子類_______其他__________
public 可以 可以 可以 可以 可以
protected 可以 可以 可以 不可以 不可以
default 可以 可以 不可以 不可以 不可以
private 可以 不可以 不可以 不可以 不可以