閱讀本文你將:
- 掌握類的定義方式以及物件的實體化
- 掌握類中的成員變數和方法的使用
- 掌握物件的整個初始化程序
全文目錄
- 類和物件
- 1.類和物件的初步認識
- 2.類和類的實體化
- 3.類的成員
- 3.1欄位/屬性/成員變數
- 3.2 成員方法
- 3.3 static 關鍵字
- 4. 封裝
- 4.1 private實作封裝
- 4.2 getter和setter方法
- 5.構造方法
- 6. toString方法
- 7.匿名物件
類和物件
1.類和物件的初步認識
在談類和物件之前,我們先來了解幾個概念,
面向程序:注重的是程序,在整個程序中所涉及的行為,就是功能
面向物件:注重的是物件,也就是參與程序所涉及到的主體,是通過邏輯將一個個功能實作連接起來
C語言是面向程序的,關注的是程序,分析出求解問題的步驟,通過函式呼叫逐步解決問題,
JAVA是基于面向物件的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成,
舉個洗衣服的栗子:
如果是面向程序:1.打開洗衣機 2.把洗衣液和衣服放進洗衣機 3.選擇模式 4.啟動洗衣機
如果是面向物件:我們只需要呼叫洗衣機這個物件即可完成,洗衣機具體是怎么實作洗衣服程序的我們不必關心,
因為從打開洗衣機到啟動洗衣機的整個流程都是對洗衣機的操作,是洗衣機的行為,洗衣機就是一個物件,所以只要操作洗衣機所具備的功能,都要定義在洗衣機中,
面向物件的概念:
1.面向物件是思考問題的一種思考方式,是一種思想,比如:概念與實體,理論與實踐,名和實等等,,
2.類就是一類物件的統稱,物件就是這一類具體化的一個實體,
3.面向物件的好處:將復雜的事情變簡單了,只要面對一個物件就行,
面向物件設計:
面向物件設計把握一個重要的經驗:誰擁有資料,誰對外提供操作這些資料(私有)的方法! (被動的一方是資料的擁有者,主動的一方是執行者)
開發時:找物件,建物件,用物件,并維護物件之間的關系,
總之,面向物件就是用代碼(類)來描述客觀世界的事物的一種方式. 一個類主要包含一個事物的屬性和行為
2.類和類的實體化
類就是一類物件的統稱,物件就是這一類具體化的一個實體,
舉個栗子:設計房屋的圖紙就是一個類,通過圖紙建造出來的房子就是一個物件,或者叫做一個實體,很顯然一張圖紙可以建造出多個房子,也就是說一個類可以實體化多個物件,
宣告一個類就是創建一個新的資料型別,而類在java中屬于參考型別,java使用關鍵字class來宣告類,
基本語法
//創建類
class 類名 {
field;//成員屬性
method;//成員方法
}
//實體化物件
類名 物件名 = new 類名();
class Person{
public String name;//成員屬性
public int age;
//成員方法
public void eat(){
System.out.println("就知道吃!");
}
public void sleep(){
System.out.println("就知道睡!");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();//new 實體化一個物件
Person person1 = new Person();
Person person2 = new Person();//可以實體化多個物件
person.eat();//呼叫成員方法
person.sleep();
System.out.println(person.age);//呼叫成員屬性
System.out.println(person.name);
}
}
注意事項:
- new 關鍵字用于創建一個物件的實體.
- 使用 . 來訪問物件中的屬性和方法.
- 同一個類可以創建對個實體
3.類的成員
類的成員可以包含以下:欄位(屬性)、方法、代碼塊、內部類和介面等,此處我們重點介紹前三個,
3.1欄位/屬性/成員變數
欄位也可以叫屬性或成員變數,可以理解為一個類中的引數,比如一個Person 類,身高、年齡、性別、姓名這些都是人的基本資料資訊,每個人都不一樣;而成員方法則是人的一些功能或者說行為,比如每個人都會吃飯、睡覺等,
class Person{
public String name;
public int age;
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();//new 實體化一個物件
System.out.println(person.age);//呼叫成員屬性
System.out.println(person.name);
}
}
輸出結果:
0
null
這里需要注意的是,如果成員變數沒有賦值,呼叫時會默認為初始值,
默認值規則:
- 對于各種數字型別, 默認值為 0.
- 對于 boolean 型別, 默認值為 false
- 對于參考型別(String, Array, 以及自定制類), 默認值為 null
理解null
null 在 Java 中為 “空參考”, 表示不參考任何物件. 類似于 C 語言中的空指標. 如果對 null 進行 . 操作就會引發例外.
也可以定義成員屬性時賦值,但不推薦,
class Person{
public String name = "張三";
public int age = 18;
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();//new 實體化一個物件
System.out.println(person.age);//呼叫成員屬性
System.out.println(person.name);
}
}
輸出結果:
18
張三
3.2 成員方法
前面說了,方法就是描述物件的行為,
class Person{
public void eat(){
System.out.println(age+"歲的"+name+"就知道吃!");
}
public void sleep(){
System.out.println(age+"歲的"+name+"就知道睡!");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.name = "你";
person.age = 18;
person.eat();
person.sleep();
}
}
輸出結果:
18歲的你就知道吃!
18歲的你就知道睡!
這樣的 eat 和 sleep 方法是和 person 實體相關聯的. 如果創建了其他實體, 那么 它們 的行為就會發生變化,除非你賦值都一樣,
3.3 static 關鍵字
1、修飾屬性
2、修飾方法
3、代碼塊
4、修飾類
a) 修飾屬性
Java靜態屬性和類相關, 和具體的實體無關,換句話說, 同一個類的不同實體共用同一個靜態屬性,
class Person{
public String name;
public int age;
public static int count;
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.age++;
System.out.println(person.age);
Person.count++;
System.out.println(person.count);
System.out.println("===================");
Person person1 = new Person();
person1.age++;
System.out.println(person1.age);
Person.count++;
System.out.println(person1.count);
}
}
輸出結果:
1
1
===================
1
2
我們可以看到,count 的值并不會因為新創建了物件而初始值變為0,而是原來的1,也就是說靜態成員變數,和類相關,和具體的實體無關,所以我們是可以直接用類名訪問的,而不需要創建一個物件,
public class TestDemo {
public static void main(String[] args) {
Person.count = 1;
System.out.println(Person.count);
}
}
輸出結果:
1
b) 修飾方法
如果在任何方法上應用 static 關鍵字,此方法稱為靜態方法.
- 靜態方法屬于類,而不屬于類的物件,
- 可以直接呼叫靜態方法,而無需創建類的實體,
- 靜態方法可以訪問靜態資料成員,并可以更改靜態資料成員的值
class Test{
public int a ;
public static int count;
public static void change(){
count = 100;
//a = 100;靜態方法里,不可定義非靜態成員變數,否則會報錯
}
}
class Main{
public static void main(String[] args) {
Test.change();//用類名直接呼叫靜態方法,不用創建實體
System.out.println(Test.count);
}
}
注意事項1:
靜態方法和實體無關, 而是和類相關. 因此這導致了兩個情況:
- 靜態方法不能直接使用非靜態資料成員或呼叫非靜態方法(非靜態資料成員和方法都是和實體相關的).
- this和super兩個關鍵字不能在靜態背景關系中使用(this 是當前實體的參考, super是當前實體父類實體的參考, 也是和當前實體相關).
注意事項2 - 我們曾經寫的方法為了簡單, 都統一加上了 static. 但實際上一個方法具體要不要帶 static, 都需要是情形而定.
- main 方法為 static 方法.
為什么main 方法為 static 方法?
是因為main方法是Java解釋器呼叫的,那時候還沒有任何物件產生,沒辦法用物件呼叫,只能用類呼叫,不加的話,就好比你建了一棟房子,但是沒有門,進不去里面,static就相當于那個門,加上程式才能往后面運行下去,
4. 封裝
什么叫封裝?
<<代碼大全>> 開篇就在討論一個問題: 軟體開發的本質就是對程式復雜程度的管理. 如果一個軟體代碼復雜程
度太高, 那么就無法繼續維護. 如何管理復雜程度? 封裝就是最基本的方法.
在我們寫代碼的時候經常會涉及兩種角色: 類的實作者和類的呼叫者.
封裝的本質就是讓類的呼叫者不必太多的了解類的實作者是如何實作類的, 只要知道如何使用類就行了.
這樣就降低了類使用者的學習和使用成本, 從而降低了復雜程度
4.1 private實作封裝
private/ public 這兩個關鍵字表示 “訪問權限控制” ,
被 public 修飾的成員變數或者成員方法, 可以直接被類的呼叫者使用,
被 private 修飾的成員變數或者成員方法, 不能被類的呼叫者使用,
換句話說, 類的使用者根本不需要知道, 也不需要關注一個類都有哪些 private 的成員. 從而讓類呼叫者以更低的 成本來使用類
我們可以將成員屬性設定為private,而成員方法設定為public,這樣就可以通過方法來修改屬性值,就不用擔心成員屬性會被更改而引發的麻煩了,
注意事項
private 不光能修飾欄位, 也能修飾方法 通常情況下我們會把欄位設為 private 屬性, 但是方法是否需要設為 public,
就需要視具體情形而定. 一般我們希 望一個類只提供 “必要的” public 方法, 而不應該是把所有的方法都無腦設為 public
4.2 getter和setter方法
class Person1{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class TestDemo1 {
public static void main(String[] args) {
Person1 person = new Person1();
person.setAge(18);
person.setName("wenan");
System.out.println(person.getAge());
System.out.println(person.getName());
}
}
輸出結果:
18
wenan
注意事項
- getName 即為 getter 方法, 表示獲取這個成員的值.
- setName 即為 setter 方法, 表示設定這個成員的值
- 當set方法的形參名字和類中的成員屬性的名字一樣的時候,如果不使用this, 相當于自賦值. this 表示當前實體的參考.
- 不是所有的欄位都一定要提供 setter / getter 方法, 而是要根據實際情況決定提供哪種方法.
- 在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法. 在VSCode 中可以使用滑鼠右鍵選單 -> 源代碼操作 中自動生成 setter / getter 方法
5.構造方法
構造方法是一種特殊方法, 使用關鍵字new實體化新物件時會被自動呼叫, 用于完成初始化操作,
new 執行程序:
- 為物件分配記憶體空間
- 呼叫物件的構造方法
語法規則:
- 方法名稱必須與類名稱相同
- 構造方法沒有回傳值型別宣告
- 每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造)
class Person1{
private String name;
private int age;
public Person1(){
System.out.println("不帶引數的構造方法");
}
public Person1(String name){
this.name = name;
System.out.println("帶1個引數的構造方法");
}
public Person1(String name,int age){
this.name = name;
this.age = age;
System.out.println("帶2個引數的構造方法");
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
public class TestDemo1 {
public static void main(String[] args) {
Person1 p1 = new Person1();//呼叫不帶引數的建構式 如果程式沒有提供會呼叫不帶引數的建構式
p1.show();
Person1 p2 = new Person1("zhangfei",80);//呼叫帶有2個引數的建構式
p2.show();
}
}
輸出結果:
不帶引數的構造方法
name: null age: 0
帶2個引數的構造方法
name: zhangfei age: 80
6. toString方法
我們剛剛注意到,我們在把物件的屬性進行列印的時候,都自己實作了show函式,其實,我們大可不必,我們可以使用 toString 這樣的方法來將物件自動轉成字串,
class Person1{
private String name;
private int age;
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class TestDemo1 {
public static void main(String[] args) {
Person1 person1 = new Person1();
System.out.println(person1);
}
}
輸出結果:
Person1{name=‘null’, age=0}
注意事項:
- toString 方法會在 println 的時候被自動呼叫.
- 將物件轉成字串這樣的操作我們稱為 序列化.
- toString 是 Object 類提供的方法, 我們自己創建的 Person 類默認繼承自 Object 類, 可以重寫
toString 方法實作我們自己版本的轉換字串方法. - @Override 在 Java 中稱為 “注解”, 此處的 @Override 表示下面實作的 toString方法是重寫了父類的方法.
- IDEA快速生成Object的toString方法快捷鍵:alt+f12(insert)
7.匿名物件
- 匿名只是表示沒有名字的物件.
- 沒有參考的物件稱為匿名物件.
- 匿名物件只能在創建物件時使用.
- 如果一個物件只是用一次, 后面不需要用了, 可以考慮使用匿名物件
class Person1{
private String name;
private int age;
public Person1(String name,int age) {
this.age = age;
this.name = name;
}
public void show() {
System.out.println("name:"+name+" " + "age:"+age);
}
}
public class TestDemo1 {
public static void main(String[] args) {
new Person1("caocao",19).show();//通過匿名物件呼叫方法
}
}
輸出結果:
name:caocao age:19
本文結束,以上內容既是對你的分享,也是對我的總結,碼字不易,如果可以,點個贊再走可好?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/279581.html
標籤:java
上一篇:深入淺出Java包裝類
