摘要:而面向?qū)ο髣t是向程序員提供表示問(wèn)題空間中元素的工具,我們將問(wèn)題空間中的元素及其在解空間中的表示稱為對(duì)象。為什么要把對(duì)象看作是服務(wù)提供者呢這是將問(wèn)題分解為對(duì)象集合的一種合理方式。職能太多,可能會(huì)導(dǎo)致對(duì)象的內(nèi)聚性降低。在試圖將子類對(duì)象當(dāng)作其基類
計(jì)算機(jī)是頭腦延伸的工具,是一種不同類型的表達(dá)媒體。本文以背景性的和補(bǔ)充性的材料,介紹包括開發(fā)方法概述在內(nèi)的面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-oriented Programming,OOP)的基本概念。
本文通過(guò)概念+代碼的方式,來(lái)幫助讀者了解面向?qū)ο蟪绦蛟O(shè)計(jì)的全貌。
抽象過(guò)程機(jī)器模型:位于解空間內(nèi),是對(duì)問(wèn)題建模的地方;可以這樣理解,匯編語(yǔ)言和命令式語(yǔ)言,在解決問(wèn)題時(shí)要基于計(jì)算機(jī)的架構(gòu);因此架構(gòu)限定了解決方案,所以說(shuō)機(jī)器模型是解空間。
實(shí)際待解決問(wèn)題:問(wèn)題空間,是問(wèn)題存在的地方
抽象的類型和質(zhì)量,決定了人們所能夠解決的問(wèn)題的復(fù)雜性。抽象的類型指的是“所抽象的是什么”。一種是在機(jī)器模型和實(shí)際待解決問(wèn)題的模型之間建立聯(lián)系的抽象;另一種是只針對(duì)待解決問(wèn)題建模。而面向?qū)ο髣t是向程序員提供表示問(wèn)題空間中元素的工具,我們將問(wèn)題空間中的元素及其在解空間中的表示稱為“對(duì)象”。
萬(wàn)物皆是對(duì)象;
程序是對(duì)象的集合,對(duì)象間方法的調(diào)用是程序運(yùn)行的基本表現(xiàn);
對(duì)象可以包含其他對(duì)象;
每個(gè)對(duì)象都擁有其特定的類型;
某一特定類型的所有對(duì)象都可以接收同樣的方法調(diào)用;
什么是對(duì)象?對(duì)象具有狀態(tài)、行為和標(biāo)識(shí)。每一個(gè)對(duì)象都可以擁有內(nèi)部數(shù)據(jù)和方法,并且可以唯一的與其他對(duì)象區(qū)分開來(lái)每個(gè)對(duì)象都應(yīng)該都?xì)w屬于一個(gè)類或接口
對(duì)象:具有狀態(tài)、行為和標(biāo)識(shí)的實(shí)體。如銀行存款賬戶是一個(gè)類,那么具體的每個(gè)人的銀行存款賬戶就是這個(gè)類目下的對(duì)象。
類:可以看作類型來(lái)考慮。比如說(shuō)鳥類,是動(dòng)物中的其中一種類型。
所有的對(duì)象都是唯一的,但同時(shí)具有相同的特性和行為的對(duì)象也都?xì)w屬于某個(gè)特定的類。
類在Java中用關(guān)鍵詞class表示。每個(gè)類的對(duì)象都具有某種共性和個(gè)性,如銀行存款賬戶,每個(gè)賬戶中都有余額的屬性,但每個(gè)賬戶中的余額又不同。在實(shí)際中,面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言都用class關(guān)鍵字來(lái)表示數(shù)據(jù)類型,換而言之,每一個(gè)類都是一個(gè)數(shù)據(jù)類型。程序員可以自由地添加新的類(數(shù)據(jù)類型)來(lái)擴(kuò)展編程語(yǔ)言,對(duì)實(shí)際問(wèn)題進(jìn)行處理。
面向?qū)ο蟮奶魬?zhàn)之一,就是在問(wèn)題空間的元素和解空間的對(duì)象之間創(chuàng)建一對(duì)一的映射。
獲取有用對(duì)象,必須以某種方式對(duì)對(duì)象進(jìn)行請(qǐng)求,使對(duì)象完成各種任務(wù)。類型決定接口,而接口決定對(duì)象能滿足的請(qǐng)求。就比如鳥類型,其提供的接口有飛翔,因此其能滿足飛翔的請(qǐng)求。在接口確定了某一特定對(duì)象能夠發(fā)出的請(qǐng)求后,接口的實(shí)現(xiàn)掌控著請(qǐng)求的具體行為的展現(xiàn)方式。在類型中,每一個(gè)可能的請(qǐng)求都有一個(gè)方法與之關(guān)聯(lián),當(dāng)向?qū)ο蟀l(fā)送請(qǐng)求時(shí),與之關(guān)聯(lián)的方法就會(huì)被調(diào)用。
以下代碼是獲取一個(gè)對(duì)象并調(diào)用其中的方法實(shí)例(你可以暫時(shí)不用理解,只需要知道形式即可,后面再反過(guò)來(lái)看就好)
public class Light { //開燈 public void on() { System.out.println("Light is on!"); } //關(guān)燈 public void off() { System.out.println("Light is off!"); } //這里是獲取一個(gè)對(duì)象并調(diào)用其中方法的實(shí)例 public static void main(String [] args) { //這里是核心代碼,開燈操作 Light lt = new Light(); lt.on(); } }
### 對(duì)象是服務(wù)提供者
程序通過(guò)調(diào)用其他對(duì)象提供的服務(wù)來(lái)向用戶提供服務(wù)。程序員的目標(biāo)就是去創(chuàng)建(或者最好是從現(xiàn)有的代碼庫(kù)中尋找)能夠提供解決問(wèn)題所需服務(wù)的一系列對(duì)象。
為什么要把對(duì)象看作是服務(wù)提供者呢?
這是將問(wèn)題分解為對(duì)象集合的一種合理方式。比如說(shuō),你正在創(chuàng)建一個(gè)簿記系統(tǒng),那么,這個(gè)系統(tǒng)可以拆分為:我需要一個(gè)包括了預(yù)定義的簿記輸入屏幕的對(duì)象、一個(gè)執(zhí)行簿記計(jì)算的對(duì)象集合以及一個(gè)處理在不同的打印機(jī)上打印支票和開發(fā)票的對(duì)象。
它有助于提高對(duì)象的內(nèi)聚性。就像上面所定義的簿記系統(tǒng),每個(gè)對(duì)象都可以很好地完成一項(xiàng)任務(wù),但是它并不試圖做更多的事情。職能太多,可能會(huì)導(dǎo)致對(duì)象的內(nèi)聚性降低。簡(jiǎn)而言之,每個(gè)對(duì)象只做它該做的事。
程序訪問(wèn)權(quán)限控制將程序開發(fā)人員按照角色劃分為類創(chuàng)建者和客戶端程序員。類創(chuàng)建者創(chuàng)建新的數(shù)據(jù)類型,而客戶端程序員在其應(yīng)用中使用類創(chuàng)建者創(chuàng)建的新數(shù)據(jù)類型。如此一來(lái),客戶端程序員的主要目的就是收集各種用來(lái)實(shí)現(xiàn)快速應(yīng)用開發(fā)的類;而類創(chuàng)建者的目的則是構(gòu)建類,并向客戶端程序員暴露必須的部分。
為什么類創(chuàng)建者需要對(duì)類的某些部分進(jìn)行隱藏呢?或者說(shuō),為什么需要進(jìn)行訪問(wèn)權(quán)限控制呢?
讓客戶端程序員無(wú)法觸及他們不該觸及的部分,讓客戶端程序員分清楚,哪些東西對(duì)他們來(lái)說(shuō)是必須的,哪些是可以忽略的。
允許庫(kù)設(shè)計(jì)者可以改變類內(nèi)部的工作方式而不用擔(dān)心會(huì)影響到客戶端程序員。因?yàn)閷?duì)客戶端程序員所提供的那一部分可見(jiàn)的內(nèi)容總是不變的,而庫(kù)設(shè)計(jì)者改變的是其中隱藏的部分。
修飾符 | 類內(nèi)部 | 同包 | 子類 | 任何地方 |
---|---|---|---|---|
private | √ | × | × | × |
無(wú) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
public:可以修飾外部類、屬性、方法;
protected:只能修飾屬性和方法;
private:只能修飾屬性、方法、內(nèi)部類;
復(fù)用具體實(shí)現(xiàn)代碼復(fù)用是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言所提供的最了不起的優(yōu)點(diǎn)之一。
代碼復(fù)用的基本方式:
直接使用該類的一個(gè)對(duì)象;
可以將某個(gè)類的一個(gè)對(duì)象置于一個(gè)新類中,作為新類的成員出現(xiàn);
類之家的關(guān)系關(guān)系是指事物之間存在單向或者相互的作用力或者影響力的狀態(tài)。
在兩個(gè)類之間存在有關(guān)系和沒(méi)關(guān)系兩種情況,在有關(guān)系的情況下,其關(guān)系包括以下六種類型
類關(guān)系 | 英文名 | 描述 | 強(qiáng)權(quán)方 | UML圖表示 | 示例說(shuō)明 |
---|---|---|---|---|---|
繼承 | extends | 父類與子類之間的關(guān)系:is-a | 父類 | 空心三角+實(shí)線,空心三角指向父類 | 鳥是動(dòng)物 |
實(shí)現(xiàn) | implements | 接口與實(shí)現(xiàn)類之間的關(guān)系:can-do | 接口 | 空心三角+虛線,空心三角指向接口 | 鳥實(shí)現(xiàn)了飛翔的接口 |
組合 | composition | 比聚合更強(qiáng)的關(guān)系:contains-a | 整體 | 實(shí)心菱形+實(shí)線,實(shí)心菱形指向整體 | 人類的頭和身體是強(qiáng)組合關(guān)系 |
聚合 | aggregation | 暫時(shí)組裝的關(guān)系:has-a | 組裝方 | 空心菱形+實(shí)線,空心菱形指向組裝方 | 狗和牽狗的繩子是聚合關(guān)系 |
依賴 | dependency | 一個(gè)類依賴于另一個(gè)類:depends-a | 被依賴方 | 箭頭+虛線,箭頭指向被依賴方 | 人喂小狗,小狗是喂這個(gè)動(dòng)作的被依賴方 |
關(guān)聯(lián) | association | 類與類之間存在互相平等的使用關(guān)系:links-a | 平等 | 實(shí)線 | 人與信用卡的關(guān)系,人用信用卡,信用卡可以讀取個(gè)人信息 |
以現(xiàn)有類為基礎(chǔ),復(fù)制它,然后通過(guò)添加和修改這個(gè)副本來(lái)創(chuàng)建新類。當(dāng)源類發(fā)生變化時(shí),被修改的副本也會(huì)反應(yīng)出這種變動(dòng)。生物學(xué)中對(duì)科目的定義,用于解釋繼承關(guān)系再恰當(dāng)不過(guò)。
父類:又稱源類、基類、超類;
子類:又稱導(dǎo)出類、繼承類;
父類和子類之間的類型層次結(jié)構(gòu)同時(shí)體現(xiàn)了他們之間的相似性和差異性。當(dāng)繼承現(xiàn)有類型時(shí),也就創(chuàng)造了新的類型,同時(shí)子類又歸屬于父類的類型。這個(gè)新的類型不僅包括現(xiàn)有類型的所有成員,而且更重要的是它復(fù)制了父類的接口,這意味著所有對(duì)父類對(duì)象的調(diào)用同時(shí)可可以對(duì)子類對(duì)象發(fā)起,這遵循了編程原則之一的里氏替換原則。
如果只是簡(jiǎn)單地繼承一個(gè)類而不做其他任何事情,那么在父類接口中的方法將會(huì)直接繼承到子類中。當(dāng)需要使父類和子類產(chǎn)生差異時(shí),有以下兩種方式:
直接在子類中添加新的方法;在采用該種方案時(shí)需要仔細(xì)考慮是否存在父類也需要這些額外方法的可能性。
覆寫父類中的某個(gè)方法;該種方案需要在子類中定義與父類需覆寫方法同名、同返回值類型、同方法參數(shù)類型的方法。
那么繼承是否應(yīng)該只覆寫父類的方法呢?
如果繼承只覆寫了父類的方法,那么子類對(duì)象可以完全替代父類對(duì)象,這通常稱之為替代原則,在這種情況下的類關(guān)系稱為is-a;但有時(shí)又的確需要在子類中添加新的接口,這種情況下父類無(wú)法訪問(wèn)新添加的接口,這種情況下類關(guān)系為is-like-a,這時(shí)這種父類與子類之間的關(guān)系,被視為非存粹替代
多態(tài)在處理類層次關(guān)系的時(shí)候,如果把任意一個(gè)特定類型的對(duì)象可以當(dāng)作其基類對(duì)象來(lái)對(duì)待,就使得人們可以編寫出不依賴于特定類型的代碼。
前期綁定:編譯器將產(chǎn)生對(duì)一個(gè)具體函數(shù)名字的調(diào)用,而在運(yùn)行時(shí)需要將這個(gè)調(diào)用解析到將要被執(zhí)行的代碼的絕對(duì)地址(意味著運(yùn)行前就需要知道具體代碼的位置)。
后期綁定:編譯器只確保調(diào)用的方法存在,而且調(diào)用參數(shù)和返回值類型正確;在運(yùn)行時(shí),通過(guò)特殊代碼,解析具體將要執(zhí)行的代碼的具體位置。
通過(guò)導(dǎo)出新的子類而輕松擴(kuò)展設(shè)計(jì)的能力,是對(duì)改動(dòng)進(jìn)行封裝的基本方式之一。
在試圖將子類對(duì)象當(dāng)作其基類對(duì)象來(lái)看待時(shí),需要解決的一個(gè)問(wèn)題是:編譯器無(wú)法精確地了解哪一段代碼將會(huì)被執(zhí)行。在OOP程序設(shè)計(jì)中,程序直到運(yùn)行時(shí)才能夠確定代碼的位置。
OOP程序設(shè)計(jì)語(yǔ)言使用了后期綁定的概念:編譯器確保調(diào)用方法的存在,并對(duì)調(diào)用參數(shù)和返回值執(zhí)行類型檢查,但并不知道將被執(zhí)行的確切代碼。Java使用一小段特殊的代碼來(lái)替代絕對(duì)地址調(diào)用,這段特殊代碼用來(lái)計(jì)算方法體的具體位置。Java默認(rèn)是動(dòng)態(tài)綁定的。
把子類對(duì)象看作父類對(duì)象的過(guò)程,稱作向上轉(zhuǎn)型。原因是在類圖中,父類總是位于類圖的頂部,把子類對(duì)象視為父類對(duì)象,即將子類類型向上推導(dǎo)。
單根繼承Java中所有的類最終都繼承自單一的基類:Object
單根繼承結(jié)構(gòu)保證所有對(duì)象都具備某些功能。Object是任何類的默認(rèn)父類,是在哲學(xué)方向上繼續(xù)寧的延伸思考。
我是誰(shuí)?getClass()說(shuō)明本質(zhì)上是誰(shuí),而toString()是當(dāng)前類的名片。
我從哪里來(lái)?Object()構(gòu)造方法是生產(chǎn)對(duì)象的基本方式;clone()是繁殖對(duì)象的另一種方式。
我到哪里去?finalize()方法說(shuō)明了對(duì)象的最終歸屬
我是否是獨(dú)一無(wú)二的?hashCode()和equals()就是判斷與其他元素是否相同的一組方法。
與其他人如何協(xié)調(diào)?wait()和notify()方法是對(duì)象間通信和協(xié)作的一組方法。
容器通常來(lái)說(shuō),如果不知道在解決某個(gè)特定問(wèn)題時(shí)需要多少對(duì)象,或者他們將存活多久,那么就不可能知道如何存儲(chǔ)這些對(duì)象。
在Java標(biāo)準(zhǔn)類庫(kù)中提供了大量容器。不同的容器提供了不同類型的接口和外部行為,同時(shí)對(duì)某些操作具有不同的效率。如List中的ArrayList和LinkedList由于底層實(shí)現(xiàn)的不同,具備不同的應(yīng)用場(chǎng)景。
由于容器只存儲(chǔ)Object,所以將對(duì)象引入置入容器時(shí),被向上轉(zhuǎn)型為Object,在取出類型時(shí)會(huì)丟失其類型。在一定程度上可以使用向下轉(zhuǎn)型的方式來(lái)獲取其實(shí)際類型,但是這樣做存在風(fēng)險(xiǎn)。
package a; import java.util.*; public class Container { public static void main(String [] args) { List list = new ArrayList(); list.add("Hello World!"); list.add(1); //程序運(yùn)行到這里是不會(huì)報(bào)錯(cuò)的,但是執(zhí)行下面這一步的時(shí)候,就會(huì)出現(xiàn)異常了 for(Object o : list) { //這一步會(huì)出現(xiàn)異常,因?yàn)長(zhǎng)ist中存放的不僅僅是String類型,還有Integer類型,向下轉(zhuǎn)型出現(xiàn)異常 String a = (String) o; System.out.println(a); } } }
那么用什么方式使容器記住這些對(duì)象究竟使什么類型呢?解決方案稱為參數(shù)化類型,在Java中也稱為泛型。表示方法為一對(duì)尖括號(hào),中間包含類型信息。
List
這樣一來(lái),就限定了List中只能存放String類型的對(duì)象啦!當(dāng)然,我們還是能夠通過(guò)反射繞過(guò)這層驗(yàn)證,畢竟在編譯后運(yùn)行時(shí),是去泛型的。
對(duì)象的創(chuàng)建和生命周期在使用對(duì)象時(shí),最關(guān)鍵的問(wèn)題之一便是他們的生成和銷毀方式。
new Constructor();:通過(guò)new關(guān)鍵詞向堆中申請(qǐng)內(nèi)存,通過(guò)Constructor來(lái)說(shuō)明類的創(chuàng)建方式。
Java采用動(dòng)態(tài)內(nèi)存分配的方式。動(dòng)態(tài)方式有個(gè)一般性假設(shè):對(duì)象趨于變得復(fù)雜,所以查找和釋放內(nèi)存空間的開銷不會(huì)對(duì)對(duì)象的創(chuàng)建造成重大沖擊。動(dòng)態(tài)方式所帶來(lái)的更大的靈活性是解決一般化編程問(wèn)題的要點(diǎn)。
Java提供了被稱為垃圾收集器的機(jī)制,用來(lái)處理內(nèi)存釋放問(wèn)題。垃圾收集器的運(yùn)行基礎(chǔ)是單根繼承結(jié)構(gòu)和只能在堆上創(chuàng)建對(duì)象的特性。
異常處理錯(cuò)誤處理始終是編程的難題之一。
異常是一種對(duì)象,其從出錯(cuò)點(diǎn)被拋出,并被特定類型的異常處理器所捕獲。異常處理就像與程序正常執(zhí)行路徑并行的、在錯(cuò)誤發(fā)生時(shí)執(zhí)行的另一條路徑。
異常不能被忽略,它保證一定會(huì)在某處得到處理。異常提供了一種從錯(cuò)誤狀態(tài)進(jìn)行可靠恢復(fù)的途徑。Java一開始就內(nèi)置了異常處理,并強(qiáng)制你必須使用它。它是唯一可接受的錯(cuò)誤報(bào)告方式。
并發(fā)編程在計(jì)算機(jī)編程中,存在著在同一時(shí)刻處理多個(gè)任務(wù)的思想。這些彼此獨(dú)立運(yùn)行的部分稱為線程,同一時(shí)刻處理多個(gè)任務(wù)稱為并發(fā)。
在單一處理器中,線程只是一種為單一處理器分配執(zhí)行時(shí)間的手段,換而言之,如果只有一個(gè)處理器,那么多線程程序的運(yùn)行不過(guò)是多個(gè)任務(wù)競(jìng)爭(zhēng)使用處理器的性能。在多處理器的情況下,實(shí)現(xiàn)的才是真正意義上的并發(fā),多處理器并行計(jì)算。
多線程同時(shí)存在一個(gè)隱患,在存在共享資源的時(shí)候,可能會(huì)造成資源之間的競(jìng)爭(zhēng),進(jìn)而造成死鎖。所以在多線程修改共享資源時(shí),必然在共享資源使用期進(jìn)行鎖定。
在Java中,JDK1.5后提供了concurrent包支持更好的并發(fā)特性。
結(jié)語(yǔ)以上是對(duì)象導(dǎo)論的一些基本概念,是繼續(xù)閱讀后面章節(jié)的非必要補(bǔ)充性材料。對(duì)于文中的一些代碼段或概念,暫時(shí)不理解的,可以先放一放,等后面看完了,再回過(guò)來(lái)看就恍然大悟了。
下一節(jié)將講解對(duì)象并寫第一個(gè)Java程序。如果你對(duì)這些內(nèi)容不感興趣,想看點(diǎn)更高難度的,歡迎關(guān)注我的博客:https://www.cnblogs.com/lurke...;歡迎關(guān)注我的微信公眾號(hào)JavaCorner
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77416.html
摘要:開頭正式開啟我入職的里程,現(xiàn)在已是工作了一個(gè)星期了,這個(gè)星期算是我入職的過(guò)渡期,算是知道了學(xué)校生活和工作的差距了,總之,盡快習(xí)慣這種生活吧。當(dāng)時(shí)是看的廖雪峰的博客自己也用做爬蟲寫過(guò)幾篇博客,不過(guò)有些是在前人的基礎(chǔ)上寫的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開頭 2017.08.21 正式開啟我...
摘要:類最基本的作用,在于通過(guò)類獲取到相應(yīng)的對(duì)象,在向?qū)ο蟀l(fā)送消息時(shí)以期望對(duì)象做某些特定的事情。先導(dǎo)概念引用中一切皆對(duì)象,因此采用一個(gè)指向?qū)ο蟮囊脕?lái)操縱對(duì)象。對(duì)象可以存活于作用域之外。 歡迎各位讀者關(guān)注我的微信公眾號(hào),共同探討Java相關(guān)技術(shù)。生命不止,學(xué)習(xí)不休! showImg(https://segmentfault.com/img/bVboaBO?w=129&h=129); 也許你慢...
摘要:當(dāng)我們希望能界定這二者之間的區(qū)別時(shí),我們將第一種稱為純粹的函數(shù)式編程,后者稱為函數(shù)式編程。函數(shù)式編程我們的準(zhǔn)則是,被稱為函數(shù)式的函數(shù)或方法都只能修改本地變量。另一種觀點(diǎn)支持引用透明的函數(shù)式編程,認(rèn)為方法不應(yīng)該有對(duì)外部可見(jiàn)的對(duì)象修改。 一、實(shí)現(xiàn)和維護(hù)系統(tǒng) 1.共享的可變數(shù)據(jù) 如果一個(gè)方法既不修改它內(nèi)嵌類的狀態(tài),也不修改其他對(duì)象的狀態(tài),使用return返回所有的計(jì)算結(jié)果,那么我們稱其為純粹...
摘要:面向?qū)ο缶幊?,是用抽象方式?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。面向?qū)ο缶幊逃?jì)算機(jī)科學(xué)導(dǎo)論讀書筆記一淺析面向過(guò)程與面向?qū)ο缶幊堂嫦驅(qū)ο竽J脚c面向過(guò)程模式區(qū)別在于面向?qū)ο竽J教幚砘顒?dòng)對(duì)象,而非被動(dòng)對(duì)象。 面向?qū)ο缶幊獭狾bject Oriented Programming,是用抽象方式創(chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。 它使用先前建立的范例,包括模塊化,多態(tài)和封裝幾種技術(shù)。 今天,許多...
摘要:其他語(yǔ)言數(shù)據(jù)結(jié)構(gòu)跟算法一樣是在開始寫代碼的時(shí)候用得很少,都有著包裝好的現(xiàn)成東西供你使用,但同樣是面試和崗位上升會(huì)用得到,我就不說(shuō)數(shù)據(jù)結(jié)構(gòu)對(duì)代碼有多少好處,請(qǐng)記住一句話能夠?qū)崿F(xiàn)個(gè)功能和能夠最優(yōu)地實(shí)現(xiàn)個(gè)功能,是完全不同級(jí)別的要求。 ...
閱讀 1287·2021-11-11 16:54
閱讀 925·2021-10-19 11:44
閱讀 1389·2021-09-22 15:18
閱讀 2502·2019-08-29 16:26
閱讀 3000·2019-08-29 13:57
閱讀 3143·2019-08-26 13:32
閱讀 1138·2019-08-26 11:58
閱讀 2385·2019-08-26 10:37