第二部分 面向?qū)ο驩OP(重點(diǎn))中

類之間的關(guān)系:

1.組合(has-a):一個(gè)類的方法操縱另一個(gè)類的對(duì)象? //? ,汽車類has-a引擎類

2.繼承(is-a):狗 is-a動(dòng)物

多用組合少用繼承,通過判斷是否需要從新類向父類進(jìn)行向上轉(zhuǎn)型來決定是否需要用繼承


函數(shù)(方法)? ? ? ? ? ? ? ?

1.用來表示做什么事,滿足某些功能所提供的一些工具。

2.方法順序執(zhí)行,無論是靜態(tài)還是非靜態(tài)的方法 。

同類中調(diào)用方法:方法名(參數(shù)列表)

定義模式:

修飾符? 返回值類型? 函數(shù)名(參數(shù)類型 形參...){

執(zhí)行語句;

return 返回值;? //返回值表示的是方法運(yùn)行后得出的結(jié)果,盡量不要返回引用類型,返回它的拷貝

}

注: 1.明確方法結(jié)果=明確返回值類型,對(duì)于返回值,聲明方法時(shí)聲明了返回值,就一定要return 返回值,不需要返回值用void聲明

? ? ? ? ? 2.實(shí)現(xiàn)功能時(shí)是否有未知內(nèi)容參與運(yùn)算,其實(shí)就是明確參數(shù)列表,函數(shù)中只能調(diào)用函數(shù),不能定義函數(shù)。

? ? ? ? 3.實(shí)參是創(chuàng)建對(duì)象時(shí)傳入的具體數(shù)字,形參是用于接收實(shí)際數(shù)字的,創(chuàng)建方法括號(hào)中的參數(shù),實(shí)參可以是比形參小的類型。

? ? ? ? 4.當(dāng)方法1里調(diào)用方法2的時(shí)候,方法2先執(zhí)行,方法1的局部變量會(huì)在棧上呆許久,直至方法2執(zhí)行完。

? ? ? ? 5.判斷方法執(zhí)行后對(duì)后續(xù)方法是否有影響就是判斷方法應(yīng)不應(yīng)該有返回值。

? ? ? ? 6.return可以用來結(jié)束一個(gè)方法,及時(shí)這個(gè)函數(shù)聲明是沒有用到返回值,return代表方法結(jié)束。


重載:同類中,出現(xiàn)同名函數(shù),若參數(shù)列表個(gè)數(shù),類型或順序不同,則為函數(shù)重載(可將功能代碼封裝,便于對(duì)該功能的復(fù)用)? 注:返回值不同不能構(gòu)成重載,當(dāng)同類兩個(gè)方法只有返回值不同是不可能創(chuàng)建成功的,因?yàn)檎{(diào)用的時(shí)候虛擬機(jī)不可能區(qū)分出來!


方法參數(shù):方法參數(shù)可以是對(duì)象,這樣這個(gè)方法就可以對(duì)這個(gè)對(duì)象的狀態(tài)進(jìn)行修改特定的數(shù)值

方法會(huì)運(yùn)用形參,調(diào)用的一方傳入實(shí)參,形參有幾個(gè)參數(shù),實(shí)參就必須輸入幾個(gè)參數(shù)

java是通過值傳遞也就是拷貝傳遞,所以當(dāng)把實(shí)參傳給形參只是把實(shí)參的字節(jié)組合拷貝后傳遞,兩者互不影響

例如有一個(gè)漲工資的方法,又有一個(gè)漲特定工資的方法,漲特定工資的方法的參數(shù)可以是對(duì)象,然后再內(nèi)部中調(diào)用漲工資方法

public void addSalary1(Employee e){? e.addsalary(400) ;? ? ? ? }

public void addSalary (int x){? ? ? double salary+=x;}

java采用的是按值調(diào)用,也就是說方法得到的是所有參數(shù)值的一個(gè)拷貝

(1)方法參數(shù)為基本類型(包括字符串),參數(shù)不可能修改

double percent

harry.raiseSalary(percent)? //方法調(diào)用后percent值不變,變得是percent的拷貝,然而方法執(zhí)行后拷貝不再使用

(2)方法參數(shù)為對(duì)象引用,參數(shù)是引用對(duì)象變量的拷貝,但是都指向同一個(gè)引用,方法結(jié)束后參數(shù)不再使用,但是引用的對(duì)象發(fā)生變化,因此可以改變一個(gè)對(duì)象參數(shù)的狀態(tài)

(3)一個(gè)方法不能讓對(duì)象參數(shù)引用一個(gè)新對(duì)象

Java采用的不是引用調(diào)用而是值傳遞

public static void swap(Employee e1,Employee e2){

Employee temp=x;

y=temp;}

此時(shí)x,y的引用確實(shí)發(fā)生了交換但是,方法執(zhí)行后x,y不再使用,所以a,b并沒有發(fā)生變化

若建立兩個(gè)對(duì)象,調(diào)用這兩個(gè)方法并不會(huì)改變兩個(gè)對(duì)象的引用,這個(gè)方法交換的是a,b的拷貝,而方法執(zhí)行后,拷貝不再使用,所以只有直接操作引用對(duì)象的才會(huì)發(fā)生變化,而操作在用于接收引用的變量時(shí),不會(huì)發(fā)生變化

注:值傳遞表示的是實(shí)參傳給形參的只是實(shí)參拷貝的值,對(duì)值操縱不會(huì)影響實(shí)參

將p1拷貝一份變成p2,方法里操縱的是p2


引用傳遞:傳遞的是實(shí)參的地址,可以直接對(duì)實(shí)參進(jìn)行改變。

圖片發(fā)自簡(jiǎn)書App


為什么java不是引用傳遞:雖然在傳遞一個(gè)引用型變量的時(shí)候,形參的運(yùn)算可以改變引用的值,但是,但是其原理并不是直接就把實(shí)參的地址傳給了形參,而是將實(shí)參的引用拷貝了一份傳遞給了形參,所以當(dāng)你想交換兩個(gè)引用的話調(diào)用方法的時(shí)候,你交換的只會(huì)是兩個(gè)引用的拷貝,而實(shí)際上的引用并沒有發(fā)生交換。也就是說java可以改變引用狀態(tài),但是不能讓對(duì)象參數(shù)引用一個(gè)新對(duì)象。


final

(1)實(shí)例域? ? ?

final修飾的實(shí)例域定義后必須被初始化(可以通過聲明和直接賦值同時(shí)進(jìn)行或者聲明后用構(gòu)造方法初值化),并且實(shí)例域設(shè)置為final后,創(chuàng)建對(duì)象后也就是構(gòu)造器執(zhí)行后,這個(gè)域的值被設(shè)置表示最終值,并且在后面的操作中,不能對(duì)它進(jìn)行修改,也就是說不可以有set方法改變其狀態(tài),final盡量修飾的是不可變的類(String等),或基本類型,對(duì)于可變類盡量不要用,final Date hiredate僅僅意為著hiredate中的對(duì)象引用不再發(fā)生變化,而引用地址里的內(nèi)容可以發(fā)生變化。

final int a; a=4;是不對(duì)的? ? ? ? 應(yīng)該使用final int a=4;或者用構(gòu)造函數(shù)

(2)類:不可被繼承

(3)方法:不可重寫方法

(4)修飾局部變量可以先聲明后初始化? ? ? ? ? final int a; a=4;是可以的? ? //因?yàn)樘摂M機(jī)沒有給它賦初始值


Static靜態(tài)域,生命周期長(zhǎng)

(1)被靜態(tài)修飾的成員可以被類名直接調(diào)用(不和對(duì)象關(guān)聯(lián)在一起),類加載是加載進(jìn)內(nèi)存

(2)優(yōu)先于對(duì)象調(diào)用

(3)位于內(nèi)存的方法區(qū)中,實(shí)現(xiàn)同類對(duì)象數(shù)據(jù)共享,也就是說一個(gè)對(duì)象對(duì)它修改后,另一個(gè)對(duì)象訪問的是它修改后的值

(4)靜態(tài)方法(類方法)只能訪問靜態(tài)成員(因?yàn)殪o態(tài)的方法不知道堆上有哪些實(shí)例)

(5)少使用靜態(tài)變量,消耗內(nèi)存大

(6)靜態(tài)方法不能重寫,因?yàn)樗呀?jīng)確定被哪個(gè)類所擁有

? ? ? 靜態(tài)變量是隨著類的產(chǎn)生而產(chǎn)生,類只要程序一運(yùn)行就會(huì)產(chǎn)生,所以說只要程序還是運(yùn)行的,靜態(tài)變量就會(huì)一直存在,而無論你創(chuàng)建了多少個(gè)對(duì)象訪問的的都是同一個(gè)靜態(tài)變量

? ? ? 而對(duì)于成員變量來說,在一個(gè)對(duì)象中訪問,不管調(diào)用多少次方法,訪問的都是同一個(gè)成員變量,而當(dāng)新創(chuàng)建一個(gè)對(duì)象,它就會(huì)將這個(gè)成員變量重新初始化,而對(duì)于靜態(tài)變量來說,不管創(chuàng)建多少對(duì)象訪問的這個(gè)變量都是上一個(gè)對(duì)象操縱后更改后的值,不會(huì)因?yàn)橐粋€(gè)對(duì)象的創(chuàng)建而重新初始化,它初始化的方法是重新運(yùn)行這個(gè)程序

注:不管創(chuàng)建多少個(gè)對(duì)象,一個(gè)類只有一個(gè)static變量

何時(shí)用:1.成員變量:確定該成員變量是否所有對(duì)象都一樣,一樣用static修飾(固定公式,人眼睛瞪)

? ? ? ? ? ? 2.成員函數(shù):是否調(diào)用特定數(shù)據(jù),(靜態(tài)方法不能調(diào)用實(shí)例域(狀態(tài)),表示一種不依靠對(duì)象的行為

public static void main(String[] args)? //main是一個(gè)靜態(tài)方法,執(zhí)行并創(chuàng)建程序所需要的對(duì)象

如果一個(gè)方法與其對(duì)象及實(shí)例對(duì)象絲毫沒有關(guān)系就可以用static修飾,如果有關(guān)就不能用它修飾

類常量:希望某個(gè)常量在一個(gè)類多個(gè)方法使用? ? static final修飾(必須初始化)

3.static代碼塊

語法: static? {? ? ? ? 隨著類加載被執(zhí)行? ? ? ? ? ? ? }

應(yīng)用場(chǎng)景:加載一些文件,圖片,配置文件等(只能被執(zhí)行一次)


所有的靜態(tài)初始化塊都優(yōu)先執(zhí)行,其次才是非靜態(tài)的初始化塊和構(gòu)造函數(shù),它們的執(zhí)行順序是:

父類的靜態(tài)屬性初始化? ? //靜態(tài)屬性初始化和靜態(tài)初始化塊是順序呢執(zhí)行的哪個(gè)在前執(zhí)行哪個(gè)

父類的靜態(tài)初始化塊

子類的靜態(tài)屬性初始化

子類的靜態(tài)初始化塊

父類屬性定義初始化

父類的初始化塊

父類構(gòu)造代碼塊

父類的構(gòu)造函數(shù)

子類的屬性定義初始化

子類的初始化塊

子類構(gòu)造代碼塊

子類的構(gòu)造函數(shù)

賦值


成員變量(實(shí)例變量)和局部變量區(qū)別

(1)成員變量聲明在類中方法外(隨對(duì)象產(chǎn)生而產(chǎn)生,隨對(duì)象銷毀而銷毀),與方法沒有位置的先后之分(方法也叫成員方法)

(2)局部變量聲明在方法內(nèi)? (隨方法產(chǎn)生而產(chǎn)生),方法參數(shù)相當(dāng)于局部變量

(3)局部變量使用前必須初始化。

(4)局部變量存在于棧,成員變量存在與堆,所以局部變量和成員變量重名時(shí)不會(huì)報(bào)錯(cuò),調(diào)用時(shí)采用就近原則,例:方法內(nèi)訪問的是同名的局部變量,類內(nèi)訪問的是同名的成員變量

(5)局部變量可以不在定義的同時(shí)被賦值,可以先定義然后再被賦值

(6)成員變量不能定義初始化完成后再重新賦值。(為什么要這么規(guī)定,因?yàn)槌蓡T變量如果在定義的時(shí)候沒有初始化,后期卻允許其賦值,這樣會(huì)導(dǎo)致在對(duì)象創(chuàng)建的時(shí)候創(chuàng)建出的每一個(gè)對(duì)象的成員變量都相同),對(duì)象創(chuàng)建執(zhí)行順序,成員變量初始化--》構(gòu)造函數(shù)--》賦值

class a{ int i; i=3;}? 這是錯(cuò)的


this關(guān)鍵字

指向自身的引用,當(dāng)前對(duì)象,因此static方法中不可用

1.全局變量與局部變量重名時(shí),指向全局變量

2.成員變量,成員方法只能由對(duì)象調(diào)用,但是方法中使用成員變量,方法的時(shí)候卻沒有使用對(duì)象,其實(shí)這時(shí)候省略了一個(gè) this.? 表示的是當(dāng)前的對(duì)象

3.在函數(shù)內(nèi)部當(dāng)作當(dāng)前類的對(duì)象,從而調(diào)用其它方法(常調(diào)用構(gòu)造方法,且必須放在第一行)? ? 不常用

add(int arg1,int arg2){this.arg1=arg1;this.arg2=arg2}

add(int arg1,int arg2,int arg3){? this(arg1,arg2);this.arg3=arg3 }? 優(yōu)點(diǎn):減少了公共代碼的多次編寫

參數(shù)少掉參數(shù)多,把多出來的直接設(shè)置值? add(int arg1,int arg2){this(arg1,arg2,1)}


訪問權(quán)限

public? 被所有類使用(公共類只有一個(gè))

private? 只能被定義他們的類所使用(修飾構(gòu)造方法后該類不能被繼承)

包訪問權(quán)限(Default):未指定默認(rèn)訪問權(quán)限? 被同一包所訪問

protected同包+不同包子類


類設(shè)計(jì)技巧:

1.保證數(shù)據(jù)私有,確保封裝性

2.對(duì)數(shù)據(jù)初始化

3.不要在類中過多使用基本類型,用其它類代替多個(gè)相關(guān)的基本類型的使用,比如用Address代替 street和city基本類型

4.不是所有域都需要獨(dú)立的訪問器和更改器

5.將職責(zé)過多的類分解

6.類名和方法名要體現(xiàn)出它們的職責(zé)


三大特性

封裝(保證安全性)將函數(shù)方法內(nèi)容進(jìn)行封裝,把屬性隱藏private,提供方法public進(jìn)行訪問

防止通過對(duì)象.實(shí)例變量訪問實(shí)例變量和隨意修改實(shí)例變量的值,對(duì)實(shí)例變量添加絕對(duì)領(lǐng)域,沒有其它人可以直接惡搞我的變量,強(qiáng)迫想要使用此實(shí)例變量的人必須通過set和get方法訪問

比如一個(gè)貓的年齡為實(shí)例變量,如果不用private修飾,可以直接將它更改為0歲,這樣是不合理的,所以將實(shí)例變量用private修飾,然后創(chuàng)建set和get方法,set方法內(nèi)進(jìn)行判斷,如果為0歲不進(jìn)行賦值,不封裝的類是很可怕的,類似于:“老王忘記把他的貓封裝了,然后他的貓就被碾平了”

set方法可以執(zhí)行任何動(dòng)作,然后直接暴漏public的實(shí)例變量不可以。

優(yōu)勢(shì):雖然可能一般set中沒有執(zhí)行任何操作,但是以后改變想法不需要改變其它部分程序,假如說所有人都使用到你的類及共有變量,萬一有一天突然發(fā)現(xiàn)這個(gè)變量需要檢查,那不是所有人都要跟著改成set方法么,而已經(jīng)設(shè)置的人,只要直接改變set里的檢查內(nèi)容就可以了,所以為了以后的考慮,直接存儲(chǔ)訪問的效率雖高,但是卻比不上get和set方法的這個(gè)好處

訪問器get開頭,更改器開頭set

void setTime(String time){? ? ? ? ? ? ? ? ? //setter方法有且只有一個(gè)參數(shù)

this.time=time;? }

String getTime(){? ? ? ? ? ? ? ? ? ? ? ? ? ? //getter必須有返回值,返回你想要獲得的屬性

return time? }

對(duì)于方法:只要對(duì)外功能不變,可以任意修改方法內(nèi)部代碼,一開始方法一開始有屬性name, return name修改后屬性為firstname和lastname ,return firstname+lastname,只是改變了實(shí)現(xiàn)方式,結(jié)果相同,也就是所說的重構(gòu)(代碼寫完后找到了更好的實(shí)現(xiàn)方式)


繼承(破壞了封裝)class (子類名) extends( 父類名):

擁有父類的屬性和方法,通過子類對(duì)象.父類方法()訪問,不可多繼承,可多層次繼承

父類和子類有相同屬性,子類中訪問屬性時(shí)默認(rèn)訪問的是子類的屬性,若想訪問父類屬性,使用super.屬性

子類不能直接訪問父類私有屬性,必須調(diào)用訪問方法,super.方法 調(diào)用父類方法()

當(dāng)調(diào)用子類構(gòu)造方法的時(shí)候,要先調(diào)用父類構(gòu)造方法

super關(guān)鍵字,子類構(gòu)造方法第一行隱藏super()語句,若父類構(gòu)造方法有參,則子類必須寫super語句 super(參數(shù)),必須放在構(gòu)造方法的第一個(gè)(父母先出生,然后孩子再出生)

super與this引用不一樣,this標(biāo)識(shí)一個(gè)對(duì)象引用,可以賦給另一個(gè)對(duì)象變量

super是一個(gè)指示編譯器調(diào)用超類方法的特殊關(guān)鍵字,不是對(duì)象引用,不可賦值給另一對(duì)象變量

super和this都想放在第一行,所以它倆不能同時(shí)使用,

? ? ? ? ? ? ? ? ? ? 所以super和this不能共存??!


父類有參,父類無參,子類無參,子類有參,num=4

重寫:子類方法覆蓋父類方法,重寫方法必須遵守規(guī)則,重寫擴(kuò)展了子類的功能。

(1)參數(shù)必須相同,返回值必須兼容(是其子類)

(2)不可使用更為嚴(yán)格的訪問權(quán)限

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Child child=new Child();


輸出的是:父類構(gòu)造方法? 0? 4? 子類構(gòu)造方法

為什么是0? 因?yàn)樽宇恠uper()執(zhí)行后才執(zhí)行構(gòu)造代碼塊,num才被賦值完成


多態(tài):一個(gè)Person變量既可以引用Person對(duì)象,也可以引用任何一個(gè)Person子類對(duì)象

一個(gè)子類對(duì)象創(chuàng)建的時(shí)候,在它內(nèi)部其實(shí)還有一個(gè)父類對(duì)象,這也就可以理解為什么父類引用可以指向子類對(duì)象,因?yàn)槠鋵?shí)子類對(duì)象內(nèi)部包含著父類對(duì)象

父類引用指向的是? ? 子類對(duì)象中的父類對(duì)象

多態(tài)意味著很多形式,如果引用是一個(gè)遙控器,繼承樹越往下走,遙控器的按鈕越來越多,一個(gè)子類的遙控器可以操縱它自己的特有方法和它父類的方法


若不用子類特有方法或?qū)傩?/b>(父類引用不能訪問子類特有方法),最好使用父類引用指向子類對(duì)象? Person e=new Student()

寫大程序建議用多態(tài),若想從訪問Student改成Teacher不用改方法,只改實(shí)例就可以,因?yàn)閟tudent和teacher方法類型相同,只是實(shí)現(xiàn)結(jié)果不同

Person e=new Teacher()

多態(tài)的作用:當(dāng)你創(chuàng)建父類引用指向子類對(duì)象的時(shí)候,在后期你多次調(diào)用了這個(gè)子類對(duì)象中的方法,而你突然又不想指向這個(gè)子類對(duì)象了,這時(shí)你可以直接把父類引用指向另一個(gè)子類對(duì)象,后面的調(diào)用都可以不用改,這就可以讓你在后期維護(hù)的時(shí)候少更改代碼


動(dòng)態(tài)綁定也就是多態(tài)

動(dòng)態(tài)綁定也就是說java是運(yùn)用的后期綁定機(jī)制,在運(yùn)行的時(shí)候父類引用與子類對(duì)象就進(jìn)行了綁定,確定了這個(gè)父類引用指向了哪一個(gè)

注:1.屬性在編譯時(shí)確認(rèn),因此不能調(diào)用子類屬性

2.可調(diào)用子類重寫的方法,特有方法不能調(diào)用

方法執(zhí)行過程:1.調(diào)用x.f(param),編譯器列舉出所有同名的方法,參數(shù)可不同作為候選

3..進(jìn)行重載解析,也就是找到符合調(diào)用時(shí)參數(shù)的方法

4..調(diào)用方法時(shí),先去子類中找其方法,若子類中沒有再去父類中找這個(gè)方法

由于每次都要搜索開銷大,虛擬機(jī)實(shí)現(xiàn)為每個(gè)類創(chuàng)建方法表

注意:(類的屬性不存在多態(tài)只有方法存在多態(tài))

1:當(dāng)父類和子類具有相同的非靜態(tài)成員變量,那么在多態(tài)下訪問的是父類的成員變量

2:當(dāng)父類和子類具有相同的靜態(tài)成員變量,那么在多態(tài)下訪問的是父類的靜態(tài)成員變量

所以:父類和子類有相同的成員變量,多態(tài)下訪問的是父類的成員變量。

3:當(dāng)父類和子類具有相同的非靜態(tài)方法(就是子類重寫父類方法),多態(tài)下訪問的是子類的成員方法。

4:當(dāng)父類和子類具有相同的靜態(tài)方法(就是子類重寫父類靜態(tài)方法),多態(tài)下訪問的是父類的靜態(tài)方法。

出現(xiàn)的問題,多態(tài)時(shí)使用父類引用指向子類對(duì)象時(shí),想訪問屬性訪問的是子類屬性時(shí),卻訪問到了父類,解決辦法:因?yàn)榉椒J(rèn)訪問的是子類方法,所以將屬性私有化,通過方法進(jìn)行訪問屬性就可以訪問到子類屬性。

非靜態(tài)

1:編譯時(shí)期,參考引用型變量所屬的類是否有調(diào)用的方法,如果有編譯通過。沒有編譯失敗

2:運(yùn)行時(shí)期,參考對(duì)象所屬類中是否有調(diào)用的方法。

3:總之成員函數(shù)在多態(tài)調(diào)用時(shí),編譯看左邊,運(yùn)行看右邊。

在多態(tài)中,成員變量的特點(diǎn),無論編譯和運(yùn)行參考左邊(引用型變量所屬的類)。

在多態(tài)中,靜態(tài)成員函數(shù)特點(diǎn),無論編譯和運(yùn)行都參考右邊


上溯造型? Animals a=new Dog

下溯造型:下溯造型必須用instanceof判斷是否同類型,若想訪問Dog特有屬性需要強(qiáng)轉(zhuǎn)

Dog d=(Dog)a,盡量少用強(qiáng)制轉(zhuǎn)換,多考慮父類是否設(shè)計(jì)合理,是否缺少方法

造型應(yīng)用,加功能時(shí)不用修改主結(jié)構(gòu),比如獲取信息,只寫一個(gè)方法就可以

public void f(Animals a){ System.out.println(name);}

注:傳參時(shí)可以把類當(dāng)參數(shù)放在構(gòu)造函數(shù)或定義屬性,最好用父類,提高可擴(kuò)展性,運(yùn)用動(dòng)態(tài)綁定訪問子類方法

數(shù)組中的對(duì)象如同其它對(duì)象一樣,唯一差別是如何取得


繼承設(shè)計(jì)的技巧

1.將公共操作和域放在超類,將具有的公共特征和行為放在父類中,特殊的行為放在子類中

2.域盡量用private修飾,少用protected修飾

3.使用繼承實(shí)現(xiàn)”is-a“關(guān)系比如:三角形是一個(gè)圖形

4.除非所有繼承的方法都有意義,否則不要使用繼承(父類方法子類都用到使用繼承)

5.在覆蓋方法時(shí),不要改變預(yù)期行為

6.盡量使用多態(tài)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容