JAVA——从基础学起(五)类和对象
五 類和對象
5.1 面向對象概述
在生活中,任何一種隨處可見的事物都可以稱為對象,
簡單來說,類實質上就是用于封裝對象屬性和行為的載體,而對象是類抽象出來的一個實例。
5.1.1 對象
通常來說,對象包含靜態的屬性與動態的行為。在計算機中,對象的靜態屬性就是對象的變量,動態行為即對象中定義的方法。
5.1.2 類
類是用于封裝對象屬性與行為的載體。
5.1.3 封裝
封裝是面向對象編程的核心思想。將對象的行為與屬性封裝——即將對象內部的實現方法隱藏起來——這個封裝而成的載體就叫做類
封裝的思想保證了類內部數據結構的完整性,當用戶在使用該類時,不能夠輕易的操作此數據結構,而是只能執行類中對外公開的數據及方法。這樣做避免了類的外部操作對內部細節的影響,提高了程序的可維護性。
5.1.4 繼承
類和類之間的關系被稱為關聯,用于描述兩個類之間的一般二元關系。繼承就是關聯中的一種關系。
子類保留父類的一些屬性和行為,這樣就會節省定義子類和父類所共同具有的屬性及方法時用到的時間。復用這些已經定義好的類可以提高系統的性能,減少系統在使用過程中出現錯誤的概率。
子類的實例也是父類的實例。
5.1.5 多態
(1) 將父類對象應用于子類的特征就是多態。
如圖形類為四邊形類、三角形類等的父類。如果我們將子類的對象也統一看做是父類的對象,當想要繪制圖形時,簡單的調用父類圖形類的繪制方法就可以繪制任何圖形子類的對象實例了。這就是多態最基本的思想。
(2) 抽象類和接口
多態性的實現不依賴于具體類,而是會依賴于抽象類和接口。
在多態機制中,父類一般會被定義為抽象類。在抽象類中定義的方法只會給出標準而不給出具體的實現流程。
抽象類不能夠實例化對象,只是給子類一個定義好的方法模板,便于子類重寫使用。
而接口是比抽象類更為方便的方式,由抽象方法組成的集合就叫做接口。
5.2 類
5.2.1 成員變量
Java中對象的屬性叫做成員變量。如Book類中的Number變量:
public class Book{public static int Number = 0; }Java中使用class關鍵詞來定義類。類中的成員變量其實就是普通的變量,但因為定義在類體而非方法體內所以叫做成員變量,可以不進行初始化。
5.2.2 成員方法
Java中對應著對象的行為的部分叫做類的成員變量。Book類中的showNumber和showName方法均為成員方法。
package com.mw; public class Library {public static int num = 0;private String name ;public Library(String Name) {this.name = Name ;num++;}public void showName(){System.out.println(this.name);}public int showNumber(){return int num;} }成員方法包含——權限修飾符,返回值類型,方法名,參數列表和方法體等部分。
5.2.3 權限修飾符
Java中的權限修飾符主要為private,protected和public三個。這些修飾符控制著對類和類中的成員方法的訪問。
(1)當類的成員變量或成員方法被private修飾:表示類中的成員變量或方法只能在本類中使用,不能夠被其他類或者子類調用;而且對其他包中的類來說也是不可見的。
(2))當類的成員變量或成員方法被public修飾:表示類中的成員變量或方法能夠在本類以及子類和其他包中的類使用。
(3)當類的成員變量或成員方法被protected修飾:表示類中的成員變量或方法能夠在本類以及同一個包中的子類或其他類訪問;但是在不同的包中的類不能夠對其進行訪問。
注意:當聲明類時不使用權限修飾符時,則自動為該類分配包存取范圍——即只有同一個包中的類可以對其進行訪問。(如上文中的Book類沒有進行權限修飾符聲明,則只能被com.mw包中的其他類訪問。)
(4)但是需要注意的是,Java語言中的規則為類的權限設定會約束類成員的權限設定,因此Book類中的public變量和方法均只能為默認的訪問權限,不能被其他包中的類訪問。
5.2.4 局部變量
局部變量指的是定義在方法體內的變量,需要在使用時對其進行賦值或初始化。如下,當i的值未初始化或定義時,在調用變量i時程序會報錯。
public class Test {public static void main(String []args){int i = 0;//int i ;System.out.println(i);} }5.2.5 局部變量的有效范圍
局部變量的有效范圍也稱局部變量的作用域。局部變量只能在其定義的函數體內被使用,當在嵌套的方法體內聲明相同名稱的局部變量時,嵌套方法外部的局部變量對于內部的局部變量來說是不可見的,因此只有內部局部變量有效。
5.2.6 this關鍵字
public class Test1{private String name ;public void setName( String name){this.name = name;} }Java中使用this關鍵字來代表對本類對象的引用(事實上this關鍵字會被隱式的用于對成員方法和成員變量的引用)。但是在Java中對成員變量及方法的調用最常規的還是使用“對象名.方法名/變量名”這種方式。
而事實上,this引用的就是本類的一個對象,當局部變量或方法參數覆蓋了成員變量時,就會使用this關鍵字來明確引用的時類的成員還是局部變量或方法參數;除此之外,this除了可以調用成員變量和成員方法之外,還可以作為方法的返回值。
如再類文件中創建一個返回值為Book類的方法,返回一個Book類的對象:
5.3 類的構造方法
類的構造方法有兩個特征:沒有返回值,方法名與類名相同。
注意:如果類中沒有定義構造方法,編譯器會自動創建一個不含參數的默認構造方法;但是只要存在任意一個定義的構造方法,編譯器均不會再為類自動創建默認構造方法。
注意:在無參數構造方法中可以使用this關鍵字調用有參的構造方法,但是只可以在無參構造方法的第一句使用
5.4 靜態變量、常量和方法
(1)使用static關鍵字修飾的變量,常量和方法為靜態變量、靜態常量和靜態方法。靜態成員屬于類所有,區別于個別對象,可以在本類或其他類時使用“類名.靜態成員名”來調用靜態成員。
注意:靜態成員當然也可以使用“對象.成員名”的方法來調用,但是這樣不便于與費靜態成員的區分。
(2)靜態成員的作用是為了提供共享數據和方法,可以使用類名直接調用。靜態成員同樣遵循著權限修飾符的約束。
(3)靜態方法使用規則:在靜態方法中不能使用this關鍵字;在靜態方法中不可以直接調用非靜態方法。
如:
(4)Java中規定不能將方法體內的局部變量聲明為static的
(5)在執行類時,如果希望先執行類的初始化操作,可以使用static來定義一個靜態區域。在程序執行時會首先執行static塊中的程序,并且只會執行一次。
5.4 類的主方法
public static void main(String []args){//DO SOMETHING }(1)主方法是靜態的,在主方法中調用的其他方法必須也是靜態的
(2)主方法沒有返回值
(3)主方法的形參為數組,args[0]至args[n]粉筆代表程序的第一個參數到第n個參數,可以使用args.lengh來獲取參數的個數。
5.6 對象
5.6.1 對象的創建
使用new操作符來調用類的構造方法創建對象。如Test test1 = new Test(),Test test2 = new Test(“a”)等。
每個對象都是相互獨立的,在內存空間中占據著獨立的內存地址。
5.6.2 訪問對象的屬性和行為
在使用new操作符創建對象之后,可以使用對象名.成員名的方式來對對象的內的成員進行訪問。每個對象之間的成員互不影響。當然靜態成員是可以被所有對象共享的。
5.6.3 對象的引用
在Java語言中盡管一切都可以看做對象,但是真正地操作標識符實質上是一個引用。
語法為:類名 對象引用名稱,如Book book1
通常來說一個引用不一定要有一個對象相關聯。
引用與對象相關聯的語法為:Book book1 = new Book()
注意:引用存放的只是對象的內存地址,而不是存放對象。嚴格意義上說引用與對象是不同的概念——可以簡單的說book1是Book的一個對象,但實際上應該是book1包含著Book類對象的一個引用。
5.6.4 對象的比較
在Java語言中有兩種比較對象的方式,為==和equals(),但是這兩種方法有著本質的區別。
public static void main(String[] args) {String str1String = new String("ABC");String str2String = new String("ABC");//使用“==”運算符來進行比較System.out.println(str1String == str2String);//使用equals方法來進行比較System.out.println(str1String.equals(str2String));}使用==運算符進行比較時比較的是兩個對象引用(即str1String和str2String)的地址是否相同
而使用equals()方法進行比較時比較的是兩個對象引用所指的內容是否相同。
注意:equals()方法是在Object類中定義的,在各個具體類中的實現細節可以通過對equals方法的重寫來進行改變。
5.6.5 對象的銷毀
每個對象都有著其自己的生命周期,當生命周期結束時,分配給該對象的內存地址就會被收回。在C++中需要我們手動對內存進行回收,如與new對應的free操作。Java中擁有完整的垃圾回收機制,不需要程序員對“死亡”的對象進行手動回收。
注意,以下兩種情況的對象會被視為垃圾
(1)不會哄女朋友開心的 (2)不會哄男朋友開心的
…咳咳
(1)當對象引用超出其作用范圍時
(2)當對象引用被賦值為null時
這兩種情況下的對象會被視為垃圾而被垃圾回收機制定期檢查回收。
注意,垃圾回收器只會對使用new操作符創建的對象進行回收,而是用其他方法創建的對象無法被垃圾回收器識別,如String s1 = “abcdefg”就無法被垃圾回收器識別。
因此Java提供了finalize()方法。finalize()方法同樣是在Object類中定義的方法,使用protected修飾符修飾。程序員可以在類體中定義這個方法,這樣在垃圾回收時會首先調用該方法,在下一次垃圾回收動作發生時回收被對象占用的內存。(當JVM內存消耗殆盡時,垃圾回收機制或finalize()方法就不會發生。)
由于垃圾回收是不受人為控制的,具體的執行時間也是不確定的。因此Java提供了System.gc()方法來強制啟動java垃圾回收器——主動告知垃圾回收器來進行清理。
PS:本部分主要是對面向對象編程的思想進行了一些描述,讀者應當對這樣的思想進行深刻的體會,在此基礎上可以通過編寫類,定義類內部的成員等方式來解決一些實際的問題。
PPS:說一些題外話,如果有正在進行論文查重或者在不久的將來需要進行論文查重的朋友看到的話,希望可以給你們一些幫助——
那就是!!!!
查重要趁早!!!!!!!
改論文要趁早!!!!!!!!!!
最好給自己留3-5天時間來保證論文查重的質量!!!!!!!
MMD查重查的我腦袋大。
2020.5.29
總結
以上是生活随笔為你收集整理的JAVA——从基础学起(五)类和对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android系统镜像编译、烧录及调试
- 下一篇: 新博客欢迎莅临