您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何用Java全面剖析類和對象,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
一、面向過程?面向對象?
C 語言是一門過程語言,在求解問題的時候關注的是過程,因此 C 語言是面向過程的。
JAVA 語言與之不同,JAVA 語言是面向對象的語言,在求解問題的時候,將問題拆分成好幾個對象,對象與對象之間相互交互從而解決問題。對象是 JAVA 語言的核心。
在用 JAVA 進行設計開發時,我們需要做的就是找到對象,建立對象,使用對象,維護對象之間的關系。
類實際上就是一類對象的統稱,相當于一個模板;對象其實就是對類實例化出來的結果,相當于由模板產生的樣本。
一個模板可以產生多個樣本,一個類可以實例化出多個對象。
在 JAVA 當中,類是一個引用類型,需要用到關鍵字 class 來申明一個類,實際上就相當于創建一個新的數據類型
基本語法形式:
//創建一個類 class <類的名字> { field;//成員變量 method;//成員方法 } //實例化一個對象 <類的名字> <對象名> = new <類的名字>();
代碼示例:
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(); } }
? 代碼結果:
代碼示例:
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 虛擬機去調用它。
在面向對象編程中,封裝是將對象運行所需的資源封裝在程序對象中——基本上,是方法和數據。對象是“公布其接口”。其他附加到這些接口上的對象不需要關心對象實現的方法即可使用這個對象。這個概念就是“不要告訴我你是怎么做的,只要做就可以了。”
屬性和方法都有自身的訪問權限,private/ public 這兩個關鍵字表示 “訪問權限控制”
public: public 表明該數據成員、成員函數是對所有用戶開放的,所有用戶都可以直接進行調用
private: private 表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。
在本章第一段代碼示例中,成員變量 age 和 name 分別被 public 所修飾,就可能出現以下的問題:
類的使用者必須要了解 Person 類內部的實現, 才能夠使用這個類. 學習成本較高。如果 Person 這個類的實現者修改了成員變量的名字,類的使用者就需要將自己的代碼隨之更改,如果項目的規模較大,就會導致維護的成本過高,
每個成員變量或方法的訪問權限是需要依據具體的情況仔細斟酌,而不應當隨意的設置為 public。
在這樣的思考下,private 關鍵字顯得尤為重要,被其修飾的屬性,類的使用者是不能夠直接使用的(根本沒有訪問到),需要借助接下介紹的 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 方法, 表示設置這個成員的值
實例化對象時分兩步:
1。為對象分配內存空間
2.調用對象的構造方法(構造方法不止一種)
構造方法是一種特殊方法, 使用關鍵字new實例化新對象時會被自動調用,不僅可以構造對象,也可以幫助我們對成員變量進行初始化。
規則:
方法名和類名是相同的,并且沒有返回值
在類中沒有提供任何的構造函數的情況下,編譯器會默認生成一個不帶有參數的構造函數
如果類中定義了構造方法,就不會默認生成無參的構造方法
構造方法支持重載,規則和普通方法的重載一致
代碼示例:
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(); } }
代碼結果:
在此之前的代碼中出現了很多的 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 中常見的代碼形式。
根據代碼塊定義的位置以及關鍵字,又可分為以下四種:普通代碼塊、構造代碼塊、靜態代碼塊、同步代碼塊。
接下來主要向大家介紹前三種,最后一種講解多線程部分時在涉及一下。
它是最常見的代碼塊,是類中方法的方法體或在方法名后面。
代碼示例:
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 并且打印它的代碼包裹起來的 { } 中的內容也是一個普通代碼塊
定義在類中的不加修飾符的代碼塊叫構造代碼塊也叫實例代碼塊。構造代碼塊一般用于初始化實例成員變量
代碼示例:
class Person { private int age; private String name; { this.name = "山居"; this.age = 18; } public void show() { System.out.println("姓名: " + this.name + " 年齡: " + this.age); } }
使用 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); } }
構造代碼塊優先于構造函數執行靜態代碼塊優先于構造代碼塊執行,且對于同一個類來說只執行一次當代碼塊和成員變量同為靜態的或同為實例的時候,其值和定義的順序是有關系的
在本章第一段代碼示例中,類里面通過 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 方法
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 表示當前對象的引用
當想要快速生成參數個數不同的構造方法時,也有快捷鍵。
步驟一: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; } }
以上就是如何用Java全面剖析類和對象,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。