JavaSE之面向物件程式設計—類與物件(上)—— 3
一、private實現封裝處理和構造方法(匿名物件)
1.private實現封裝處理
封裝是java的一大特性,private只是為實現封裝處理做了一個鋪墊。我們之所以存在封裝是因為封裝可以是我們的程式更加的有序,更加的安全private它表示私有化,它可以幫助我們實現面向物件的這一特性。
例子:無封裝的程式
class Person2{ String name; int age; public static void main(String[] args){ //建立物件1 Person2 per1 = new Person2(); per1.name="張三"; per1.age=14; //建立物件2 Person2 per2 = per1; per1.name="李四"; per1.age=15; } }
通過在本類直接建立物件,訪問這個物件的屬性、方法。顯然這種方法可以讓外部看見我們的資訊,所以我們要回避這種方法,為了讓外部在操作的時候不可見,我們就使用private進行封裝。
對private修飾過的屬性表示私有的,外部是不可以直接訪問的,需要通過我們的getter、setter方法進行訪問。
*setter:主要用於進行屬性內容的設定與修改,外部需要給值給內部,讓它修改,所以函式是含參函式,但是不需要返回值,只要修改就好啦,所以函式型別為void。
*getter:主要用於屬性內容的取得,要給外部返回內部的屬性值,所以需要return 語句,所以函式的型別應該是對應屬性的型別,但是不需要返回值,所以引數個數為0。
栗子:
public class Person{ private String name; private int age; private String secret; private String gender; //java 類的屬性 //getter get***() --->***屬性名稱 //封裝 String getName(){ return name; } int getAge(){ return age; } String Gender(){ return gender; } String getSecret(){ return secret; } void setName(String name){ this.name=name; } void setAge(int age){ this.age=age; } void setGender(String gender){ this.gender=gender; } void setSecret(String secret){ this.secret=secret; } String personInfo(){ return "這個人叫"+name+",年齡"+age+",性別"+gender; } public static void main(String[] args){ //物件1 Person person = new Person("jack","男");//建立物件 //對物件屬性進行賦值 //setter person.setAge(21); //person類的secret保護,封裝 //外部程式要訪問 封裝的屬性 通過提供方法訪問 System.out.println(person.getSecret());//為String的預設值 //getter System.out.println(person.getName()); System.out.println(person.personInfo()); } }
通過封裝以後我們可以看到,通過private實現封裝以後,程式的最大變化在於:只允許本類訪問,不允許外部類訪問。
*類的設計原則
(1)類的所以有屬性都用private封裝;
(2)屬性要被外部訪問的時候,必須定義setter、getter方法。
2.構造方法與匿名物件
(1)建立物件:
類名 物件名 = new 類名();
在建立物件的時候:
a.任何物件都應該有其對應的類,類是物件的藍圖;
b.這個物件是一個唯一的標記,引用一塊堆記憶體;
c.表示開闢新的堆空間;
d.構造方法
(2)構造方法的定義
構造方法就是使用關鍵字new實力化新物件時呼叫的方法。就是為了在堆記憶體中開闢一塊記憶體來放這個類的屬於這個物件特有的屬性。
我們在定義構造方法的時候也得遵守以下規則:
a.方法名稱必須與類名相同;
b.構造方法沒有返回值型別宣告;
c.每一個類中至少有一個構造方法,這樣才可以建立物件,開闢堆記憶體。如果我們沒有明確定義,那麼系統會自動的給我們建立一個無參建構函式;但如果我們已經定義了,那麼系統將不再給我們建立這個無參構造。
問題:構造方法無返回值,為什麼不用void宣告?
答:void不代表沒有返回值,只是代表返回值為空(可以寫return語句),不用void表示構造方法返回自己(物件)。
注意:
*屬性是在物件開闢堆記憶體時開闢的空間;
*構造方法是在使用new後呼叫的;
*普通方法是在空間開闢了、構造方法執行之後可以多次呼叫的。
栗子:使用構造方法設定物件屬性
public class Car{
//屬性
private String color; //顏色
private int id; //車牌號
private int price; //價格
public Car(String color,int id,int price){
this color = color;
this.id = id;
this.price=price;
}
//Car類的方法--》行為
//注意:在類裡面的方法不應該定義為私有的,因為如果方法定義為私有的就沒有辦法訪問了
//那定義這個方法的意義就沒有了。但是屬性不一樣。屬性可以定義為私有的,私有的屬性可以通過
//公有的方法進行訪問。
void khapTronPai(){
System.out.println("向前開");
}
String carInfo(){
return "這個車的顏色是:"+color+"車牌號為:"+id+"價格是:"+price;
}
//封裝
//用getter對屬性進行封裝,得到某個類的私有屬性;get是得到,那麼就有返回值
//get函式是返回值,那麼只需要函式沒有引數
String getcolor(){
return color;
}
int getid(){
return id;
}
int price(){
return price;
}
//set函式是為了給相應的屬性傳值,對建立物件時已經賦值的屬性進行修改
//那麼它不需要返回值但需要引數進行傳遞
//因為時在當前類裡面的所以就算是私有屬性也可以通過this進行訪問。
void setcolor(String color){
this.color=color;
}
void setid(int id){
this.id=id;
}
void setprice(int price){
this.price=price;
}
public static void main(String[] args){
Person person3 = new Person("李四","女",28,"???");
System.out.println(person3.personInfo());
}
}
構造方法的呼叫和物件記憶體分配幾乎是同步完成的,因此我們可以利用構造方法來類中的屬性進行初始化(可以避免多次呼叫setter)
3.構造方法過載:引數型別、個數不同
栗子:
public class Person{
private String name;
private int age;
private String secret;
private String gender;
//構造方法過載
//構造方法
//方法名:和類名一樣
//返回值:無
//根據實際生活一個人需要有一些必要的屬性,所以無參構造不應該有
// public Person(){
// }
public Person(String name,String gender){
this.name=name;
this.gender=gender;
}
public Person(String name,String gender,int age){
this(name,gender);//this這個方法的呼叫必須放在構造方法中的第一條語句
this.age=age;
}
public Person (String name,String gender,int age,String secret){
this(name,gender,age);
this.secret=secret;
}
//物件1
Person person = new Person("jack","男");//建立物件
}
//物件叫person2
Person person2 = new Person("張三","男",21);
//Person person3 = new Person("李四","女",28,"???");
Person person3 = new Person("李四","女",28);
person3.setSecret("???");
System.out.println(person.personInfo());
System.out.println(person2.personInfo());
System.out.println(person3.personInfo());
注意:
(1)構造方法的過載是為了創建出更多不同的物件;
(2)在構造方法很多的時候,最好按照引數個數進行升序排序;
(3)進行類定義時良好的程式碼風格:定義屬性——》定義構造方法——》定義普通方法。
4.匿名物件
定義:匿名物件就是在棧上沒有具體存放它地址的變數,沒有指向它的,所以它使用一次以後就變為垃圾空間了,等到GC定期清理的時候就將它清理掉。好處是用完即釋放。
栗子:
public class TestPerson{
public static void main(String[] args){
//建立匿名物件
System.out.println(new Person("Alice","女",18).personInfo());
}
}