你必須要知道的類和對象的知識點

上一篇:數組的定義與使用(附練習題)

一、類和對象的基本概念

類是用於描述同一類型的對象的一個抽象的概念,類中定義了這一類對象所應具有的靜態和動態屬性。 類可以看成一類對象的模板,對象可以看成該類的一個具體實例。
在這裏插入圖片描述

1、面向過程:如C語言關注的是過程。(小的問題)
面向對象:如JAVA關注的是對象。C++也是面向對象的語言,go 語言不是。
面向對象分爲:找對象、創建對象、適用對象。(問題規模較大的)
OOP:Object-Orirnted-Project 面向對象的語言
OOP語言的三大特徵是繼承、封裝、多態。JAVA屬於OOP語言

2、類和類的實例化
i)、 類就是一類對象的統稱。相當於高配的結構體,自定義的類型。類相當於一個模板,對象是由模板產生的樣本。一個類可以實例化(new)多個對象對象。
ii)、 一般一個.java文件當中,只需要建一個類就好。一個類生成一個class文件

3、創建類

// 創建類
 class 類名{      
	   		field;    //成員屬性:定義在類的內部,在方法的外部
類體 :      method;  //成員行爲:方法
 } 
 // 實例化對象 = new ();

{ }中爲類的主體。
類中的元素稱爲:成員屬性。類中的函數稱爲:成員方法

屬性(又叫成員變量):實例數據成員(屬於對象),靜態數據成員(訪問通過 類名.靜態數據成員)
方法(又叫成員方法):實例成員方法,靜態成員方法

class Person {
    public String name = "蓋蓋";
    public int age = 10;
    public static int count = 100;

    public void eat() {
               System.out.println("喫飯");
    }
    public void sleep() {
        System.out.println("睡覺");
    }
    public void show() {
        System.out.println("name: "+ name +" age: "+age);
    }

}

public class TestDemo {
    public static void main(String[] args) {
        //實例化一個對象   new
        Person person1 = new Person();
        System.out.println(person1.name);
        System.out.println(person1.age);
	    System.out.println(Person.count);

        }
}

注意:
·靜態的數據成員和方法,只需要通過類名進行訪問和調用
·靜態的數據成員和方法不依賴於對象
·和之前寫的方法不同, 此處寫的方法不帶 static 關鍵字
·new 關鍵字用於創建一個對象的實例.
·使用 . 來訪問對象中的屬性和方法.
·同一個類可以創建多個實例

4、類的成員
類的成員可以包含以下:字段(屬性)、方法、代碼塊、內部類和接口等
1)代碼塊分爲
靜態代碼塊:靜態的優先於實例代碼塊執行,只執行一次
實例代碼塊:是優先於構造方法執行的。常用來初始化實例數據成員
本地代碼塊:方法內部 但不常用
同步代碼塊

·執行順序:靜態的先執行——》實例的後執行——》構造方法執行 與寫的前後順序無關
·靜態代碼塊和靜態數據成員與順序有關。實例也是
2)內部類分爲
靜態內部類,實例內部類,本地內部類,匿名內部類

3)字段 (field)
使用 . 訪問對象的字段. “訪問” 既包含讀, 也包含寫.

*對於一個對象的字段如果沒有顯式設置初始值, 那麼會被設置一個默認的初值.
默認值規則:對於簡單類型, 默認值爲 0.
對於 boolean 類型, 默認值爲 false.
對於引用類型(String, Array, 以及自定製類), 默認值爲null

*null 在 Java 中爲 “空引用”, 表示一個無效的對象. 類似於 C 語言中的空指針. 如果對 null 進行 . 操作就會引發異常

4)方法 (method)
方法中還有一種特殊的方法稱爲 構造方法 (construction method) 在實例化對象的時候會被自動調用到的方法, 方法名字和類名相同, 用於對象的初始化

5)static 關鍵字

a) 修飾屬性,Java靜態屬性和類相關, 和具體的實例無關. 換句話說, 同一個類的不同實例共用同一個靜態屬性
b) 修飾方法 如果在任何方法上應用 static 關鍵字,此方法稱爲靜態方法。

·靜態方法屬於類,而不屬於類的對象。
· 可以直接調用靜態方法,而無需創建類的實例。
· 靜態方法可以訪問靜態數據成員,並可以更改靜態數據成員的值
·靜態方法和實例無關, 而是和類相關. 因此在靜態方法內,不允許訪問實例數據成員,不允許調用實例成員方法,不依賴對象(不能直接訪問,可以間接)

注意事項1:
this和super兩個關鍵字不能在靜態上下文中使用(this 不是當前對象而是當前對象的引用, super是當前實例父類實例的引用, 也 是和當前實例相關).
要習慣使用this。 Idea中按住alt+insert,或者自定義快捷鍵

注意事項2:
曾經寫的方法爲了簡單, 都統一加上了 static. 但實際上一個方法具體要不要帶 static, 都需要是情形而定. main 方法爲 static 方法

二、面向對象的編程思想

1、什麼是面向對象?
面向對象程序設計的基本思想是將現實中的事物抽象爲對象,抽象出來的對象被賦予相應的狀態和行爲,通過對消息的響應完成一定的任務。對象都具有以下兩個共性:具有一定的狀態(形態)和特性,如電視機有尺寸、外形、顏色等外部特性。
每個對象對應一組特定的操作,如電視機有開關,選擇頻道等操作.
例如:汽車作爲對象,汽車的形態有車的類型(轎車、卡車、三輪車…),款式、掛檔方式(自動擋,手動擋),排量大小;汽車的行爲有制動,加速,減速…

2、抽象
Java的核心是面向對象編程,面向對象編程的一個實質性的要素就是抽象,人們通過抽象來處理複雜性。

3、面向對象編程的3個原則

封裝
是將代碼及其處理的數據捆綁在一起的一種編程機制,該機制保證了程序和數據都不受外部干擾且不被誤用。封裝的本質是讓類的調用者不必太多的瞭解類的實現者是如何實現類的,只要知道如何使用類就行了,這樣就降低了類使用者的學習和使用成本,從而降低了複雜程度。
封裝就像是一個飛機的黑匣子(保護數據),它可以阻止在外部定義的代碼隨意訪問內部代碼和數據。對黑匣子內代碼和數據的訪問時通過一個適當定義的接口嚴格控制。

體現封裝性:private,被 private所修飾的屬性或者方法均不能在類外進行訪問或者調用

private/ public 這兩個關鍵字表示 “訪問權限控制” . 被 public 修飾的成員變量或者成員方法, 可以直接被類的調用者使用. 被 private 修飾的成員變量或者成員方法, 不能被類的調用者使用。Private 訪問修飾限定符

***直接使用public:

 public class Person { 
 	public String name = "張三"; 
	 public int age = 18;
  } 
  class Test { 
	  public static void main(String[] args) {
 		  Person person = new Person(); 
  		  System.out.println("我叫" + person.name + ", 今年" + person.age + "歲"); 
      } 
  }
 // 執行結果 我叫張三, 今年18歲 

這樣的代碼導致類的使用者(main方法的代碼)必須要瞭解 Person 類內部的實現, 才能夠使用這個類. 學習成本較 高 一旦類的實現者修改了代碼(例如把 name 改成 myName), 那麼類的使用者就需要大規模的修改自己的代碼, 維 護成本較高.

***使用 private 封裝屬性, 並提供 public 方法供類的調用者使用.

class Person {
	 private String name = "張三"; 
	 private int age = 18; 
	 public void show() {
	 	 System.out.println("我叫" + name + ", 今年" + age + "歲"); 
	 }
 }
  class Test {
  	 public static void main(String[] args) { 
  	 	Person person = new Person(); person.show(); 
  	 }
}
 // 執行結果 我叫張三, 今年18歲 

此時字段已經使用 private 來修飾. 類的調用者(main方法中)不能直接使用. 而需要藉助 show 方法.如果類的實現者修改了字段的名字, 類的調用者不需要做出任何修改(類的調用者根本訪問不到 name, age 這樣的字段)

類的實現者如果修改了 public 方法 show 的名字, 那麼類的調用者仍然需要大量修改代碼 。但是一般很少會發生. 一般類的設計都要求類提供的 public 方法能比較穩定, 不應該頻繁發 生大的改變. 尤其是對於一些基礎庫中的類, 更是如此. 每次接口的變動都要仔細考慮兼容性問題.

注意事項: private 不光能修飾字段, 也能修飾方法 通常情況下我們會把字段設爲 private 屬性, 但是方法是否需要設爲 public, 就需要視具體情形而定. 一般我們希 望一個類只提供 “必要的” public 方法, 而不應該是把所有的方法都設爲 public

繼承
是一個對象獲得另一個對象屬性的過程。

如下圖理解:
在這裏插入圖片描述
1、public class Cat//子類,派生類 extends Animal//父類,基類,超類
繼承的作用:爲了代碼的複用。
2、繼承到底繼承了父類的什麼東西?
除構造函數外的所有
子類繼承了父類,子類需要幫助父類來進行構造
3、super (name);顯示的調用父類的構造方法——》幫助父類來進行構造
必須放在方法的第一行,因爲子類構造的時候,需要先構造父類
子類繼承了父類,
4、靜態的永遠先執行
5、protected
如果把字段設爲 private, 子類不能訪問. 但是設成 public, 又違背了我們 “封裝” 的初衷. 兩全其美的辦法就是 protected 關鍵字
6、多繼承
因爲java是單繼承語言,所以java每次只能繼承一個類。
7、 final 可以修飾一個變量,也可以修飾類
eg:

 final int a = 10;    //常量
final class A {}    密封類

一旦一個類被final所修飾,那麼就不能被繼承了

多態
是允許一個接口被多個通用的類動作使用的特性,具體使用哪個動作與應用場合有關,多態的概念常被說成是:“一個接口,多種方法”。
拿狗狗比喻,一條狗的嗅覺是多態的,如果狗聞到了貓的氣味,它會叫並且追着它跑,如果聞到了食物的氣味,他將分泌唾液並向剩着食物的碗跑去,兩種狀況是同一種嗅覺器官在工作,差別在於聞到了聲明氣味,也就是說兩種不同類型的數據作用於狗鼻子。

1、父類引用 引用子類的對象 向上轉型
父類的引用只能調用自己的方法或者訪問自己的屬性
2、向上轉型所發生的時機?
I)直接賦值
Ii)參數傳遞
Iii)方法返回值
3、儘量不要向下轉型
向下轉型的條件是:父類已經引用了子類(向下轉型後的類型)的對象

三、給數據成員初始化的方式

1、提供一系列的get set方法
2、構造函數(作用:用來產生對象的)
函數名和類名相同,沒有返回值

問:生成一個對象共有幾步?
兩步: i)給對象分配內存
ii)調用合適的構造方法 ,構造方法不止一個

getter和setter方法
當我們使用 private 來修飾字段的時候, 就無法直接使用這個字段了

注意事項: getName 即爲 getter 方法, 表示獲取這個成員的值. setName 即爲 setter 方法, 表示設置這個成員的值. 當set方法的形參名字和類中的成員屬性的名字一樣的時候,如果不使用this, 相當於自賦值. this 表示當前實例 的引用. 不是所有的字段都一定要提供 setter / getter 方法, 而是要根據實際情況決定提供哪種方法. 在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法. 在 VSCode 中可以使用鼠標右鍵 菜單 -> 源代碼操作 中自動生成 setter / getter 方法

構造方法
構造方法是一種特殊方法, 使用關鍵字new實例化新對象時會被自動調用, 用於完成初始化操作.

*new 執行過程 爲對象分配內存空間 調用對象的構造方法語法規則
1.方法名稱必須與類名稱相同
2.構造方法沒有返回值類型聲明
3.每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造)
注意事項 :
·如果程序沒有提供任何的構造方法,那麼編譯器會默認生成一個不帶有參數的構造方法
·默認的不帶有參數的構造方法,只有一種情況下才會產生,即什麼構造方法都沒有。
·構造方法可以發生重載,即函數名相同,參數不同(類型個數)返回值不要求

·this關鍵字 this表示當前對象引用(注意不是當前對象). 可以藉助 this 來訪問對象的字段和方法
This.成員變量
This.成員方法
This();//調用構造方法 必須放在第一行 只能調用一個構造函數

如果當前類沒有重寫object 的toString方法,那麼當調用System.out.println()的時候,會默認調用object 的toString方法。
如果當前類重寫了object 的toString方法,那麼就會調用重寫的方法。
想打印可以直接alt+insert找到toString方法

7、匿名對象
匿名只是表示沒有名字的對象. 沒有引用的對象稱爲匿名對象. 匿名對象只能在創建對象時使用. 如果一個對象只是用一次, 後面不需要用了, 可以考慮使用匿名對象

四、 包

1、 包 :本質上就是用文件夾來管理java文件的。
包是有規範的;包的命名一般全都是小寫;
一半是倒着寫的。
Eg:

 www.baidu.com——》com.baidu(公司名字).www
 //可以用拼音com.xiyou.www

2、 如果有包。如何在命令框底下去編譯?
在代碼里加上package com.路徑
編譯的時候路徑是反斜槓\;運行的時候是點號.
3、 JVM在哪裏啓動的?
一般都是默認的,在哪裏運行就在哪裏啓動
4、 java.util底下放的都是工具類
5、 當一個java class裏有多個java.util,可合併在一起,即導入util底下所有的包。
Eg:

import java.util.Date;
import java.util.Arrays;
//可合併簡寫如下:
import java.util.*;

Java.lang包底下的所有東西,全部不需要自己導入,編譯器會自動導入java.lang
6、 訪問權限:public , private , protected
如果沒有加以上三個權限,則稱爲包訪問權限
包訪問權限即只能訪問同一個包中的內容。
Eg:

Demo1.java
package com.bit.demo;
   public class Demo1 {
     int value = 0; 
 }
Demo2.java
package com.bit.demo;
public class Demo2 {
   public static void Main(String[] args) {
       Demo1 demo = new Demo1();
       System.out.println(demo.value);
   }
} // 執行結果, 能夠訪問到 value 變量 10

7、
常見的系統包

  1. java.lang:系統常用基礎類(String、Object),此包從JDK1.1後自動導入。
  2. java.lang.reflect:java 反射編程包;
  3. java.net:進行網絡編程開發包。
  4. java.sql:進行數據庫開發的支持包。
  5. java.util:是java提供的工具程序包。(集合類等) 非常重要
  6. java.io:I/O編程開發包

下一篇:JAVA順序表的實現
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章