小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

解析Java編程思想--內(nèi)部類

 碼農(nóng)9527 2021-07-08

一個(gè)類的定義可以放在另一個(gè)類的定義內(nèi),它叫做內(nèi)部類。內(nèi)部類是一種非常有用的特性,因?yàn)樗梢宰屇銓⑦壿嬒嚓P(guān)的類組織在一起,并且控制類的視覺(jué)效果。但我們必須認(rèn)識(shí)到,內(nèi)部類和組合是截然不同的概念。在最初,內(nèi)部類看起來(lái)就像是一種代碼隱藏機(jī)制:將類置于其他類的內(nèi)部。但是,你將會(huì)了解到,內(nèi)部類遠(yuǎn)不止如此,他能了解外圍類,并能與之通信。

Java編程思想--內(nèi)部類

    一、創(chuàng)建內(nèi)部類

public class Parcel1 {class Contents {private int i = 11;public int value() {return i;
}
}class Destination {private String label;
Destination(String whereTo) {
label = whereTo;
}String readLabel() {return label;
}

}public void ship(String dest) {

Contents c = new Contents();

Destination d = new Destination(dest);

System.out.println(d.readLabel());

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

Parcel1 p = new Parcel1();

p.ship("Tasmania");

}

}123456789101112131415161718192021222324252627282930313233343536373839類型:[java]

    當(dāng)我們?cè)趕hip方法里面使用內(nèi)部類時(shí),與使用普通的類沒(méi)有什么不同。在這里,實(shí)際的區(qū)別只是內(nèi)部類的名字是嵌套在Parcel1里面的。

public class Parcel2 {class Contents {private int i = 11;public int value() {return i;
}
}class Destination {private String label;
Destination(String whereTo) {
label = whereTo;
}String readLabel() {return label;
.}
.}
.public Destination to(String s) {
.return new Destination(s);
.}public Contents contents() {
.return new Contents();
.}
.public void ship(String dest) {
.Contents c = new Contents();
.Destination d = to(dest);
.System.out.println(d.readLabel());
.}
.public static void main(String[] args) {
.Parcel2 parcel2 = new Parcel2();
.parcel2.ship("Tasmania");
.Parcel2 q = new Parcel2();
.Parcel2.Contents c = q.contents();
.Parcel2.Destination d = q.to("");
.}
.}123456789101112131415161718192021222324252627282930313233343536類型:[java]

    更典型的是,外部類將有一個(gè)方法,該方法返回一個(gè)指向內(nèi)部類的引用,就像在to()和contents()方法中看到的那樣:

    二、鏈接到外部類

    到目前為止,內(nèi)部類似乎還只是一種名字隱藏和組織代碼的模式。他還有其他的用途。當(dāng)生成一個(gè)內(nèi)部類的對(duì)象時(shí),此對(duì)象與制造他的外圍對(duì)象之間就有了一種聯(lián)系,所以他能訪問(wèn)其外圍對(duì)象的所有成員,二不需要任何條件。此外,內(nèi)部類還擁有其外圍類的所有元素的訪問(wèn)權(quán)。下面的例子說(shuō)明了這點(diǎn):

public class Sequence {private Object[] items;private int next = 0;public Sequence(int size) {
items = new Object[size];
}public void add(Object x) {if (next < items.length) {
items[next++] = x;
}
}public Selector selector() {return new SequenceSelector();
}private class SequenceSelector implements Selector {private int i = 0;@Overridepublic boolean end() {return i == items.length;
}@Overridepublic Object current() {return items[i];
}@Overridepublic void next() {if (i < items.length) i++;
}
}public static void main(String[] args) {
Sequence sequence = new Sequence(10);for (int i = 0; i < 10; i++) {
sequence.add(Integer.toString(i));
Selector selector = sequence.selector();
}
}
}interface Selector {boolean end();Object current();void next();
}12345678910111213141516171819202122232425262728293031323334353637383940414243類型:[java]

    最初看到SequenceSelector,可能會(huì)覺(jué)得他只不過(guò)是另一個(gè)內(nèi)部類罷了。但是end()、current()和next()都用到了objects,這是一個(gè)引用,他并不是SequenceSelector的一部分,而是外圍類的一個(gè)private字段。然而內(nèi)部?jī)?nèi)可以訪問(wèn)其外圍類的方法和字段,就像自己擁有他們似的,這帶來(lái)的很大的方便。

    所以內(nèi)部類自動(dòng)擁有對(duì)外圍類所有成員的訪問(wèn)權(quán)是如何做到的呢?當(dāng)某個(gè)外圍類的對(duì)象創(chuàng)建了一個(gè)內(nèi)部類對(duì)象時(shí),此內(nèi)部類必定會(huì)秘密的捕獲一個(gè)指向那個(gè)外圍類對(duì)象的引用。然后,在你訪問(wèn)此外圍類的成員時(shí),就是用那個(gè)引用來(lái)選擇外圍類的成員。編譯器會(huì)幫你處理所有的細(xì)節(jié)。但你現(xiàn)在可以看到:內(nèi)部類的對(duì)象只能在與其外圍類的對(duì)象相關(guān)聯(lián)的情況下才能被創(chuàng)建(內(nèi)部類不是static)時(shí)。構(gòu)建內(nèi)部類對(duì)象時(shí),需要一個(gè)指向其外圍類對(duì)象的引用,如果編譯器訪問(wèn)不到這個(gè)引用就會(huì)報(bào)錯(cuò)。

    三、使用this與new

    如果你需要生成對(duì)外部類對(duì)象的引用,可以使用外部類的名字后面緊跟圓點(diǎn)和this。這樣產(chǎn)生的引用自動(dòng)具有正確的類型,這一點(diǎn)在編譯期就被知曉并受到檢查,因此沒(méi)有任何運(yùn)行時(shí)開銷。

public class DotThis {void f() {
System.out.println("DotThis.f()");
}public class Inner {public DotThis outer() {return DotThis.this;
}
}public Inner inner() {return new Inner();
}public static void main(String[] args) {
DotThis dotThis = new DotThis();
DotThis.Inner dti = dotThis.inner();
dti.outer();
}
}12345678910111213141516171819類型:[java]

    有時(shí)你可能想要告知其他對(duì)象,去創(chuàng)建其某個(gè)內(nèi)部類的對(duì)象。要實(shí)現(xiàn)此目的,你必須在new表達(dá)式中提供對(duì)其他外部類對(duì)象的引用,這是需要使用.new語(yǔ)法:

class DotNew {public class Inner {
}public static void main(String[] args) {
DotNew dotNew = new DotNew();
DotNew.Inner dni = dotNew.new Inner();
}
}123456789類型:[java]

    在擁有外部類對(duì)象之前是不可能創(chuàng)建內(nèi)部類對(duì)象的。這是因?yàn)閮?nèi)部類對(duì)象會(huì)暗暗的連接到創(chuàng)建他的外部類對(duì)象上。但是,你如果創(chuàng)建的是靜態(tài)內(nèi)部類,那么他就不需要對(duì)外部類的引用。

    四、內(nèi)部類和向上轉(zhuǎn)型

    當(dāng)將內(nèi)部類向上轉(zhuǎn)型為其基類,尤其是轉(zhuǎn)型為一個(gè)接口的時(shí)候,內(nèi)部類就有了用武之地。這是因?yàn)榇藘?nèi)部類-某個(gè)接口的實(shí)現(xiàn)-能夠完全不可見(jiàn),并且不可用。所得到的只是指向基類或者接口的引用,所以能夠很方便的隱藏實(shí)現(xiàn)細(xì)節(jié)。

public interface Destination {String readLabel();
}public interface Contents {int value();
}1234567類型:[java]

    現(xiàn)在Contents和Destination表示客戶端程序員可用的接口。

    當(dāng)取得了一個(gè)指向基類或接口的引用時(shí),甚至可能無(wú)法找出他確切的類型,例如:

public class Parcel4 {private class PContents implements Contents {private int i = 11;@Overridepublic int value() {return i;
}
}protected class PDestination implements Destination {private String label;public PDestination(String label) {this.label = label;
}@Overridepublic String readLabel() {return label;
}
}public Destination destination(String s) {return new PDestination(s);
}public Contents contents() {return new PContents();
}
}class TestParcel {public static void main(String[] args) {
Parcel4 parcel4 = new Parcel4();
Contents c = parcel4.contents();
Destination d = parcel4.destination("Tasmania");
}
}123456789101112131415161718192021222324252627282930313233類型:[java]

    Parcel4增加了一些新東西:內(nèi)部類PContents是private,所以除了Parcel4,沒(méi)有人能訪問(wèn)他。PDestination是protected,所以只有Parcel4及其子類、還有與Parcel4同一個(gè)包中的類能訪問(wèn)PDestination,其他類都不能訪問(wèn)PDestination。這意味著客戶端程序員想了解或者訪問(wèn)這些成員,是要受到限制的。實(shí)際上,甚至不能向下轉(zhuǎn)型為private內(nèi)部類或protected類,因此不能訪問(wèn)其名字,就像TestParcel類中看到的那樣。

    于是private內(nèi)部類給類設(shè)計(jì)者提供了一種途徑,通過(guò)這種方式可以完全阻止任何依賴于類型的編碼,并且完全隱藏了實(shí)現(xiàn)的細(xì)節(jié)。

    此外,從客戶端程序員的角度來(lái)看,由于不能訪問(wèn)任何新增加的、原本不屬于公共接口的方法,所以擴(kuò)展接口是沒(méi)有價(jià)值的。這也給java編譯器提供了生成更高效代碼的機(jī)會(huì)。

    五、在方法和作用域內(nèi)的內(nèi)部類

    到目前為止,讀者所看到的都是內(nèi)部類的典型用途。通常,如果所讀、寫的代碼包含了內(nèi)部類,那么他們都是平凡的內(nèi)部類,簡(jiǎn)單并且容易理解。然而,內(nèi)部類的語(yǔ)法覆蓋了大量其他的更加難以理解的技術(shù)。例如,可以在一個(gè)方法里面或者任意的作用域定義內(nèi)部類。這么做有兩個(gè)理由:

    如前所示,你實(shí)現(xiàn)了某類型的接口,于是可以創(chuàng)建并返回對(duì)其的引用

    你要解決一個(gè)復(fù)雜的問(wèn)題,想創(chuàng)建一個(gè)類來(lái)輔助你的解決方案,但是又不希望這個(gè)類是公共可用的。

    在后面的例子中,先前的代碼將被修改,以用來(lái)實(shí)現(xiàn):

    一個(gè)定義在方法中的類

    一個(gè)定義在作用域內(nèi)的類,此作用域在方法的內(nèi)部

    一個(gè)實(shí)現(xiàn)了接口的匿名類

    一個(gè)匿名類,他擴(kuò)展了非默認(rèn)構(gòu)造器的類

    一個(gè)匿名類,他執(zhí)行字段初始化

    一個(gè)匿名類,它通過(guò)實(shí)例初始化實(shí)現(xiàn)構(gòu)造(匿名類不可能有構(gòu)造器)

    第一個(gè)例子展示了在方法作用域內(nèi)(而不是在其他類的作用域內(nèi))創(chuàng)建一個(gè)完整的類,這叫做局部?jī)?nèi)部類:

public class Parcel5 {  public Destination destination(String s) { class PDestination implements Destination {   private String label;   @Override
   public String readLabel() {  return null;
   }
 } return new PDestination();
  }  public static void main(String[] args) {
 Parcel5 parcel5 = new Parcel5();
 Destination d = parcel5.destination("test");
  }
}123456789101112131415161718類型:[java]

    PDestination類是destination()方法的一部分,而不是Parcel5的一部分。所以,在destination()之外不能訪問(wèn)PDestination。注意出現(xiàn)在return語(yǔ)句中的向上轉(zhuǎn)型--返回的類型是Destination的引用,他是PDestination的基類。當(dāng)然,在destination()中定義了內(nèi)部類PDestination,并不意味著dest()方法執(zhí)行完畢,PDestination就不可用了。

    你剋有在同一個(gè)子目錄下的任意類中對(duì)某個(gè)內(nèi)部類使用類標(biāo)識(shí)符PDestination,這并不會(huì)引起命名沖突。

    下面的例子展示了如何在任意的作用域內(nèi)嵌入一個(gè)內(nèi)部類:

public class Parcel6 {private void internalTracking(boolean b) {if (b) {class TrackingSlip {
}
} 
}
}123456789類型:[java]

    TrackingSlip類被嵌入在if語(yǔ)句的作用域內(nèi),這并不是說(shuō)該類的創(chuàng)建是有條件的,他其實(shí)與其他類一起編譯過(guò)了。然而,在定義TrackingSlip的作用域外,他是不可用的,除此之外與普通的類一樣。

    六、匿名內(nèi)部類

    下面的例子看起來(lái)奇怪:

public class Parcel7 {public Contents contents() {return new Contents() {@Overridepublic int value() {return 0;
}
};
}public static void main(String[] args) {
Parcel7 parcel7 = new Parcel7();
Contents c = parcel7.contents();
}
}123456789101112131415類型:[java]

    這種奇怪的語(yǔ)法是指:創(chuàng)建一個(gè)繼承自Contents的匿名類的對(duì)象。通過(guò)new表達(dá)式返回的引用被自動(dòng)向上轉(zhuǎn)型為對(duì)Contents的引用。

    在這個(gè)匿名內(nèi)部類中,使用了默認(rèn)的構(gòu)造器來(lái)生成Contents。下面的代碼展示的是,如果你的基類需要一個(gè)有參數(shù)的構(gòu)造器,應(yīng)該怎么辦。

public class Parcel8 {public Wrapping wrapping(int x) {return new Wrapping(x) {@Overridepublic int value() {return super.value();
}
};
}
}class Wrapping {private int i;public Wrapping(int i) {this.i = i;
}public int value() {return i;
}
}1234567891011121314151617181920類型:[java]

    如果定義一個(gè)匿名內(nèi)部類,并且希望他使用一個(gè)在其外部定義的對(duì)象,那么編譯器會(huì)要求其參數(shù)引用是final的。

    如果想要做一些類似構(gòu)造器的行為,應(yīng)該怎么辦呢?在匿名內(nèi)部類中不可能有命名構(gòu)造器,但通過(guò)實(shí)例初始化,就能夠達(dá)到為匿名內(nèi)部類創(chuàng)建一個(gè)構(gòu)造器的效果。如下所示:

public class AnonymousConstructor {public static Base getBase(int i) {return new Base(i) {
{
System.out.println("Inside instance");
}@Overridepublic void f() {
}
};
}public static void main(String[] args) {
Base base = getBase(1);
base.f();
}
}abstract class Base {public Base(int i) {
System.out.println("base");
}public abstract void f();
}1234567891011121314151617181920212223類型:[java]

    在這個(gè)例子中,不要求變量i一定是final的。因?yàn)閕被傳遞給匿名類的基類的構(gòu)造器,他并不會(huì)在匿名類內(nèi)部被直接使用。

    七、嵌套類

    如果不需要內(nèi)部類對(duì)象與其外圍類對(duì)象之間有聯(lián)系,那么可以將內(nèi)部類聲明為static。這通常稱為嵌套類。想要理解static應(yīng)用于內(nèi)部類時(shí)的含義,就必須記住,普通的內(nèi)部類對(duì)象隱式的保存了一個(gè)引用,指向創(chuàng)建它的外圍類對(duì)象。然而,當(dāng)內(nèi)部類是static的時(shí),就不是這樣的。嵌套類意味著:

    要?jiǎng)?chuàng)建嵌套類的對(duì)象,不需要其外圍類的對(duì)象

    不能從嵌套類的對(duì)象中訪問(wèn)非靜態(tài)的外圍類對(duì)象

    嵌套類與普通的內(nèi)部類還有一個(gè)區(qū)別。普通內(nèi)部類的字段與方法,只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段,也不能包含嵌套類。但是嵌套類可以包含這些東西:

public class Parcel11 {private static class ParcelContents implements Contents {private int i = 11;@Overridepublic int value() {return 0;
}
}protected static class ParcelDestination implements Destination {private String label;public static void f() {
}static int x = 10;static class AnotherLevel {public static void f() {
}static int x = 10;
}private ParcelDestination(String whereTo) {
label = whereTo;
}@Overridepublic String readLabel() {return null;
}
}public static Destination destination(String s) {return new ParcelDestination(s);
}public static Contents contents() {return new ParcelContents();
}public static void main(String[] args) {
Contents c = contents();
Destination destination = destination("test");
}
}1234567891011121314151617181920212223242526272829303132333435363738類型:[java]

    在main()中,沒(méi)有任何Parcel11的對(duì)象是必須的。而是使用選取static成員的普通語(yǔ)法來(lái)調(diào)用方法--這些方法返回對(duì)Contents和Destination的引用。

    就像前面所說(shuō)的,在一個(gè)普通(非static)內(nèi)部類中,通過(guò)一個(gè)特殊的this引用可以鏈接到外圍類對(duì)象。嵌套類就沒(méi)有這個(gè)特殊的this引用。

    1、接口內(nèi)部的類

    正常情況下,不能在接口內(nèi)部防止任何代碼,但是嵌套類可以作為接口的一部分。放到接口中的任何類都自動(dòng)是public和static的。因?yàn)轭愂莝tatic的,只是將嵌套類置于接口的命名空間內(nèi),這并不違反接口的規(guī)則。你甚至可以在內(nèi)部類中實(shí)現(xiàn)其外圍接口。

public interface ClassInInterface {void howdy();class Test implements ClassInInterface {
}
}123456類型:[java]

    如果你想要?jiǎng)?chuàng)建某些公共代碼,使得他們可以被某個(gè)接口的所有不同實(shí)現(xiàn)所公用,那么使用接口內(nèi)部的嵌套類會(huì)顯得很方便。

    2、從多層嵌套類中訪問(wèn)外部類的成員

    一個(gè)內(nèi)部類被嵌套多少層并不重要,他能透明的訪問(wèn)所有它所嵌入的外圍類的所有成員。

class MNA {private void f() {}class A {private void B() {private void g() {}
}class B {void h() {
g();
f();
}
}
}
}123456789101112131415類型:[java]

    八、為什么需要內(nèi)部類

    一般來(lái)說(shuō),內(nèi)部類繼承自某個(gè)類或者某個(gè)接口,內(nèi)部類的代碼操作創(chuàng)建它的外圍類的對(duì)象。所以可以認(rèn)為內(nèi)部類提供了某種進(jìn)入其外圍類的窗口。

    內(nèi)部類必須要回答的一個(gè)問(wèn)題是:如果只是需要一個(gè)接口的引用,為什么不通過(guò)外圍類來(lái)實(shí)現(xiàn)這個(gè)接口呢?答案是:如果這能滿足需求,那就應(yīng)該這樣做。那么內(nèi)部類實(shí)現(xiàn)一個(gè)接口與外圍類實(shí)現(xiàn)這個(gè)接口有什么區(qū)別呢?答案是:后者不是總能享受到接口帶來(lái)的方便,有時(shí)候需要用到接口的實(shí)現(xiàn)。所以,使用內(nèi)部類最吸引人的原因是:每個(gè)內(nèi)部類都能獨(dú)立的繼承一個(gè)接口的實(shí)現(xiàn),所以無(wú)論外圍類是否已經(jīng)繼承了某個(gè)接口的實(shí)現(xiàn),對(duì)于內(nèi)部類都沒(méi)有影響。

    如果沒(méi)有內(nèi)部類提供的'可以繼承多個(gè)具體或抽象的類的能力,一些設(shè)計(jì)和編程問(wèn)題就很難解決。從這個(gè)角度看,內(nèi)部類使得多重繼承的解決方案變得完整。接口解決了部分問(wèn)題,而內(nèi)部類有效的實(shí)現(xiàn)了多重繼承。也就是說(shuō),內(nèi)部類允許繼承多個(gè)非接口類型(類或者抽象類)。

    為了看到更多的細(xì)節(jié),讓我們考慮這樣一種情形:即必須在一個(gè)類中以某種形式實(shí)現(xiàn)兩個(gè)接口。由于接口的靈活性,你有兩種選擇,使用單一類,或者使用內(nèi)部類。

public class MultiInterfaces {interface A {
}interface B {
}
;class X implements A, B {
}class Y implements A {B makeB() {return new B() {
};
}
}
}12345678910111213141516類型:[java]

    當(dāng)然,這里假設(shè)在兩種方式下的代碼結(jié)構(gòu)都確實(shí)有邏輯意義。然而遇到問(wèn)題的時(shí)候,通常問(wèn)題本身就能給出某些指引,告訴你是應(yīng)該使用單一類,還是使用內(nèi)部類。但如果沒(méi)有任何其他限制,從實(shí)現(xiàn)的觀點(diǎn)來(lái)看,前面的例子并沒(méi)有什么區(qū)別,他們都能正常運(yùn)作。

    但是如果擁有的是抽象的類或者具體的類,而不是接口,那就只能使用內(nèi)部類才能實(shí)現(xiàn)多重繼承。

public class MultiImplementation {class D {
}abstract class E {
}class Z extends D {E makeE() {return new E() {
};
}
}
}12345678910111213類型:[java]

    但如果不需要解決多重繼承的問(wèn)題,那么自然可以用別的方式進(jìn)行編碼,而不需要使用內(nèi)部類。但如果使用內(nèi)部類,還可以獲得一些其他的特性:

    內(nèi)部類可以有多個(gè)實(shí)例,每個(gè)實(shí)例都有自己的狀態(tài)信息,并且與其外圍內(nèi)對(duì)象的信息相互獨(dú)立

    在單個(gè)外圍類中,可以讓多個(gè)內(nèi)部類以不同的方式實(shí)現(xiàn)同一個(gè)接口,或繼承同一個(gè)類

    創(chuàng)建內(nèi)部類對(duì)象的時(shí)刻并不依賴于外圍類對(duì)象的創(chuàng)建

    內(nèi)部類沒(méi)有令人迷惑的is-a關(guān)系,他就是一個(gè)獨(dú)立的實(shí)體

    九、內(nèi)部類的繼承

    因?yàn)閮?nèi)部類的構(gòu)造器必須連接到指向其外圍類對(duì)象的引用,所以在繼承內(nèi)部類的時(shí)候,事情會(huì)變得有些復(fù)雜。問(wèn)題在于,那個(gè)指向外圍類對(duì)象的秘密的引用必須被初始化,而在子類不再存在可連接的默認(rèn)對(duì)象。要解決這個(gè)問(wèn)題,必須使用特殊的語(yǔ)法來(lái)明確說(shuō)清他們之間的關(guān)聯(lián):

class WithInner {class Inner {
}
}public class InheritInner extends Inner {public InheritInner(WithInner withInner) {
withInner.super();
}public static void main(String[] args) {
WithInner withInner = new WithInner();
InheritInner inheritInner = new InheritInner(withInner);
}
}1234567891011121314類型:[java]

    可以看到,InheritInner只繼承內(nèi)部類,而不是外圍類。但是要生成一個(gè)構(gòu)造器時(shí),默認(rèn)的構(gòu)造器并不算好,而且不能只是傳遞一個(gè)指向外圍類對(duì)象的引用。此外,必須在構(gòu)造器內(nèi)部使用如下語(yǔ)法:

    十、局部?jī)?nèi)部類

    既然局部?jī)?nèi)部類的名字在方法外是不可見(jiàn)的,那為什么我們?nèi)匀皇褂镁植績(jī)?nèi)部類而不是匿名內(nèi)部類呢?唯一的理由是我們需要一個(gè)已命名的構(gòu)造器,或者需要重載構(gòu)造器,而匿名內(nèi)部類是能用于實(shí)例化。

    所以使用局部?jī)?nèi)部類而不是用匿名內(nèi)部類的另一個(gè)理由就是,需要不止一個(gè)該內(nèi)部類的對(duì)象。

    十一、內(nèi)部類標(biāo)識(shí)符

    由于每個(gè)類都會(huì)產(chǎn)生一個(gè).class,其中包含了如何創(chuàng)建該類型的對(duì)象的全部信息,你可能猜到了,內(nèi)部類也必須生成一個(gè).class文件以包含他們的class對(duì)象信息。這些類文件的命名有嚴(yán)格的規(guī)則:外圍類的名字,加上$,再加上內(nèi)部類的名字。

    如果內(nèi)部類是匿名的,編譯器會(huì)簡(jiǎn)單的產(chǎn)生一個(gè)數(shù)字作為其標(biāo)識(shí)符。如果內(nèi)部類是嵌套在別的內(nèi)部類中,只需直接將他們的名字加載其外圍類標(biāo)識(shí)符與$的后面

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多