封裝,this關鍵字,構造器,static關鍵字
封裝:
封裝的目的:提高數據安全性,通過封裝,可以實現對屬性的訪問控制權限控制,同時增加了程序的可維護性。
什麽是封裝?將屬性私有化,使用private關鍵字完成屬性私有化,這種屬性只有本類能訪問。一般對每一個私有屬性提供公共的public的set和get這種方法供外界來訪問私有屬性。
private是私有化的意思,public的權限是所有類都可以訪問具體的封裝實現:
class Cat{ //定義成員變量,也就是屬性,然後進行封裝(定義私有的屬性) private String name; private int age; private doubleweight; //當對封裝過的屬性在別的類中進行調用的時候需要給外部一個方法進行調用和插入值 //定義一個set方法把值賦給對象的屬性 public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public void setWeight(double weight){ this.weight = weight; }//定義一個get方法讓別的類對對象的屬性進行取值 public String getName(){ return name; } public int getAge(){ return age; } public double getWeight(){ return weight; } } //定義一個測試類 classTestCat{ public static void main(String[] args){ //實例化一個對象,對對象的屬性進行調用 //使用set方法對私有屬性進行賦值操作 Cat cat = new Cat(); cat.setName("大黑"); cat.setAge(1); cat.setWeight(0.8); //使用get方法得到私有的屬性值 String name = cat.getName(); int age = cat.getAge(); double weight = cat.getWeight(); System.out.println("姓名:"+name+" 年齡:"+age+" 體重:"+weight); } }
this關鍵字:
this可以在方法內區分同類的類的屬性和參數名,有this的一定是屬性,沒有this的一定是參數名。在上圖代碼中,this.name中的name就是屬性,後面的name是參數,然後把參數值賦給了屬性。
this只能在類的對象方法中使用。this代表當前調用這個方法的對象的本身。如下的代碼,兩個打印出的結果一致:
class Cat{ //定義屬性 int age ; //定義一個方法 public void eat(){ System.out.println(this); } } //定義一個測試類 class TestCat{ public static void main(String[] args){ //聲明一個對象 Cat cat = new Cat(); System.out.println(cat); System.out.println("-----------"); cat.eat(); } }
構造器:
構造器的特點:
1.方法名和類名一致
2.方法沒有返回值,沒有void
3.參數可有可無
構造器的語法:
public 類名(數據類型 參數值,.......){
}
構造器的目的:創建對象。
class Cat{ String name; int age; double weight; //定義一個構造器 public Cat(String name){ this.name = name; } /** *通過this(實參列表)可以調用本類中的構造器,但是對this的調用必須是本類中的 *第一個語句 */ public Cat(String name, int age){ /** *或者直接在第一行使用this關鍵字調用一個參數本類的構造器 this(name); */ this.name = name; this.age = age; } public Cat(String name, int age, double weight){ /** *或者直接在第一行使用this關鍵字調用兩個參數本類的構造器 this(name,age); */ this.name = name; this.age = age; this.weight = weight; } } //定義一個測試類 class TestCat{ public static void main(String[] args){ //調用構造器構造一只貓 Cat cat1 = new Cat("大黑"); System.out.println(cat1.name); System.out.println(cat1.age); System.out.println(cat1.weight); System.out.println("------------------------"); Cat cat2 = new Cat("二黑", 21 ); System.out.println(cat2.name); System.out.println(cat2.age); System.out.println(cat2.weight); System.out.println("------------------------"); Cat cat3 = new Cat("喵喵", 3, 2.1); System.out.println(cat3.name); System.out.println(cat3.age); System.out.println(cat3.weight); System.out.println("------------------------"); } }
註意:如果類中沒有帶有參數的構造器,就可以使用一個隱藏的默認構造器來創建對象,如果一旦有帶有參數的構造器,默認的構造器就會被覆蓋。可以顯式的定義出來默認構造器就可以使用了。
static關鍵字
1.修飾在屬性上
定義類屬性: static 數據類型 變量名
類屬性訪問:
使用類名調用類屬性(推薦使用):類名.類屬性名();
使用對象來調用類屬性(不建議):對象名.類屬性名();
class User{ String username; String password; /** * 類屬性 */ static int userCount; public void introduce(){ System.out.println("用戶名:"+username+" 密碼:"+password); } } class TestUser{ /** 類: 模板 對象: 樣本 */ public static void main(String [] args){ //創建一個user對象 User user = new User(); //把類屬性做加一,類名.類屬性 User.userCount++; //再次創建user對象 User user1 = new User(); //使用類名來調用類屬性(建議) User.userCount++; User user2 = new User(); //使用對象來調用類屬性(不建議這麽用) user2.userCount++; System.out.println("人數:"+User.userCount); } }
類屬性的生命周期:
User.class加載到JVM中時類屬性就產生了,JVM消失時類屬性就消失。(類屬性在數據共享區)
對象屬性:
當對象被創建的時候就產生了,當對象所在的方法執行完畢就會被垃圾回收器回收掉。
static修飾在方法上(類方法或靜態方法)
語法:
public static 返回值類型[void] 方法名(數據類型 參數名,.......){
方法體
return 結果;
}
類方法的調用:
類名.類方法名();(推薦使用)
對象.類方法名();(不推薦使用)
class Cat{ String name; int age; double weight; //定義一個類屬性 static int catCount; /** 對象的方法,每一只貓的實例都可以調用 */ public void eat(){ System.out.println(this.name+"在吃魚"); } /** 類方法 */ public static void sleep(){ System.out.println(catCount+"在睡覺"); } } class TestCat{ public static void main(String[] args){ Cat cat = new Cat(); cat.name = "大黑"; //調用對象的方法 cat.eat(); //使用類名調用類方法 Cat.sleep(); //使用對象名來調用類方法 cat.sleep(); } }
在類方法中不能使用對象的屬性,類方法只能使用類屬性。
封裝,this關鍵字,構造器,static關鍵字