這是我java基礎(chǔ)知識(shí)的第一篇文章,本來(lái)早就寫好了直接將markdown文檔復(fù)制過(guò)來(lái)發(fā)表就好的,結(jié)果中途遇到了兩個(gè)問(wèn)題:
- 無(wú)法使用markdown編輯器,而簡(jiǎn)書中的文章一旦采用了一種編輯方式之后就不能更改了,可以看markdown編輯器右上角有沒(méi)有預(yù)覽按鈕來(lái)判斷是否切換成功.
- 無(wú)法將合并了單元格的html代碼復(fù)制到文章里生成表格(這在typora中是可以的),最后我直接截圖復(fù)制圖片了,效果也可以.
1、8種基本數(shù)據(jù)類型:
1.1 精度擴(kuò)展
如果基本的整數(shù)和浮點(diǎn)數(shù)精度不能夠滿足需求糜烹,那么可以使用java.math包中的兩個(gè)很有用的類:BigInteger和BigDecimal這兩個(gè)類可以處理包含任意長(zhǎng)度數(shù)字序列的數(shù)值违诗。BigInteger類實(shí)現(xiàn)了任意精度的整數(shù)運(yùn)算,BigDecimal實(shí)現(xiàn)了任意精度的浮點(diǎn)數(shù)運(yùn)算疮蹦。
1.2 char類型的字節(jié)長(zhǎng)度解釋
引用:https://blog.csdn.net/nimasike/article/details/88345414
Java采用Unicode進(jìn)行編碼诸迟,char類型在內(nèi)存中占2個(gè)字節(jié)-16位,其值的范圍在0-65535之間愕乎。20 世紀(jì) 80 年代開(kāi)始啟動(dòng)設(shè)計(jì) Unicode 編碼時(shí)阵苇,人們認(rèn)為兩個(gè)字節(jié)(16 位)的代碼寬度足以對(duì)世界上各種語(yǔ)言的所有字符進(jìn)行編碼,并有足夠空間留給未來(lái)的擴(kuò)展妆毕。所以在設(shè)計(jì) Java 時(shí)決定采用 16 位的 Unicode 字符集慎玖。目前Unicode編碼范圍在0-1114111之間,顯然一個(gè)char類型已經(jīng)不能夠存65535以外的字符了笛粘,因此Java采用代理區(qū)模式來(lái)表示65535以外的字符。
代理區(qū)模式:在0-65535之間,保留了一部分?jǐn)?shù)字范圍(D800–DBFF)和(DC00–DFFF)薪前。(D800–DBFF)叫高代理區(qū)和(DC00–DFFF)叫低代理區(qū)润努,各1024,這兩個(gè)區(qū)組成一個(gè)二維的表格示括,共有1024×1024=210×210=24×216=16×65536铺浇,用它們來(lái)表示Unicode中65535以后的字符。
1.3 boolean類型的字節(jié)長(zhǎng)度解釋
引用:https://blog.csdn.net/YuanMxy/article/details/74170745
在《Java虛擬機(jī)規(guī)范》一書中的描述:“雖然定義了boolean這種數(shù)據(jù)類型垛膝,但是只對(duì)它提供了非常有限的支持鳍侣。在Java虛擬機(jī)中沒(méi)有任何供boolean值專用的字節(jié)碼指令,Java語(yǔ)言表達(dá)式所操作的boolean值吼拥,在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來(lái)代替倚聚,而boolean數(shù)組將會(huì)被編碼成Java虛擬機(jī)的byte數(shù)組,每個(gè)元素boolean元素占8位”凿可。也就是說(shuō)JVM規(guī)范指出boolean當(dāng)做int處理惑折,也就是4字節(jié),boolean數(shù)組當(dāng)做byte數(shù)組處理枯跑,這樣我們可以得出boolean類型占了單獨(dú)使用是4個(gè)字節(jié)早敬,在數(shù)組中是確定的1個(gè)字節(jié)夯秃。
那虛擬機(jī)為什么要用int來(lái)代替boolean呢?為什么不用byte或short,這樣不是更節(jié)省內(nèi)存空間嗎宙刘。經(jīng)過(guò)查閱資料發(fā)現(xiàn),使用int的原因是升敲,對(duì)于當(dāng)下32位的處理器(CPU)來(lái)說(shuō)碉渡,一次處理數(shù)據(jù)是32位(這里不是指的是32/64位系統(tǒng),而是指CPU硬件層面)评疗,32 位 CPU 使用 4 個(gè)字節(jié)是最為節(jié)省的测砂,哪怕你是 1 個(gè) bit 他也是占用 4 個(gè)字節(jié)。因?yàn)?CPU 尋址系統(tǒng)只能 32 位 32 位地尋址百匆,具有高效存取的特點(diǎn)砌些。
java規(guī)范中,沒(méi)有明確指出boolean的大小加匈。在《Java虛擬機(jī)規(guī)范》給出了4個(gè)字節(jié)存璃,和boolean數(shù)組1個(gè)字節(jié)的定義,具體還要看虛擬機(jī)實(shí)現(xiàn)是否按照規(guī)范來(lái)雕拼,所以1個(gè)字節(jié)纵东、4個(gè)字節(jié)都是有可能的,取決于java虛擬機(jī)啥寇。
1.4浮點(diǎn)類型數(shù)據(jù)的取值范圍和精度解釋
引用:https://blog.csdn.net/qq_40696431/article/details/89957747
Java語(yǔ)言的浮點(diǎn)類型默認(rèn)是double類型偎球,如果希望Java把一個(gè)浮點(diǎn)類型值當(dāng)成float類型處理洒扎,應(yīng)該在這個(gè)浮點(diǎn)類型值后緊跟f或F。例如衰絮,5.12代表一個(gè)double類型的值袍冷,占64位的內(nèi)存空間;5.12f或5.12F才表示一個(gè)float類型的值猫牡,占32位的內(nèi)存空間胡诗。當(dāng)然,也可以在一個(gè)浮點(diǎn)數(shù)后添加d或D后綴淌友,強(qiáng)制指定double類型煌恢,但通常沒(méi)必要。
Java還提供了三個(gè)特殊的浮點(diǎn)數(shù)值:正無(wú)窮大震庭、負(fù)無(wú)窮大和非數(shù)瑰抵,用于表示溢出和出錯(cuò)。例如归薛,使用一個(gè)正數(shù)除以0將得到正無(wú)窮大谍憔,使用一個(gè)負(fù)數(shù)除以0將得到負(fù)無(wú)窮大,0.0除以0.0或?qū)σ粋€(gè)負(fù)數(shù)開(kāi)方將得到一個(gè)非數(shù)主籍。正無(wú)窮大通過(guò)Double或Float類的POSITIVE_INFINITY表示习贫;負(fù)無(wú)窮大通過(guò)Double或Float類的NEGATIVE_INFINITY表示,非數(shù)則通過(guò)Double或Float類的NaN表示千元。所有的正無(wú)窮大數(shù)值都是相等的苫昌,所有的負(fù)無(wú)窮大數(shù)值都是相等的;而NaN不與任何數(shù)值相等幸海,甚至和NaN都不相等祟身。
只有浮點(diǎn)數(shù)除以0才可以得到正無(wú)窮大或負(fù)無(wú)窮大,因?yàn)镴ava語(yǔ)言會(huì)自動(dòng)把和浮點(diǎn)數(shù)運(yùn)算的0(整數(shù))當(dāng)成0.0(浮點(diǎn)數(shù))處理物独。如果一個(gè)正數(shù)除以0袜硫,則會(huì)拋出一個(gè)異常:ArithmeticException:/by zero(除以0異常)。
1.4.1浮點(diǎn)數(shù)的組成結(jié)構(gòu)
符號(hào)位S,指數(shù)位E,尾數(shù)位M
例如挡篓,一個(gè)float類型的數(shù)據(jù)占用4個(gè)字節(jié)共32位婉陷,其各個(gè)組成部分為:
符號(hào)位(S):最高位(31位)為符號(hào)位,表示整個(gè)浮點(diǎn)數(shù)的正負(fù)官研,0為正秽澳,1為負(fù)
指數(shù)位(E):23-30位共8位為指數(shù)位,這里指數(shù)的底數(shù)規(guī)定為2戏羽。并且指數(shù)位是以補(bǔ)碼的形式來(lái)劃分的(最高位為指數(shù)位的符號(hào)位担神,0為正,1為負(fù))始花。所以指數(shù)位真正范圍為:-128~127
尾數(shù)位(M):0-22位共23位為尾數(shù)位妄讯,表示小數(shù)部分的尾數(shù)孩锡,即形式為1.M或0.M,至于什么時(shí)候是 1 什么時(shí)候是 0捞挥,則由指數(shù)和尾數(shù)共同決定浮创。
1.4.2取值范圍
float和double的取值范圍是由指數(shù)的位數(shù)來(lái)決定的忧吟,其中砌函,負(fù)指數(shù)決定了浮點(diǎn)數(shù)所能表達(dá)的絕對(duì)值最小的非0數(shù),而正指數(shù)決定了浮點(diǎn)數(shù)所能表達(dá)的絕對(duì)值最大的數(shù)溜族,也即決定了浮點(diǎn)數(shù)的取值范圍讹俊。
S:符號(hào)位,E:指數(shù)位煌抒,M:尾數(shù)位
float:S1_E8_M23仍劈,指數(shù)位有8位,指數(shù)的取值范圍為-27~27-1(即-128~127)
float的取值范圍為-2^128 ~ +2^127(1038級(jí)別的數(shù))
double:S1_E11_M52寡壮,指數(shù)位有11位贩疙,指取的取值數(shù)范圍為-210~210-1(即-1024~1023)
double的取值范圍為-2^1024 ~ +2^1023(10308級(jí)別的數(shù))
1.4.3精度
float和double的精度是由尾數(shù)的位數(shù)來(lái)決定的,float的尾數(shù)位有23位况既,double的尾數(shù)位有52位这溅。
float:S1_E8_M23,尾數(shù)位有23位棒仍,2^23 = 8388608悲靴,一共7位,這意味著最多能有7位有效數(shù)字莫其,但能保證的為6位癞尚,也即float的精度為6~7位有效數(shù)字;
double:S1_E11_M52乱陡,尾數(shù)位有52位浇揩,2^52 = 45035 99627 37049 6,一共16位憨颠,同理胳徽,double的精度為15~16位有效數(shù)字。
2烙心、變量類型
類變量:定義在類中且在方法膜廊、語(yǔ)句塊外面,被final/static關(guān)鍵字修飾的變量淫茵。
成員變量(全局變量):定義在類中且在方法爪瓜、語(yǔ)句塊外面的變量就是成員變量。
局部變量:定義在方法匙瘪、語(yǔ)句塊中铆铆,需要給局部變量賦初值蝶缀,否則會(huì)出現(xiàn)編譯期異常。
變量類型 | 類變量(靜態(tài)變量) | 成員變量(全局變量薄货、實(shí)例變量) | 局部變量 |
---|---|---|---|
銷毀時(shí)間 | 在第一次被訪問(wèn)時(shí)創(chuàng)建翁都,在程序結(jié)束時(shí)銷毀 | 在對(duì)象創(chuàng)建的時(shí)候創(chuàng)建,在對(duì)象被銷毀的時(shí)候銷毀 | 在方法或者語(yǔ)句塊被執(zhí)行的時(shí)候創(chuàng)建谅猾,當(dāng)它們執(zhí)行完成后柄慰,變量將會(huì)被銷毀; |
修飾符 | public/private税娜,final static | 訪問(wèn)修飾符(public/private/default/protected) | 訪問(wèn)修飾符不能用于局部變量 |
默認(rèn)值 | 與實(shí)例變量一致 | 數(shù)值型變量是0坐搔,布爾型變量是false,引用類型變量是null敬矩,char類型是空字符('\u0000') | 沒(méi)有默認(rèn)值概行,必須要進(jìn)行初始化 |
3、修飾符
修飾符分為訪問(wèn)修飾符與非訪問(wèn)修飾符弧岳。
3.1訪問(wèn)修飾符(訪問(wèn)權(quán)限控制)
public(公有訪問(wèn)修飾符):被聲明為public的類凳忙、方法、構(gòu)造方法禽炬、接口能被任何其他類訪問(wèn)涧卵。
protected(受保護(hù)的訪問(wèn)修飾符):protected 可以修飾數(shù)據(jù)成員(變量),構(gòu)造方法瞎抛,方法成員(方法)艺演,不能修飾類(內(nèi)部類除外),且能被同一個(gè)包下的類訪問(wèn)桐臊。接口及接口的成員變量和成員方法不能聲明為 protected胎撤。
子類與基類在不同包中,子類實(shí)例可以訪問(wèn)從基類繼承而來(lái)的protected方法断凶,而不能直接訪問(wèn)基類的protected方法伤提。(僅針對(duì)protected方法)
default(默認(rèn)訪問(wèn)修飾符):使用默認(rèn)訪問(wèn)修飾符聲明的變量和方法,對(duì)同一個(gè)包內(nèi)的類是可見(jiàn)的认烁。接口里的變量都隱式聲明為 public static final,而接口里的方法默認(rèn)情況下訪問(wèn)權(quán)限為 public肿男。
private(私有訪問(wèn)修飾符):在同一類內(nèi)可見(jiàn)。使用對(duì)象:變量却嗡、方法舶沛。 注意:不能修飾類(外部類)
訪問(wèn)控制修飾符 | 當(dāng)前類 | 同一包內(nèi) | 不同包內(nèi)(子孫類) | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y/N | N |
default | Y | Y | N | N |
private | Y | N | N | N |
3.2非訪問(wèn)修飾符
- static 修飾符,用來(lái)修飾類方法和類變量窗价。
-
靜態(tài)變量:
static 關(guān)鍵字用來(lái)聲明獨(dú)立于對(duì)象的靜態(tài)變量如庭,無(wú)論一個(gè)類實(shí)例化多少對(duì)象,它的靜態(tài)變量只有一份拷貝撼港。 靜態(tài)變量也被稱為類變量坪它。局部變量不能被聲明為 static 變量骤竹。
靜態(tài)方法:
static 關(guān)鍵字用來(lái)聲明獨(dú)立于對(duì)象的靜態(tài)方法。靜態(tài)方法不能使用類的非靜態(tài)變量往毡。靜態(tài)方法從參數(shù)列表得到數(shù)據(jù)蒙揣,然后計(jì)算這些數(shù)據(jù)。
final 修飾符开瞭,用來(lái)修飾類懒震、方法和變量,final 修飾的類不能夠被繼承惩阶,修飾的方法不能被繼承類重新定義挎狸,修飾的變量為常量,是不可修改的断楷。
abstract 修飾符,用來(lái)創(chuàng)建抽象類和抽象方法崭别。
synchronized 和 volatile 修飾符冬筒,主要用于線程的編程。
4茅主、接口舞痰、抽象類的注意事項(xiàng)
4.1抽象類
抽象類與抽象方法都由abstract修飾符修飾,抽象類不能用來(lái)實(shí)例化對(duì)象诀姚,聲明抽象類的唯一目的是為了將來(lái)對(duì)該類進(jìn)行擴(kuò)充响牛,它需要被一個(gè)子類繼承。
抽象類中含有抽象方法也可以含有非抽象方法(抽象類中也可以不包含抽象方法)赫段,但若類中含有抽象方法則該類必須是抽象類呀打。
抽象方法沒(méi)有方法體public abstract sample();,該方法的具體實(shí)現(xiàn)由子類提供(除非子類也是抽象類)糯笙,且子類必須要實(shí)現(xiàn)所有的抽象方法贬丛。
4.2接口
接口在 Java 中是一個(gè)抽象類型,是抽象方法的集合给涕;接口通過(guò)關(guān)鍵字 interface
來(lái)定義豺憔。
接口是隱式抽象的,所以聲明時(shí)沒(méi)有必要使用 abstract
關(guān)鍵字够庙;接口的每個(gè)方法都是隱式抽象的恭应,所以同樣不需要使用 abstract
關(guān)鍵字;接口中的方法都是隱式 public
的耘眨。
抽象類存在的意義:
如果類直接實(shí)現(xiàn)該接口的話昼榛,就需要對(duì)接口中的所有方法進(jìn)行實(shí)現(xiàn)。
如果我們只需要對(duì)接口中某一部分方法進(jìn)行實(shí)現(xiàn)的話毅桃,就可以使用一個(gè)抽象類作為中間件褒纲,即適配器(AdapterCoach)准夷,用這個(gè)抽象類實(shí)現(xiàn)接口,并對(duì)抽象類中的方法置空(方法體只有一對(duì)花括號(hào))莺掠,這時(shí)候新類就可以繞過(guò)接口衫嵌,繼承抽象類,我們就可以只對(duì)需要的方法進(jìn)行覆蓋彻秆,而不是接口中的所有方法楔绞。
接口與抽象類的區(qū)別與聯(lián)系:
抽象類可以有非抽象方法,但接口沒(méi)有唇兑。
接口中的成員變量隱式為
static final
酒朵,但抽象類不是的。一個(gè)類可以實(shí)現(xiàn)(implements)多個(gè)接口扎附,但只能繼承(extends)一個(gè)抽象類(可以多重繼承)蔫耽。
接口中的所有方法都必須實(shí)現(xiàn);若子類也是抽象類則抽象方法可以不用全部實(shí)現(xiàn)留夜,否則也要全部實(shí)現(xiàn)匙铡。
接口可以繼承接口,抽象類不可以繼承接口碍粥,但可以實(shí)現(xiàn)接口鳖眼,抽象類可以繼承實(shí)體類。