文章目錄
- 一、面向程序?面向物件?
- 二、類和類的實體化
- 2.1普通成員變數和普通成員方法
- 2.2 靜態成員變數和靜態成員方法
- 三、封裝
- 3.1 private
- 3.2 getter 和 setter
- 四、構造方法
- 4.1 基本語法
- 4.2 this 關鍵字
- 五、代碼塊
- 5.1 普通代碼塊
- 5.2 構造代碼塊
- 5.3 靜態代碼塊
- 5.4 注意事項
- 六、快捷方法
- 6.1 toString方法
- 6.2 setter / getter 方法
- 6.3 構造方法(快捷)
一、面向程序?面向物件?
C 語言是一門程序語言,在求解問題的時候關注的是程序,因此 C 語言是面向程序的,
JAVA 語言與之不同,JAVA 語言是面向物件的語言,在求解問題的時候,將問題拆分成好幾個物件,物件與物件之間相互互動從而解決問題,物件是 JAVA 語言的核心,
用通俗的例子來解釋這兩者的區別就應該是這樣的,
想要吃一碗蛋炒飯,如果是面向程序的話就應該是這樣的,

如果是面向物件的話就應該是這樣的,

程序:
- 我付錢
- 廚子做蛋炒飯
- 服務員將蛋炒飯端上來
- 我吃蛋炒飯
整個程序是四個物件之間互動完成的,對于我而言,廚子具體炒蛋炒飯的步驟我并不需要知道,這就是面向物件,
在用 JAVA 進行設計開發時,我們需要做的就是找到物件,建立物件,使用物件,維護物件之間的關系,
二、類和類的實體化
類實際上就是一類物件的統稱,相當于一個模板;物件其實就是對類實體化出來的結果,相當于由模板產生的樣本,
一個模板可以產生多個樣本,一個類可以實體化出多個物件,

在 JAVA 當中,類是一個參考型別,需要用到關鍵字 class 來申明一個類,實際上就相當于創建一個新的資料型別
??基本語法形式:
//創建一個類
class <類的名字> {
field;//成員變數
method;//成員方法
}
//實體化一個物件
<類的名字> <物件名> = new <類的名字>();
2.1普通成員變數和普通成員方法
📑代碼示例:
class Person {
public int age;
public String name;//成員變數放在物件當中,即堆上
public void show() {
//int a = 10;
//a變數定義在方法中,它不是成員變數,是區域變數,在堆疊上開辟記憶體
System.out.println("姓名: " + name + " 年齡: " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.age = 18;
person1.name = "富春";
person1.show();
Person person2 = new Person();
person2.age = 21;
person2.name = "山居";
person2.show();
}
}
🏸 代碼結果:

💬代碼解釋:
- 這里通過 class 這個關鍵字創建了 Person 這個類(類名通常用
大駝峰即每個單詞的首字母都為大寫),- 像 age 和 name 這種定義在方法外部類內部的變數稱之為
成員變數或屬性或欄位,另外,這兩個變數皆為普通成員變數,- 像 show 這種描述物件行為的叫做
方法或行為,這里通過 show 方法將姓名和年齡進行了列印,另外,該方法為普通成員方法,- 在 JAVA中通過類的實體(物件)點號(.)來訪問類的成員變數和成員方法,格式為:物件名.成員變數; 物件名.成員方法(實參串列);(PS:在訪問類的成員方法時,如果類的方法有形參,就必須為方法傳遞與引數型別相同的實參值)
- 在 main 函式中,實體化了兩個物件,為物件在堆上開辟了記憶體,記憶體的地址存放在 person1 和 person2 中,因此這兩個變數實際上是
參考變數,其中的 new 關鍵字就是用于創建一個物件的實體,
記憶體分布:

注意:
- 當物件中的成員變數并沒有賦初值時,
參考型別默認為null,基本型別默認為0值,boolean 型別默認為false,char 型別默認為'\u0000'(其實就是啥也沒有),- 當參考型別的變數為 null 時,即表示不參考任何物件,此時對 null 進行訪問,就會出現空指標例外,
- 如果不希望成員變數使用默認值時,可以在創建類的時候為成員變數賦初始值,但其意義不太大,類終究是個模板,創造的樣本各種各樣,
📑代碼示例:
class Person {
public int age;
public String name;
public boolean ans;
public char ch;
public void show() {
System.out.println("姓名: " + name + " 年齡: " + age);
System.out.println("ans:" + ans + " ch:" + ch);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
🏸 代碼結果:

2.2 靜態成員變數和靜態成員方法
📑代碼示例:
class Person {
public int age;
public static int count;
public static final int COUNT = 99;
//COUNT 是靜態常量
public static void staticTest() {
System.out.println("這是靜態成員方法");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.age = 18;
Person.count = 20;
System.out.println(person1.age + " " + Person.count);
Person.staticTest();
}
}
🏸 代碼結果:

💬代碼解釋:
- 用
static關鍵字修飾的成員變數叫做靜態成員變數,修飾的成員方法叫做靜態成員方法- 普通成員變數或普通成員方法的訪問需要實體化一個物件,通過參考進行訪問,但是,
靜態成員變數或靜態成員方法無需創建實體物件,直接通過類名進行訪問,格式為:類名.成員變數; 類名.成員方法(實參串列);- 靜態成員變數或方法被同一個類的不同實體所共用,且不屬于物件,它們被存放在
方法區,只存在一份,
記憶體分布:

注意:
- 靜態方法是
不能直接使用非靜態成員變數或非靜態方法,因為后兩者都和實體相關,如果需要使用的話,需要實體化物件,而靜態方法和實體無關和類相關,因此不能直接呼叫,這也就是為什么在 main 函式中呼叫其他方法,被呼叫的方法最好是靜態方法的原因,- 那么
main 函式為何非得是靜態的呢?不是靜態的又會如何?
假設 main 函式不是靜態的函式,那么想要呼叫 main 函式,必須要進入 main 函式中,實體化物件,通過參考去呼叫 main 函式,但問題就在于 main 函式壓根就沒有被呼叫,又如何進入到 main 函式當中呢?這就形成了一個邏輯死回圈,唯一的解法就在于將 main 函式設定為靜態的,通過 Java 虛擬機去呼叫它,
三、封裝
在面向物件編程中,封裝是將物件運行所需的資源封裝在程式物件中——基本上,是方法和資料,物件是“公布其介面”,其他附加到這些介面上的物件不需要關心物件實作的方法即可使用這個物件,這個概念就是“不要告訴我你是怎么做的,只要做就可以了,”
3.1 private
屬性和方法都有自身的訪問權限,private/ public 這兩個關鍵字表示 “訪問權限控制”
public: public 表明該資料成員、成員函式是對所有用戶開放的,所有用戶都可以直接進行呼叫
private: private 表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,
在本章第一段代碼示例中,成員變數 age 和 name 分別被 public 所修飾,就可能出現以下的問題:
- 類的使用者必須要了解 Person 類內部的實作, 才能夠使用這個類. 學習成本較高,
- 如果 Person 這個類的實作者修改了成員變數的名字,類的使用者就需要將自己的代碼隨之更改,如果專案的規模較大,就會導致維護的成本過高,
每個成員變數或方法的訪問權限是需要依據具體的情況仔細斟酌,而不應當隨意的設定為 public,
在這樣的思考下,private 關鍵字顯得尤為重要,被其修飾的屬性,類的使用者是不能夠直接使用的(根本沒有訪問到),需要借助接下介紹的 getter 和 setter 方法,這樣就可以不用對類里面的實作細節進行知曉,
3.2 getter 和 setter
當用 private 來修飾欄位的時候,如果需要獲取或者修改這個 private 屬性,就需要使用 getter 和 setter 方法
📑代碼示例:
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int myAge) {
age = myAge;
}
public void setName(String myMame) {
name = myMame;
}
public String getName() {
return name;
}
public void show() {
System.out.println("姓名: " + name + " 年齡: " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.setAge(18);
person1.setName("富春");
int age = person1.getAge();
String name = person1.getName();
System.out.println(name + " " + age);
person1.show();
}
}
🏸 代碼結果:

💬代碼解釋:
- getName 和 getAge 即為 getter 方法, 表示獲取這個成員的值
- setName 和 setAge 即為 setter 方法, 表示設定這個成員的值
四、構造方法
實體化物件時分兩步:
- 為物件分配記憶體空間
- 呼叫物件的構造方法(構造方法不止一種)
構造方法是一種特殊方法, 使用關鍵字new實體化新物件時會被自動呼叫,不僅可以構造物件,也可以幫助我們對成員變數進行初始化,
4.1 基本語法
規則:
- 方法名和類名是
相同的,并且沒有回傳值- 在類中沒有提供任何的建構式的情況下,編譯器會默認生成一個不帶有引數的建構式
- 如果類中定義了構造方法,就不會默認生成無參的構造方法
- 構造方法支持多載,規則和普通方法的多載一致
📑代碼示例:
class Person {
private int age;
private String name;
public Person() {
System.out.println("不帶引數的構造方法");
}
public Person(String name) {
this.name = name;
System.out.println("帶一個引數的構造方法");
}
public Person(String name,int age) {
this.name = name;
this.age = age;
System.out.println("帶兩個引數的構造方法");
}
public void show() {
System.out.println("姓名: " + this.name + " 年齡: " + this.age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.show();
Person person2 = new Person("富春");
person2.show();
Person person3 = new Person("山居",18);
person3.show();
}
}
🏸 代碼結果:

4.2 this 關鍵字
在此之前的代碼中出現了很多的 this 關鍵字,那么該關鍵字代表什么呢?
該關鍵字在物件被構造的程序中被使用,物件還未構造完,因此它并不代表當前物件,this 關鍵字代表著當前物件的參考,
可以借助 this 關鍵字來訪問物件的成員變數和成員方法,也可以通過它來呼叫其他的構造方法
方法:
- this . 成員變數
- this . 成員方法
- this ( )
注意:
- 用 this 關鍵字呼叫其他的構造方法時一定要放在第一行
- 靜態方法里不允許出現 this 關鍵字,因為該關鍵字代表著當前物件的參考,而靜態的方法是不依賴于物件的
📑代碼示例:
class Person {
private int age;
private String name;
public Person() {
this("富春",18);//呼叫其他的構造方法
System.out.println("不帶引數的構造方法");
}
public Person(String name,int age) {
this.name = name;
this.age = age;
System.out.println("帶兩個引數的構造方法");
}
public void show() {
System.out.println("姓名: " + this.name + " 年齡: " + this.age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.show();
}
}
🏸 代碼結果:

加 this 關鍵字是一個良好的代碼習慣,
五、代碼塊
Java 中用大括號 { } 將多行代碼括起來,并形成一個獨立的代碼區間的代碼形式稱為代碼塊,它是 Java 中常見的代碼形式,
根據代碼塊定義的位置以及關鍵字,又可分為以下四種:普通代碼塊、構造代碼塊、靜態代碼塊、同步代碼塊,
接下來主要向大家介紹前三種,最后一種講解多執行緒部分時在涉及一下,
5.1 普通代碼塊
它是最常見的代碼塊,是類中方法的方法體或在方法名后面,
📑代碼示例:
public class TestDemo {
public static void main(String[] args) {
int a = 10;
{
int b = 20;
System.out.println(b);
}
System.out.println(a);
}
}
💬代碼解釋:
在這里,main 方法后面跟著的 { } 所包裹的內容是一個普通代碼塊,將定義變數 b 并且列印它的代碼包裹起來的 { } 中的內容也是一個普通代碼塊
5.2 構造代碼塊
定義在類中的不加修飾符的代碼塊叫構造代碼塊也叫實體代碼塊,構造代碼塊一般用于初始化實體成員變數
📑代碼示例:
class Person {
private int age;
private String name;
{
this.name = "山居";
this.age = 18;
}
public void show() {
System.out.println("姓名: " + this.name + " 年齡: " + this.age);
}
}
5.3 靜態代碼塊
使用 static定義的代碼塊,一般用于初始化靜態成員屬性和需要提前準備的一些資料
📑代碼示例:
class Person {
private int age;
private String name;
public static int count;
static {
count = 20;
}
public void show() {
System.out.println("姓名: " + this.name + " 年齡: " + this.age);
}
}
5.4 注意事項
構造代碼塊優先于建構式執行靜態代碼塊優先于構造代碼塊執行,且對于同一個類來說只執行一次- 當代碼塊和成員變數同為靜態的或同為實體的時候,其值和定義的順序是有關系的
六、快捷方法
6.1 toString方法
在本章第一段代碼示例中,類里面通過 show 方法將物件的屬性進行列印,但當屬性很多時,就顯得不那么方便,因此,可以用快捷鍵,
步驟一:alt + insert 或者 滑鼠右鍵點一下選擇 Generate (要在類的代碼區域執行)
步驟二:選擇 toString()
步驟三:選擇需要列印的屬性
步驟四:選擇 OK

📑代碼示例:
class Person {
public int age;
public String name;
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.age = 18;
person1.name = "富春";
System.out.println(person1);
}
}
🏸 代碼結果:

💬代碼解釋:
@Override是注解,用于解釋該方法是重寫的方法- 未重寫 toString 方法時,列印 person1,將會是一個
地址
當重寫 toString 方法時,列印 person1,將會直接呼叫 toString 方法
6.2 setter / getter 方法
setter / getter 方法也可以使用快捷鍵自動生成
步驟一:alt + insert 或者 滑鼠右鍵點一下選擇 Generate (要在類的代碼區域執行)
步驟二:選擇 Getter and Setter
步驟三:選擇需要該方法的屬性
步驟四:選擇 OK

📑代碼示例:
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
//age = age;錯誤
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println("姓名: " + name + " 年齡: " + age);
}
}
💬代碼解釋:
自動生成的 setter 方法形參名字和類中的成員屬性的名字一樣的時候,如果不使用 this , 相當于自賦值,this 表示當前物件的參考
6.3 構造方法(快捷)
當想要快速生成引數個數不同的構造方法時,也有快捷鍵,
步驟一:alt + insert 或者 滑鼠右鍵點一下選擇 Generate (要在類的代碼區域執行)
步驟二:選擇 Constructor
步驟三:選擇需要該方法的屬性
步驟四:選擇 OK(無參的話,跳過步驟三,直接選擇 Select None)

📑代碼示例:
class Person {
private int age;
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
完!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/299664.html
標籤:java
