對象是事物存在的實體,通常又會將對象劃分為兩個部分,對象的屬性和對象的行為
類就是一類事物的總稱,如果將某個事物抽象為對象,那麼類就是這個對象的總稱
xx類-----實例化------->xx對象
類是封裝對象的屬性和行為的載體,對象則是類的實例。
封裝
封裝是面向對象編程的核心思想,將對象的屬性和行為封裝起來,對使用者隱藏了數據的實現方式。
使用者只能通過對象的方法與對象數據進行交互,這樣做的好處是當對象的數據方式發生改變時,只要仍然
是使用同樣的方法來操作數據,則對其他的對象不會產生任何影響。
繼承
有時候類與類存在一定的關聯關系,常見的有:依賴(uses-a)、聚合(has-a)、繼承(is-a)。
繼承時is-a的關系,即當子類繼承父類,子類就擁有了父類的屬性和方法,而同時子類又能夠去定義自己
特有的屬性和方法,這樣就能夠復用父類的代碼,縮短開發時間,提高系統性能。
多態
多態指的將父類對象應用於子類的特征,當父類中的某方法在子類中可能都有不同的實現,當用父類去實例化
子類並調用該方法時,只有在運行的時候才能知道調用的具體方法。
4.類的結構
public class Book {
private String name; //成員變量
private String price;//成員變量
/**
* 構造器:
* 構造器與類同名
* 每個類可以有一個以上的構造器
* 構造器可以有0個,1個,1個以上的參數
* 構造器沒有返回值
* 構造器總是伴隨著new操作一起調用
* 當類中沒有構造方法是編譯器會自動創建一個不帶參數的默認構造方法,但如果類中存在有參的構造方法時,編譯就不會去自動創建默認的無參構造方法*/
public Book(){
}
public Book(String name, String price) {
super();
this.name = name;
this.price = price;
}
/**
* 方法
* 權限修飾符 返回值類型 方法名(參數類型 參數名){
* //方法體
* return 返回值;(返回值類型為void時不需要)
* }
* @return
*/
public String getName() {
return name;
}
public void setName(String name) { //name 局部變量 ,方法執行時創建,方法結束時銷毀
this.name = name; //this關鍵字:this引用的是本類的當前對象,this.name引用的是成員變量name
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
6.static關鍵字
static可以用來修飾成員變量和方法,被static修飾的成員變量稱為靜態變量,方法稱為靜態方法。
靜態變量和方法在內存中只有一份,是屬於類的,對象之間共享,通過類名.成員變量或者方法調用。
當成員變量被static和 final 修飾時被稱為靜態常量,常量不能被修改。
由於靜態成員是屬於類的,因此需要注意:
1.靜態方法不能使用this關鍵字
2.靜態方法不能直接調用非靜態方法
3.方法體內的變量不能聲明為static
static還有一個常見的用途就是Factory方法:
NumberFormat per = NumberFormat.getPercentInstance();
NumberFormat cur = NumberFormat.getCurrencyInstance();
double d = 0.2;
System.out.println(per.format(d));//20%
System.out.println(cur.format(d));//¥0.20
Numberformat類使用factory方法產生不同風格的格式對象。
7.方法參數
當調用有參方法時,方法中的參數值是對傳參的值的拷貝。
方法不能修改一個基本類型的參數
方法能夠改變一個對象類型的參數的狀態
方法不能實現讓對象參數引用一個新的對象
public static void main(String[] args) {
//1
int i = 2;
changeValue(2);//方法中x復制了i的值,為2,方法執行結束x=6,但是i的值不變
System.out.println(i);//2
//2
Book b = new Book();
b.setName("Hello");
System.out.println(b.getName());//Hello
changeBookName(b);//方法中book復制了b的引用,因此b和book指向同一個對象。所以調用setName方法之後b的name值發生了改變
System.out.println(b.getName());//Hello,World
//3
Book b1 = new Book("hello","11");
Book b2 = new Book("world","22");
//方法中book1和book2分別復制了b1和b2的引用,方法運行完之後,book1和book2交換了引用地址,
//只能說明方法結束後book1和book2的引用對象發生了改變,並不影響b1和b2的值
switchBook(b1, b2);
System.out.println(b1.getName());//hello
System.out.println(b2.getName());//world
}
public static void changeValue(int x){
x = x*3;
}
public static void changeBookName(Book book){
book.setName(book.getName()+",World");
}
public static void switchBook(Book book1,Book book2){
Book temp = book1;
book1 = book2;
book2 = temp;
}