日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础整理

發布時間:2024/1/17 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、泛型:

a)???????? 提到參數第一時間想到的應該是定義方法時設置的形參,并且在調用這個方法的時候為該方法傳遞的實參。泛型其實就是類型化參數,顧名思義,就是將方法參數由原來的具體類型參數化。這就類似于方法的變量參數,只是在這里把類型也當成參數可變的,在后邊調用這個方法的時候傳入具體。

b)???????? 泛型的本質是為了再不創建新的參數類型方法的情況下,通過泛型指定的不同的類型來控制形參具體限制的類型。

c)???????? 泛型的特點:泛型只在編譯階段有效,在編譯之后程序會采取去泛型化的措施,在編譯過程中,虛擬機正確檢驗泛型結果后會將泛型的相關信息擦除,并且在對象進入和離開方法的邊界添加類型檢驗和類型轉換的方法,類型信息不會進入到運行階段。

d)???????? 泛型的使用包括泛型類、泛型方法、泛型接口。

2、? 多態:

a)???????? 面向對象編程中的三大特性就是封裝、繼承和多態。

b)???????? 封裝就是隱藏了類的內部實現細節,在不影響使用的情況下可以改變類的內部結構,這樣也能保護數據,暴露給外界的只有對該對象的訪問方法。

c)???????? 繼承是為了實現代碼的重用,只要是兩個類之間滿足IS-A的關系,就可以使用繼承,但是需要注意Java中的繼承的單繼承,一個類只能繼承一個類,換言之一個類只能有一個父類,同時繼承也為多態的實現做了鋪墊。

d)???????? 多態指的是在程序定義的引用變量所指向的具體對象類型以及通過該引用變量所發出的方法調用具體是那個具體對象中的方法在編譯階段是不確定的,只有在程序運行期間才能具體確定。

???????????????????????? i.????????????? 面向對象而言,多態又分為編譯時多態和運行時多態,其中編譯時多態是靜態的,主要是指方法的重載,可以根據參數列表的不同或者參數類型的不同來區分是不用的函數方法,然后通過編譯就能變成兩個不同的方法。運行時多態是動態的,是通過動態綁定來實現的,也就是我們所說的多樣性。

?????????????????????? ii.????????????? 實現多態的三個重要條件:繼承、重寫和向上轉型。繼承是指在多態關系中必須要有存在繼承關系的子類和父類、重寫指的是子類必須對父類中的方法進行重寫、向上轉型指的是在定義的時候需要將父類的引用指向子類的對象。

????????????????????? iii.????????????? 多態實現的方法:基于繼承的實現機制主要通過在父類和繼承該父類的一個或者多個子類通過重寫父類中的一個多個方法來體現的、基于接口的實現是通過重寫該接口中的方法的多個不同類來實現的。但是基于接口實現的多態比基于繼承實現的多態有更好的靈活性。

3、? 反射:

a)???????? Java反射機制是在程序運行中,對于任意一個類都能夠獲取這個類的所有屬性和方法;對于任意一個對象都能夠調用該對象的任意方法和屬性,這種動態獲取信息以及動態調用對象的方法和屬性的功能成為Java的反射機制。(換言之反射就是把Java類中的組成部分映射成一個一個的Java對象)

b)?? 當我們new一個對象的時候,JVM會為我們加載相應類的.class文件,Class對象的由來是將class文件加載入內存之后,虛擬機會為自動該對象創建一個對應的Class對象。一個類只能對應生成一個Class對象。

c)???????? Class對象是在加載類時由Java 虛擬機以及通過調用類加載器中的defineClass方法自動構造的。也就是這不需要我們自己去處理創建,JVM已經幫我們創建好了,所以Class沒有公共構造器。

d)???????? 獲取Class對象的三種方法:

???????????????????????? i.????????????? Class stuClass = stu1.getClass();Object類中有一個方法getClass;

?????????????????????? ii.????????????? Class stuClass2 = Student.class; 每個類都有一個class屬性

????????????????????? iii.????????????? Class stuClass3 = Class.forName("fanshe.Student"):必須是完整的包名.類名

4、? Java.String類

a)???????? String中用于存放字符的數組被聲明為final只能賦值一次不能被更改。也就意味著String類不能被繼承,所有的屬性和方法都默認是final類,對String對象的操作都不會影響原對象,也就意味著所有的操作都會生成新的對象。

b)???????? String類的特點:

???????????????????????? i.????????????? 任何一個String對象在創建完成之后都不會再被改變

?????????????????????? ii.????????????? 任何對String對象的操作如果返回的不是原來的字符串,實際上都會創建一個新的String對象

????????????????????? iii.????????????? 如果該String對象存放在方法區的常量池中,那么在程序中的任何地方相同的字符串字面常量都是同一個對象

????????????????????? iv.????????????? String對象重寫了equal方法,用于比較字符串的內容是否相等

c)???????? 字符串直接賦值的方法創建的String對象,會存放在方法區的常量池中,只開辟一塊堆內存空間,不會產生垃圾

d)???????? 通過構造器方法創建的String對象在堆內存空間中會像一般的對象創建一樣開辟內存空間,當創建多個同樣的字符串的時候會開辟多個內存空間,并且不能夠自動進入方法區的常量池,需要手動設置。所以一般在使用的時候都是用直接字符串賦值的方法創建String對象。

e)???????? 字符串不屬于8中基本數據類型(byte、short、int、long、double、float、char、boolean),而是一種引用數據類型

f)????????? 字符串常量池:我們知道對象的創建是需要消耗大量的時間和空間的,因為創建的字符串一般都會經常使用,所以為了提高虛擬機的性能和減少內存開銷,使用字符串常量池進行性能的優化,每當我們使用字符串直接賦值的方法創建String類的時候,虛擬機會首先檢查字符串常量池中是否已經存在該字符串對象,如果存在就直接返回字符串在常量池中的引用,如果不存在就會創建該字符串對象并且將該字符串存入字符串常量池中。

g)???????? Java.StringBuffer和Java.StringBuilder類的比較:StringBuffer和StringBuilder對象代表一組可改變的Unicode字符序列。

???????????????????????? i.????????????? 可以使用StringBuffer來對字符串的內容進行動態操作,不會產生額外的內存開銷。

?????????????????????? ii.????????????? StringBuffer對象的創建可以有幾種常見的方法:構造一個不帶字符串緩沖區的容量默認為16個字符的StringBuffer對象;構造一個指定初始容量大小的StringBuffer對象;構造一個帶指定字符串的StringBuffer對象。

????????????????????? iii.????????????? 如果要想判斷兩個StringBuffer對象是否相等,應該先把這兩個對象全部轉換成String對象然后再比較是否相等。

????????????????????? iv.????????????? StringBuffer的優勢就是節省內存開銷

?????????????????????? v.????????????? StringBuilder是在JDK5.0版本后引入的,可以理解為是StringBuffer的簡單替換版本,用在字符串緩沖區被單個線程使用的情況,但是它的創建和使用幾乎和StringBuffer的一樣的,

????????????????????? vi.????????????? StringBuilder是非線程安全的,StringBuffer是線程安全的

??????????????????? vii.????????????? StringBuffer在JDK1.0中就有,但是在某些方法的實現上String Builder的速度要比StringBuffer快

h)???????? Java中的常量池分為兩類:靜態常量池和動態常量池

???????????????????????? i.????????????? 所謂的靜態常量池就是.class文件中的常量池,里邊不但包含字符串字面量,還包括類方法的一些信息,占用class文件的絕大部分空間;

?????????????????????? ii.????????????? 所謂的動態常量池指的是Java虛擬機加載類之后,把.class文件中的常量池加載進內存中,并且保存在方法區,我們所說的常量池就是指運行時常量池。

5、? 對象的克隆:

a)???????? 在Java中所有的對象都是缺省的繼承于Object類,在Object類中有一個方法clone(),這是一個native關鍵字修飾的方法,我們都知道使用native修飾的方法都是非Java語言實現的,因為Java程序都是在虛擬機上編譯運行的,這個clone()方法的執行效率要高一點。需要注意的是clone方法是protected修飾的方法,如果對象需要使用,需要重寫該方法。

b)???????? 為什么會使用到對象的克隆:需要拷貝的對象的可能包含已經被修飾過屬性,但是使用new生成的對象屬性都是初始化的值,所以當需要用一個對象保存當前對象的狀態,就需要使用克隆來完成。相比較創建一個新的對象然后再依次為屬性進行賦值會比較麻煩,而且clone方法是非Java語言實現的更接近于底層代碼,運行效率比較高。通過clone()方法克隆的對象和原來的對象是兩個相互獨立的對象,互不干擾。

c)???????? 如何實現拷貝:拷貝又分為深拷貝和淺拷貝:

???????????????????????? i.????????????? 在Java語言中數據類型分為基本數據類型和引用數據類型,引用數據類型屬于比較復雜的數據類型,那么區分使用深拷貝和淺拷貝的關鍵點就是待拷貝對象中是否有引用數據類型,如果有就需要用深拷貝方法來克隆對象。

?????????????????????? ii.????????????? 淺拷貝的一般步驟:

l? 被拷貝的對象需要實現Clonable接口,這是一個標記接口,里邊不包含任何的方法

l? 待拷貝對象需要重寫clone()方法,在方法中調用super.clone(),就能實現對象的淺拷貝。

l? 此時該方法返回的對象和原來的對象是相互獨立的,指向不同的堆內存空間,是兩個相互獨立的對象。

????????????????????? iii.????????????? 深拷貝的一般步驟:

l? 因為深拷貝和淺拷貝的區別就是待拷貝對象中時候有引用變量的存在,那么關鍵就是如何解決引用對象的拷貝問題。如果在有引用類型的對象中使用淺拷貝的話,那么針對引用類型的對象拷貝的只是該引用對象的引用變量,兩個變量其實指向的還是同一個對內存空間的同一個地址。沒有起到真正拷貝的目的。

l? 舉例來說:在一個student類中有一個引用類型的變量Address,那么我們要想實現對Student的拷貝,就先要把Address類實現Clonable接口,重寫clone()方法,先保證這個對象能夠實現淺拷貝(前提是這個對象中不包含引用類型的屬性),然后在Student類中也實現Clonable接口,并且實現clone()方法,在這個方法中我們調用super.clone()返回一個Student的克隆對象,還在把這個對象的Address屬性變量使用(Addrss)super.clone()進行賦值操作,只有這樣,我們克隆的Student對象才真正實現克隆。

????????????????????? iv.????????????? 淺拷貝和深拷貝的比較:深拷貝和淺拷貝的關鍵區別就是待拷貝對象中時候包含引用類型的屬性,如果有就需要使用深拷貝,簡單來說就是深拷貝不單單對象的基本數據類型的屬性會被拷貝,對象包含的成員變量也會被拷貝一份給克隆對象

?????????????????????? v.????????????? 注意:如果引用類型的屬性里邊還包含有引用類型的屬性,那么我們就需要把內層的引用變量也要進行實現Clonable接口并且重寫clone方法,這樣其實就會比較麻煩,針對這樣的情況,我們一般會使用序列化的方法來實現對象的拷貝。

6、? 繼承和接口的比較:

a)???????? 繼承使用已有的類作為基礎創建新類的過程;接口在Java語言中是一個抽象類型,是抽象方法的集合。

b)???????? 什么時候使用繼承?什么時候使用接口?:如果類之間的關系存在IS-A的關系,我們可以考慮使用繼承,真正判斷是否使用繼承的原則可以參考:我們是否需要子類到父類進行向上轉型,如果需要我們就可以考慮繼承,除此之外我們就要考慮使用接口。

c)???????? 繼承的特點:

???????????????????????? i.????????????? Java語言中的繼承是單繼承,一個類只能繼承一個父類

?????????????????????? ii.????????????? 但Java語言支撐多繼承體系

????????????????????? iii.????????????? 子類可以直接訪問父類中的非私有屬性和方法

????????????????????? iv.????????????? 對于構造器來說,子類只能調用父類的構造器,不能繼承

?????????????????????? v.????????????? 繼承可以提高代碼的復用率

????????????????????? vi.????????????? 繼承是實現多態的前提條件

??????????????????? vii.????????????? 繼承是一種強耦合關系

d)???????? 接口的特點

???????????????????????? i.????????????? 一個類可以有實現多個接口

?????????????????????? ii.????????????? 接口不能被實例化,只能被別的類實現

????????????????????? iii.????????????? 接口中是沒有構造方法的,接口是抽象方法的集合

????????????????????? iv.????????????? 接口中不能包含一般的成員變量,除非是public static final關鍵字修飾的變量

e)???????? 繼承中構造器的調用順序:有繼承關系的類在實例化的時候,構建實例的過程是從父類向外逐步擴散的,就是從父類開始一級一級的完成創建。在子類中沒有聲明構造器的時候,編譯器會自從為我們調用父類的無參構造器:前提是父類中必須有無參構造器,如果沒有的話我們就要使用super()來顯示的調用父類的構造器。必須放在類中的第一行代碼,否則程序會報錯。先初始化靜態成員變量—>然后調用父類構造器–》再初始化非靜態成員變量–>最后調用自己構造器

f)????????? 抽象類和接口的區別:

???????????????????????? i.????????????? Abstract修飾的類成為抽象類,抽象類本質是類,起到一個類定義模板的作用,里邊可有普通方法,也可以有抽象方法,接口中只能是抽象方法,不能有具體的方法實現

?????????????????????? ii.????????????? 抽象類和接口都是不能被實例化的

????????????????????? iii.????????????? 抽象類缺省的被定義為public,但是也可以定義為protected,但是不能第一位私有,繼承抽象類的子類必須實現抽象類中的全部抽象方法,如果沒有被全部實現,那么子類也需要被定義為抽象類

????????????????????? iv.????????????? 抽象類中的成員屬性可以是各種類型,但是接口中的成員屬性只能是public static final類型的。

?????????????????????? v.????????????? 接口中不能含有靜態代碼塊和靜態方法,但是抽象類中可以存在

????????????????????? vi.????????????? 抽象類不能使用final修飾,因為抽象類就是為了讓子類繼承的

??????????????????? vii.????????????? ?

7、? 異常

a)???????? Java異常機制是Java提供的一種識別及響應異常錯誤的一致性機制。

b)???????? Java異常機制使用的一些關鍵字:

???????????????????????? i.????????????? try:用于監聽,把需要被監聽的代碼放在try代碼塊中,當try代碼塊發生異常的時候一場就會被拋出。在try代碼塊中發生異常之后,在該異常后邊的代碼將不會在被執行。

?????????????????????? ii.????????????? catch:用于捕獲并且處理try代碼塊中拋出的異常。

????????????????????? iii.????????????? finally:finally代碼塊總是會被執行。它主要用于回收在try代碼塊中打開的各種資源(數據庫連接,網絡連接以及磁盤文件等資源)。只有finally代碼塊執行完成之后才會返回來執行拋出的異常或者執行return語句。但是如果在finally代碼塊中使用了return或者throw等終止方法的語句,那么就不會再跳回執行而是直接結束。

????????????????????? iv.????????????? throw:用于拋出異常

?????????????????????? v.????????????? throws:用在方法簽名中,用于聲明該方法可能會拋出的異常。

c)????????

?

d)???????? Error:是程序無法處理的錯誤。表示運行的應用程序中出現了比較嚴重的問題。這樣的大多數錯誤都是與執行的代碼無關,而是運行程序的虛擬機出現的無法解決的錯誤。這些錯誤都是不可查的,因為這些錯誤都在應用程序的控制和處理能力之外。編譯器也不會檢查Error異常。當資源不足、約束失敗、或是其它程序無法繼續運行的條件發生時,就產生錯誤。程序本身無法修復這些錯誤的

e)???????? Exception:是程序本身可以處理的異常。RuntimeException是在程序執行過程中被執行代碼出現了邏輯錯誤才會拋出的異常。編譯器不會檢查RuntimeException,如果代碼出現了這樣的異常,需要通過修改代碼來解決。

f)????????? Java語言可以拋出的錯誤或者異常有三類:被檢查的異常(Checked Exception)、運行時異常(RuntimeException)、錯誤(Error),其中運行時異常和錯誤為不被檢查的異常。可檢查的異常是編譯器要求必須處理的Exception類本身以及Exception的子類中除了"運行時異常"之外的其它子類都屬于被檢查異常。,如果不處理編譯就不會被通過,運行時異常也需要通過修改代碼來解決。

g)???????? 總體來說,Java規定:對于可查異常必須捕捉、或者聲明拋出。允許忽略不可查的RuntimeException和Error。

8、? 重載和重寫的區別

a)???????? 重載和重寫都是多態性的體現,

b)???????? 重載指的是在編譯階段的多態性,在同一個類中,同名的方法如果參數類型或者參數個數不同或者兩者都不相同,但是重載對方法的返回值類型沒有要求,可以相同也可以不同

c)???????? 重寫指的是在運行時的多態性。它發生在子類和父類之間,當子類繼承父類并且子類中的方法名和父類中的方法名、參數類型和參數個數以及返回值類型都相同(可以不相同但必須是父類返回值的子類)的時候。兩個方法之間是重寫關系

9、? final、finally、finalize的區別?

a)???????? final:如果一個類被聲明為final,那么這個類不會再被別的類繼承,也就不會再有子類,如果一個變量被final修飾,那么這個變量在初始化的時候就要被賦值,并且在以后的使用中只能讀取,不能被修改,如果一個方法被final修飾的話,那么這個方法同樣只能被使用,不能被子類繼承

b)???????? finally:使用在try…catch代碼塊的后面構造總是被執行代碼塊,里面存放的一般是在try代碼塊中被打開的各種系統資源(數據庫連接資源、磁盤文件等),不管前面的代碼時候出現異常,finally代碼塊中的代碼總會被執行。

c)???????? finalize:Object類中定義的方法,Java中允許使用finalize方法將在垃圾收集器將對象清楚之前做必要清除工作。該方法在垃圾收集器將對象清除之前調用,通過重寫該方法可以執行整理系統資源或者執行其他的垃圾清理工作。

10、????????????? 對內存溢出和內存泄漏的比較:

a)???????? 內存泄漏指的是在程序運行過程中虛擬機為該程序分配了內存空間,但是這部分內存空間沒有被及時的釋放,從而造成這部分內存空間在一定時間段是不可用的,這就是內存泄漏。

???????????????????????? i.????????????? 常發性內存泄漏:會發生內存泄漏的代碼經常被執行,沒執行一次就會造成一次內存泄漏

?????????????????????? ii.????????????? 偶發性內存泄露:發生內存泄漏的代碼在特定的環境或者特定的操作下才會被執行。這就要求檢測環境和檢測方法對內存泄漏至關重要。

????????????????????? iii.????????????? 一次性內存泄漏:內存泄漏的代碼只會被執行一次,或者由于算法的缺陷導致總有一塊內存無法被正常釋放。

????????????????????? iv.????????????? 隱式內存泄漏:程序在運行過程中不停的為對象分配內存空間,但是這些內存空間直到結束才能釋放,嚴格的說這里沒有發生內存泄漏,但是例如服務器一般連續工作幾個月,這樣就會造成內存耗盡的情況,所以這種情況稱之為隱私內存泄漏

b)???????? 內存溢出指的是:程序要求分配的內存空間大小超過了系統能夠提供的內存大小,就會造成內存溢出。

c)???????? 如何避免造成內存泄漏和溢出呢?

???????????????????????? i.????????????? 盡早釋放掉無用的對象

?????????????????????? ii.????????????? 程序進行字符串操作的時候盡量使用StringBuffer代替String

????????????????????? iii.????????????? 盡量減少使用靜態成員變量

????????????????????? iv.????????????? 盡量避免集中創建對象尤其是大對象,盡量使用流操作

?????????????????????? v.????????????? 運用對象池技術以提高系統性能

????????????????????? vi.????????????? 不要再經常用到的方法中創建對象。

轉載于:https://www.cnblogs.com/BaoZiY/p/11376359.html

總結

以上是生活随笔為你收集整理的Java基础整理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。