第6章 面向?qū)ο蠡A(chǔ)2020-02-22

Java類(lèi)的定義規(guī)則和使用;

//[類(lèi)修飾符] class 類(lèi)名{ 類(lèi)的成員

public class Demo {

? ? public int a;//成員變量(屬性)

? ? public void show(){? //成員方法(方法)

? ? }

? ? class Inner{ ?? ///嵌套類(lèi)(了解即可)

? ? }

? ? {

? ? ? ? System.out.println(); ?? //代碼塊(了解即可)

? ? }

}

編碼規(guī)范:

類(lèi)名單詞首字母大寫(xiě)

屬性和方法第一個(gè)單詞小寫(xiě),其他單詞首字母大寫(xiě)


屬性和局部變量對(duì)比



課堂演示


根據(jù)需求編寫(xiě)類(lèi):

西游記游戲軟件中的游戲人物包括:

孫悟空:孫悟空的武器是金箍棒,戰(zhàn)斗力五顆星,耐力五顆星

唐? 僧:唐僧沒(méi)有武器,戰(zhàn)斗力為零,耐力五顆星

豬八戒:豬八戒的武器是耙子,戰(zhàn)斗力四顆星,耐力兩顆星

沙? 僧:沙僧的武器是月牙鏟 ,戰(zhàn)斗力三顆星,耐力四顆星


package com.neusoft.test2;

public class Player {

private String name;

private String weapon;

private? String atk="";

private String endurance="";

public void setWeapon(String weapon) {

this.weapon=weapon;

}

public String getWeapon() {

return this.weapon;

}

// 輸入數(shù)字 確定攻擊力幾星

public void setAtk(int n) {

for(int i=0;i<n;i++) {

atk+="*";

}

}

public void setEndurance(int n) {

for(int i=0;i<n;i++) {

this.endurance+="*";

}

}

//獲得值

public String getName() {

return name;

}

//賦值

public void setName(String name) {

this.name = name;

}

public void say() {

System.out.println(name+"的武器是"+weapon+"戰(zhàn)斗力:"+atk+",耐力:"+endurance);

}

}

測(cè)試類(lèi)

package com.neusoft.test2;

public class test3 {

public static void main(String[] args) {

// TODO Auto-generated method stub

method2();

}

// 初始化人物

public static void method2() {

Player tangseng=? new Player();

tangseng.setName("唐僧");

tangseng.setWeapon("無(wú)");

tangseng.setAtk(0);

tangseng.setEndurance(5);;

Player sunwukong=? new Player();

sunwukong.setName("孫悟空");

sunwukong.setWeapon("金箍棒");

// sunwukong.atk="*****";

sunwukong.setAtk(5);

sunwukong.setEndurance(5);

Player zhubajie=? new Player();

zhubajie.setName("豬八戒");

zhubajie.setWeapon("耙子");

zhubajie.setAtk(4);

zhubajie.setEndurance(2);

Player shaseng=? new Player();

shaseng.setName("沙僧");

shaseng.setWeapon("月牙鏟");

shaseng.setAtk(3);

shaseng.setEndurance(4);

tangseng.say();

sunwukong.say();

zhubajie.say();

shaseng.say();

}

}

認(rèn)識(shí)對(duì)象

類(lèi)和對(duì)象的關(guān)系

類(lèi)是創(chuàng)建對(duì)象的模板,對(duì)象是類(lèi)的實(shí)例。


對(duì)象的創(chuàng)建


對(duì)象的使用


課堂練習(xí)

編寫(xiě)一個(gè)商品的類(lèi),要求包含商品名稱(chēng)和商品價(jià)格,并且編寫(xiě)一個(gè)方法能夠在控制臺(tái)輸出“商品名:價(jià)格”。并在主函數(shù)中調(diào)用。

輸出示例:

可樂(lè):2.5

鼠標(biāo):50

private String name;

private double price;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

public void printinfo() {

System.out.println(name+":"+price);

}

}

測(cè)試類(lèi)

package com.neusoft.Test3;

public class test2 {

public static void main(String[] args) {

// TODO Auto-generated method stub

//測(cè)試類(lèi)

method1();

}

public static void method1() {

// 輸出示例:

// 可樂(lè):2.5

// 鼠標(biāo):50

test1 cola =new test1();

cola.setName("可樂(lè)");

cola.setPrice(2.5);

test1 mouse =new test1();

mouse.setName("鼠標(biāo)");

mouse.setPrice(50);

cola.printinfo();

mouse.printinfo();

}

}

創(chuàng)建對(duì)象原理


對(duì)象的創(chuàng)建


對(duì)象的創(chuàng)建和使用


創(chuàng)建多個(gè)對(duì)象


創(chuàng)建匿名對(duì)象


垃圾回收機(jī)制



Finalize()

注意:如果你熟悉C++,那你知道C++允許你為一個(gè)類(lèi)定義一個(gè)撤消函數(shù)(destructor ),它在對(duì)象正好出作用域之前被調(diào)用。Java不支持這個(gè)想法也不提供撤消函數(shù)。finalize() 方法只和撤消函數(shù)的功能接近。當(dāng)你對(duì)Java 有豐富經(jīng)驗(yàn)時(shí),你將看到因?yàn)镴ava使用垃圾回收子系統(tǒng),幾乎沒(méi)有必要使用撤消函數(shù)。

finalize的工作原理應(yīng)該是這樣的:一旦垃圾收集器準(zhǔn)備好釋放對(duì)象占用的存儲(chǔ)空間,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過(guò)程中,才會(huì)真正回收對(duì)象的內(nèi)存.所以如果使用finalize(),就可以在垃圾收集期間進(jìn)行一些重要的清除或清掃工作.

finalize()在什么時(shí)候被調(diào)用?有三種情況1.所有對(duì)象被Garbage Collection時(shí)自動(dòng)調(diào)用,比如運(yùn)行System.gc()的時(shí)候.2.程序退出時(shí)為每個(gè)對(duì)象調(diào)用一次finalize方法。3.顯式的調(diào)用finalize方法

除此以外,正常情況下,當(dāng)某個(gè)對(duì)象被系統(tǒng)收集為無(wú)用信息的時(shí)候,finalize()將被自動(dòng)調(diào)用,但是jvm不保證finalize()一定被調(diào)用,也就是說(shuō),finalize()的調(diào)用是不確定的,這也就是為什么sun不提倡使用finalize()的原因



練習(xí)

程序段1:

1.fobj = new Object ( ) ;

2.fobj. Method ( ) ;

3.fobj = new Object ( ) ;

4.fobj. Method ( ) ;

問(wèn):這段代碼中,第幾行的fobj 符合垃圾收集器的收集標(biāo)準(zhǔn)?

答:第3行。因?yàn)榈?行的fobj被賦了新值,產(chǎn)生了一個(gè)新的對(duì)象,即換了一塊新的內(nèi)存空間,也相當(dāng)于為第1行中的fobj賦了null值。這種類(lèi)型的題在認(rèn)證0考試中是最簡(jiǎn)單的。

程序段2:

1.Object sobj = new Object ( ) ;

2.Object sobj = null ;

3.sobj = new Object ( ) ;

4.sobj = new Object ( ) ;

問(wèn):這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?

答:第2行和第4行。因?yàn)榈?行為sobj賦值為null,所以在此第1行的sobj符合垃圾收集器的收集標(biāo)準(zhǔn)。而第4行相當(dāng)于為sobj賦值為null,所以在此第3行的sobj也符合垃圾收集器的收集標(biāo)準(zhǔn)。

如果有一個(gè)對(duì)象的句柄a,且你把a(bǔ)作為某個(gè)構(gòu)造器的參數(shù),即 new Constructor ( a )的時(shí)候,即使你給a賦值為null,a也不符合垃圾收集器的收集標(biāo)準(zhǔn)。直到由上面構(gòu)造器構(gòu)造的新對(duì)象被賦空值時(shí),a才可以被垃圾收集器收集。

程序段3:

1.Object aobj =?new Object ( )?;

2.Object bobj = new Object ( ) ;

3.Object cobj =?new Object ( ) ;

4.a(chǎn)obj = bobj;

5.a(chǎn)obj = cobj;

6.cobj = null;

7.a(chǎn)obj = null;

問(wèn):這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?

答:第4,7行。注意這類(lèi)題型是認(rèn)證考試中可能遇到的最難題型了。

行1-3分別創(chuàng)建了Object類(lèi)的三個(gè)對(duì)象:aobj,bobj,cobj

行4:此時(shí)對(duì)象aobj的句柄指向bobj,原來(lái)aojb指向的對(duì)象已經(jīng)沒(méi)有任何引用或變量指向,這時(shí),就符合回收標(biāo)準(zhǔn)。

行5:此時(shí)對(duì)象aobj的句柄指向cobj,所以該行的執(zhí)行不能使aobj符合垃圾收集器的收集標(biāo)準(zhǔn)。

行6:此時(shí)仍沒(méi)有任何一個(gè)對(duì)象符合垃圾收集器的收集標(biāo)準(zhǔn)。

行7:對(duì)象cobj符合了垃圾收集器的收集標(biāo)準(zhǔn),因?yàn)閏obj的句柄指向單一的地址空間。在第6行的時(shí)候,cobj已經(jīng)被賦值為null,但由cobj同時(shí)還指向了aobj(第5行),所以此時(shí)cobj并不符合垃圾收集器的收集標(biāo)準(zhǔn)。而在第7行,aobj所指向的地址空間也被賦予了空值null,這就說(shuō)明了,由cobj所指向的地址空間已經(jīng)被完全地賦予了空值。所以此時(shí)cobj最終符合了垃圾收集器的收集標(biāo)準(zhǔn)。 但對(duì)于aobj和bobj,仍然無(wú)法判斷其是否符合收集標(biāo)準(zhǔn)。

總之,在Java語(yǔ)言中,判斷一塊內(nèi)存空間是否符合垃圾收集器收集標(biāo)準(zhǔn)的標(biāo)準(zhǔn)只有兩個(gè):

1.給對(duì)象賦予了空值null,以下再?zèng)]有調(diào)用過(guò)。

2.給對(duì)象賦予了新值,既重新分配了內(nèi)存空間。

最后再次提醒一下,一塊內(nèi)存空間符合了垃圾收集器的收集標(biāo)準(zhǔn),并不意味著這塊內(nèi)存空間就一定會(huì)被垃圾收集器收集。

********對(duì)象的使用

構(gòu)造方法


構(gòu)造方法的使用


構(gòu)造方法重載


構(gòu)造方法調(diào)用



構(gòu)造方法使用


課堂練習(xí)


*********實(shí)例

package com.neusoft.Test5;

//類(lèi)名:首字母大寫(xiě)

public class Person {

public? String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

// 構(gòu)造方法名 與類(lèi)名相同

// 沒(méi)有返回值類(lèi)型 不能void

// 只能在創(chuàng)建對(duì)象new 時(shí),調(diào)用一次

// 構(gòu)造方法與對(duì)象的初始化相關(guān):1.創(chuàng)建對(duì)象時(shí)內(nèi)存分配空間等等準(zhǔn)備

// 2.使用構(gòu)造器可以給成員變量賦值(屬性注入)

//默認(rèn)空參構(gòu)造問(wèn)題

? ? // 1.創(chuàng)建一個(gè)類(lèi) 默認(rèn)有一個(gè)空參構(gòu)造

// 2 如果手寫(xiě)了一個(gè)有參構(gòu)造器 這個(gè)空參構(gòu)造器就沒(méi)有了

// 3 如果手寫(xiě)了一個(gè)有參構(gòu)造器 ,需要手寫(xiě)一個(gè)空參構(gòu)造器,才能調(diào)用空參構(gòu)造器

//構(gòu)造器之間調(diào)用問(wèn)題:1使用this(參數(shù)) 2只能放在構(gòu)造方法的第一行

//一個(gè)構(gòu)造方法只能調(diào)用一個(gè)方法

public Person() {

this(1);

System.out.println("構(gòu)造方法person");

}

// 構(gòu)造方法的重載:參數(shù)個(gè)數(shù),參數(shù)類(lèi)型不同

public Person(int a) {

System.out.println("構(gòu)造方法person int a:" + a);

}

public Person(String a) {

System.out.println("構(gòu)造方法person String a:" + a);

this.name=a;

}

// 普通方法

// 隨便起名建議駝峰命名法 :person personAnimal

// 有返回值類(lèi)型

// 可以使用引用多次調(diào)用

public void Person() {

System.out.println("普通方法 person");

Person(90);

}

// 方法的重載 :同一個(gè)類(lèi)方法名相同 ,參數(shù)個(gè)數(shù),參數(shù)類(lèi)型不同

public void Person(int a) {

System.out.println("普通方法 person int a:" + a);

}

public void Person(String a) {

System.out.println("普通方法 person String a:" + a);

}

}

---------------------------------------------------------------

package com.neusoft.Test5;

public class Test1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

// Person p=new Person("tom");

// System.out.println(p.getName());

//

Person p1=new Person();

p1.Person();

p1.setName("jetty");

System.out.println(p1.getName());

// p.Person();

// p.Person(1);

// p.Person("1");

// p.Person("tom");

//

}

}

靜態(tài)方法

示例

package?com.neusoft.test3;

public?class?Test?{

public?static?void?main(String[]?args)?{

Test.Statica=100;

Test?t1=new?Test();

Test?t2=new?Test();

t1.Objecta=10;

t1.Statica=1000;

t2.Objecta=20;

System.out.println("t1.Objecta:"+t1.Objecta);

System.out.println("t2.Objecta:"+t2.Objecta);

System.out.println("t2.Statica:"+t2.Statica);

}

public?int?Objecta;

static?public?int?Statica;

}

答案

t1.Objecta:10

t2.Objecta:20

t2.Statica:1000

Java包的概念

使用包注意問(wèn)題:

在java中位于包中的類(lèi),在文件系統(tǒng)中的存放位置,

? 必須有與包名層次相對(duì)應(yīng)的目錄結(jié)構(gòu)

package語(yǔ)句作為java源文件的第一條語(yǔ)句

每個(gè)源文件只能聲明一個(gè)包

如果沒(méi)有package語(yǔ)句,則默認(rèn)為無(wú)名包

Java類(lèi)庫(kù)中常用的包

java.lang

Java默認(rèn)包,任何程序中,該包都被自動(dòng)導(dǎo)入。

位于同一包中的類(lèi)可以直接訪(fǎng)問(wèn)并使用

訪(fǎng)問(wèn)不同包中的類(lèi)

使用import關(guān)鍵字引入其它包中的類(lèi)

必須在package聲明后面,類(lèi)聲明前面

import語(yǔ)句可以出現(xiàn)多次

優(yōu)先級(jí)順序!

行內(nèi)指定包>引用其他包的具體的類(lèi)>本包中的類(lèi)> 引用其他包通配符

//優(yōu)先級(jí)級(jí)順序

//第一 優(yōu)先級(jí)最高? import com.neusoft.Test2.Person();手動(dòng)引入包

//第二? ? com.neusoft.Test1.Person()當(dāng)前本包內(nèi)的類(lèi)

//第三? ? import com.neusoft.Test2.*; 使用通配符

代碼封裝



示例

package com.neusoft.test1;

public class Score {

String star="";

// 展現(xiàn)評(píng)分對(duì)應(yīng)的星數(shù)

public void printresult() {

System.out.println("感謝您的評(píng)價(jià),您對(duì)客服的評(píng)價(jià)結(jié)果為:"+star);

}

// 輸入對(duì)客服的評(píng)分? 1~5

public void setScore(int score) {

for(int i=0;i<score;i++) {

star+="*";

}

}

}

測(cè)試類(lèi)

public class Test1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

method4();

}

public static void method4() {

Scanner sc=new Scanner(System.in);

System.out.println("請(qǐng)對(duì)客服打分輸入1~5分:");

int score=sc.nextInt();

Score s=new Score();

s.setScore(score);

s.star="*********";

s.printresult();

}

靜態(tài):static關(guān)鍵字



示例

package com.neusoft.test3;

public class Person {

static String country="China";

String name="tom";

static public void say() {

System.out.println(country);

// System.out.println(name);// 靜態(tài)方法內(nèi)部只能調(diào)用靜態(tài)方法及靜態(tài)屬性

// ? ? ? ? ? ? ? ? ? ? ? ? ? 不能調(diào)用成員方法,成員變量

}

----------

測(cè)試類(lèi)

package com.neusoft.test3;

public class Test1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

// System.out.println(Person.country);

Person.say(); 靜態(tài)方法可直接寫(xiě)

// System.out.println(new Person().name);

}

}


成員方法與靜態(tài)方法區(qū)分

package com.neusoft.test3;

public class People {

public static void main(String[] args) {

new People().method1();

method2();

}

public? void method1() {

System.out.println("成員方法");//需要?jiǎng)?chuàng)建對(duì)象后引用new People().method1(); 與對(duì)象有關(guān)

}

public static void method2() {

System.out.println("靜態(tài)方法");//被static修用飾 可直接 用method2(); 與類(lèi)有關(guān)

}

}



示例

package com.neusoft.test3;

public class Test {

? //靜態(tài)代碼塊

static {

System.out.println("靜態(tài)代碼塊在類(lèi)初始化時(shí)只調(diào)用一次");

}

//代碼塊 (類(lèi)以?xún)?nèi)方法外)對(duì)象初始化

{

System.out.println("代碼塊");

}

// 原理(實(shí)際) 執(zhí)行順序 :靜態(tài)代碼塊---》構(gòu)造器---》代碼塊

// 執(zhí)行結(jié)果 順序 : 靜態(tài)代碼塊 ---》代碼塊---》構(gòu)造器

// 構(gòu)造器 --》對(duì)象初始化

public Test() {

System.out.println("創(chuàng)建對(duì)象是 初始化");

}

public static void main(String[] args) {

Test.Statica=100;

Test t1=new Test();

Test t2=new Test();

t1.Objecta=10;

t1.Statica=1000;

t2.Objecta=20;

System.out.println("t1.Objecta:"+t1.Objecta);

System.out.println("t2.Objecta:"+t2.Objecta);

System.out.println("t2.Statica:"+t2.Statica);

}

public int Objecta;

static public int Statica;

}


單例模式



package com.neusoft.test5;

// 懶加載(懶漢式) 單例模式?

public class SingletonA {

static SingletonA a=null;

//單例模式

// 1 .可以創(chuàng)建多個(gè)對(duì)象,因?yàn)榭梢?new 類(lèi)名()----》將構(gòu)造方法私有化private

private SingletonA() {

}

// 2. 當(dāng)構(gòu)造器私有化后,一個(gè)對(duì)象都不能創(chuàng)建

// ? 類(lèi)的外部不能調(diào)用 構(gòu)造器--------》在類(lèi)的內(nèi)部寫(xiě)一個(gè)public static

// 方法,返回創(chuàng)建的對(duì)象

public static SingletonA getInstance() {

// 3.創(chuàng)建多個(gè)對(duì)象了,----》getInstance 加上判斷邏輯

if(a==null) {

a=new SingletonA();

}else {

}

return a;

}

}

------------------------

測(cè)試

package?com.neusoft.test5;

public?class?Test1?{

public?static?void?main(String[]?args)?{

//?TODO?Auto-generated?method?stub

SingletonA?sa1=SingletonA.getInstance();

SingletonA?sa2=SingletonA.getInstance();

System.out.println(sa1);

System.out.println(sa2);

}

}



-------------------
package com.neusoft.test5;

//積極加載式? (餓漢式)? 單例模式?

public class SingletonB {

// 3.創(chuàng)建對(duì)象時(shí)機(jī)在 static屬性中 -----》在類(lèi)初始化時(shí),執(zhí)行一次

static SingletonB a=new SingletonB();

//單例模式

// 1 .可以創(chuàng)建多個(gè)對(duì)象,因?yàn)榭梢?new 類(lèi)名()----》將構(gòu)造方法私有化private

private SingletonB() {

}

// 2. 當(dāng)構(gòu)造器私有化后,一個(gè)對(duì)象都不能創(chuàng)建

// ? 類(lèi)的外部不能調(diào)用 構(gòu)造器--------》在類(lèi)的內(nèi)部寫(xiě)一個(gè)public static

// 方法,返回創(chuàng)建的對(duì)象

public static SingletonB getInstance() {

return a;

}

}


1、定義一個(gè)點(diǎn)類(lèi)Point,包含2個(gè)成員變量x、y分別表示x和y坐標(biāo),2個(gè)構(gòu)造器Point()和Point(int x0,y0),以及一個(gè)movePoint(int dx,int dy)方法實(shí)現(xiàn)點(diǎn)的位置移動(dòng),創(chuàng)建兩個(gè)Point對(duì)象p1、p2,分別調(diào)用movePoint方法后,打印p1和p2的坐標(biāo)。[必做題]

2、定義一個(gè)矩形類(lèi)Rectangle: [必做題]

2.1? 定義三個(gè)方法:getArea()求面積、getPer()求周長(zhǎng),showAll()分別在控制臺(tái)輸出長(zhǎng)、寬、面積、周長(zhǎng)。

2.2? 有2個(gè)屬性:長(zhǎng)length、寬width

2.3? 通過(guò)構(gòu)造方法Rectangle(int width, int length),分別給兩個(gè)屬性賦值

2.4? 創(chuàng)建一個(gè)Rectangle對(duì)象,并輸出相關(guān)信息

3、定義一個(gè)筆記本類(lèi),該類(lèi)有顏色(char)和cpu型號(hào)(int)兩個(gè)屬性。 [必做題]

3.1 無(wú)參和有參的兩個(gè)構(gòu)造方法;有參構(gòu)造方法可以在創(chuàng)建對(duì)象的同時(shí)為每個(gè)屬性賦值;

3.2? 輸出筆記本信息的方法

3.3? 然后編寫(xiě)一個(gè)測(cè)試類(lèi),測(cè)試筆記本類(lèi)的各個(gè)方法。

4、定義兩個(gè)類(lèi),描述如下: [必做題]

4.1定義一個(gè)人類(lèi)Person:

4.1.1定義一個(gè)方法sayHello(),可以向?qū)Ψ桨l(fā)出問(wèn)候語(yǔ)“hello,my name is XXX”

4.1.2有三個(gè)屬性:名字、身高、體重

4.2定義一個(gè)PersonCreate類(lèi):

4.2.1創(chuàng)建兩個(gè)對(duì)象,分別是zhangsan,33歲,1.73;lishi,44,1.74

4.2.2分別調(diào)用對(duì)象的sayHello()方法。

1、設(shè)計(jì)一個(gè)類(lèi)Student,該類(lèi)包括姓名、學(xué)號(hào)和成績(jī)。設(shè)計(jì)一個(gè)方法,按照成績(jī)從高到低的順序輸出姓名、學(xué)號(hào)和成績(jī)信息。[選做題]

2、定義一個(gè)汽車(chē)類(lèi)Vehicle,要求如下:[選做題]

2.1屬性包括:汽車(chē)品牌brand(String類(lèi)型)、顏色color(String類(lèi)型)和速度speed(double類(lèi)型),并且所有屬性為私有。

2.2至少提供一個(gè)有參的構(gòu)造方法(要求品牌和顏色可以初始化為任意值,但速度的初始值必須為0)。

2.3為私有屬性提供訪(fǎng)問(wèn)器方法。注意:汽車(chē)品牌一旦初始化之后不能修改。

2.4定義一個(gè)一般方法run(),用打印語(yǔ)句描述汽車(chē)奔跑的功能

2.5定義測(cè)試類(lèi)VehicleTest,在其main方法中創(chuàng)建一個(gè)品牌為“benz”、顏色為“black”的汽車(chē)。

?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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