日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

JavaSE 接口与内部类

發(fā)布時(shí)間:2023/12/15 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSE 接口与内部类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 第十三章 面向?qū)ο蟾呒?jí)-抽象
    • 13.1 抽象類
      • 13.1.1 抽象類
      • 13.1.2 注意
    • 13.2 接口
      • 13.2.1 接口
      • 13.2.2 注意
      • 13.2.3 默認(rèn)方法
      • 13.2.4 接口與抽象類的區(qū)別
      • 13.2.5 實(shí)現(xiàn)接口與繼承類的區(qū)別
      • 13.2.6 什么時(shí)候使用接口
      • 13.2.7 類與類之間的關(guān)系
    • 13.3 內(nèi)部類
      • 13.3.1 實(shí)例內(nèi)部類
      • 13.3.2 靜態(tài)內(nèi)部類
      • 13.3.3 局部?jī)?nèi)部類
      • 13.3.4 匿名內(nèi)部類
      • 13.3.5 內(nèi)部類如何訪問到外部類的私有字段
      • 13.3.6 如何繼承實(shí)例內(nèi)部類
    • 13.4 lambda 表達(dá)式
    • 13.5 方法引用
      • 13.5.1 方法引用
      • 13.5.2 構(gòu)造器引用
    • 13.x 總結(jié)回顧
    • 13.y 腦海練習(xí)
  • 參考答案
    • 第十三章答案

第十三章 面向?qū)ο蟾呒?jí)-抽象

內(nèi)容導(dǎo)視:

  • 抽象類
  • 接口
  • 內(nèi)部類
  • lambda 表達(dá)式
  • 方法引用

13.1 抽象類

內(nèi)容導(dǎo)視:

  • 抽象類
  • 注意

13.1.1 抽象類

父類型的引用指向子類型的對(duì)象,使得不同子類型的對(duì)象調(diào)用重寫后的方法后得到不同的結(jié)果。為此父類必須聲明一個(gè)實(shí)例方法,讓子類重寫,但本身不確定如何實(shí)現(xiàn)該方法時(shí),可以將其聲明為抽象方法。設(shè)計(jì)好后,讓子類繼承,并實(shí)現(xiàn)抽象方法的具體步驟。

在繼承這節(jié)中,Animal 中的 play 方法就是如此。

class Animal { ...public void play() {System.out.println("...");} }

抽象方法聲明:訪問權(quán)限修飾符 abstract 返回值類型 方法名(形參列表);

這是一個(gè)沒有方法體(沒有實(shí)現(xiàn))的方法,以分號(hào)結(jié)尾。

當(dāng)一個(gè)類存在抽象方法時(shí),需要將該類聲明為抽象類。抽象類可以被繼承,由子類實(shí)現(xiàn)抽象方法。(重寫此方法)

訪問權(quán)限修飾符 abstract class 類名 {...} abstract class Animal {public abstract void play(); } class Cat extends Animal {@Overridepublic void play() {System.out.println("飛天遁地,無所不能!");} }

13.1.2 注意

  • 只有抽象類中才能存在抽象方法
  • 抽象類中可以沒有抽象方法
  • 抽象類不能被實(shí)例化
  • 非抽象類如果繼承抽象類,必須實(shí)現(xiàn)抽象類的所有抽象方法(抽象類可以不用)
  • 抽象方法沒有方法體,不能使用 private、final、static 修飾,否則無法被子類實(shí)現(xiàn)
  • 抽象方法的訪問權(quán)限最好不要設(shè)置為默認(rèn)級(jí)別,否則當(dāng)其它包下的類繼承抽象類時(shí),無法被訪問到的父類方法無法被實(shí)現(xiàn)。

13.2 接口

內(nèi)容導(dǎo)視:

  • 接口
  • 注意
  • 默認(rèn)方法
  • 接口與抽象類的區(qū)別
  • 實(shí)現(xiàn)接口與繼承類的區(qū)別
  • 什么時(shí)候使用接口
  • 類與類之間的關(guān)系

13.2.1 接口

接口是抽象方法的集合,作用是讓其他類實(shí)現(xiàn),用于擴(kuò)展功能。接口編譯后生成的是字節(jié)碼文件。

語法:接口中只有靜態(tài)常量和抽象方法。

訪問權(quán)限修飾符 interface 接口名 {// 聲明常量public static final 數(shù)據(jù)類型 常量名 =;// 聲明抽象方法public abstract 返回值類型 方法名(形參列表); }

聲明常量時(shí)的 public static final 可以省略不寫;

聲明方法時(shí)的 public 修飾符可以省略不寫;

聲明抽象方法時(shí)的 abstract 可以省略不寫。

最終簡(jiǎn)化為:

訪問權(quán)限修飾符 interface 接口名 {// 聲明常量數(shù)據(jù)類型 常量名 =;// 聲明抽象方法返回值類型 方法名(形參列表); }

接口中沒有代碼塊、構(gòu)造器,不能被實(shí)例化;接口里的常量、方法的訪問權(quán)限默認(rèn)是公開的,不可更改。

這些抽象方法需要被類實(shí)現(xiàn),使用 implements 關(guān)鍵字,語法:訪問權(quán)限修飾符 class 類名 implements 接口名 {...}

接口中的方法訪問權(quán)限是公開的:

interface I1 {int COUNT = 5;void some(); } // 子類必須實(shí)現(xiàn)接口中的所有抽象方法 class A implements I1 {/*com.cqh.arr2.A中的some()無法實(shí)現(xiàn)com.cqh.arr2.I1中的some()正在嘗試分配更低的訪問權(quán)限; 以前為public*/// protected void some() {}@Override// JDK6 以前不可用于標(biāo)注實(shí)現(xiàn)方法public void some() {} }

在 JDK8 及以后,允許接口包含默認(rèn)方法和靜態(tài)方法,訪問權(quán)限也默認(rèn)為 public。

interface I2 {// 默認(rèn)方法default void some() {System.out.println("接口的 some 方法執(zhí)行了");}// 靜態(tài)方法static int add() {return 0;} }

區(qū)分接口、父類中的同名方法:

class B implements I2 {@Overridepublic void some() {System.out.println("子類重寫了 some 方法");// 訪問接口的 some 方法,父類直接使用 super.some()I2.super.some();} }

this.some()是訪問本類的 some 方法,I2.super.some()是訪問本類從 I2 繼承的 some 方法。

區(qū)分接口、父類中的同名字段:

interface I1 {int x = 0; } class A {int x = 2; }class B extends A implements I1 {public void s1() {// 對(duì)x的引用不明確,A 中的變量 x 和 I1 中的變量 x 都匹配//System.out.println(x);}// 區(qū)分接口與父類的同名變量public void s2() {System.out.println(I1.x + "=" + super.x);} }

13.2.2 注意

  • 接口之間支持多繼承,實(shí)現(xiàn)類也要實(shí)現(xiàn)接口繼承的其它接口的抽象方法。

    interface I1 {void some1(); } interface I2 extends I1 {void some2(); } class A implements I2 {// 需要實(shí)現(xiàn) some2、some1 方法,當(dāng)然如果繼承的父類已有此方法,就不用實(shí)現(xiàn) }
  • 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,class A implements I1, I2, I3。

  • 接口類型的引用可以指向?qū)崿F(xiàn)類型的對(duì)象,也算多態(tài)。

    interface I3 {default void some() {System.out.println("默認(rèn)");}void other(); } class C implements I3 {@Overridepublic void some() {System.out.println("重寫");}public void other() {System.out.println("實(shí)現(xiàn)");} } class Test {public static void main(String[] args) {invoke(new C());}public static void invoke(I3 i) {i.some();i.other();} }
  • extends 與 implements 可以同時(shí)存在,class A extends Object implements I1。

  • 實(shí)現(xiàn)類與接口之間滿足 like a 的邏輯關(guān)系,例:魚實(shí)現(xiàn)了翅膀這個(gè)接口,擁有了飛翔的功能,魚變得可以像鳥一樣飛翔。

    當(dāng)子類繼承了父類,就自動(dòng)擁有了父類的功能。如果子類需要擴(kuò)展功能,可以通過實(shí)現(xiàn)接口的方式擴(kuò)展。

  • 如果繼承的父類與接口存在同一個(gè)方法,調(diào)用此方法時(shí)父類優(yōu)先。

13.2.3 默認(rèn)方法

當(dāng)實(shí)現(xiàn)接口時(shí),只需其中一個(gè)方法,總是強(qiáng)制重寫所有抽象方法未免有些煩人;可以使用抽象類先實(shí)現(xiàn)幾個(gè)抽象方法,以后所有需要實(shí)現(xiàn)此接口的類,直接繼承抽象方法即可。

interface I1 {void some1();void some2();void some3();void some4(); } abstract class A1 implements I1 {@Overridepublic void some1() {}@Overridepublic void some2() {}@Overridepublic void some3() {} } class C1 extends A1 {@Overridepublic void some4() {} }

default 作用就在于此,將不太重要的方法聲明為 default,而不必讓子類全部實(shí)現(xiàn)。

interface I1 {default void some1() {}default void some2() {}default void some3() {}void some4(); } class C1 implements I1 {@Overridepublic void some4() {} }

另一種用法,當(dāng)使用者實(shí)現(xiàn)了一個(gè)接口,后來接口又?jǐn)U充了一個(gè)方法,則之前所有實(shí)現(xiàn)它的類,則需要實(shí)現(xiàn)新增的方法,否則就會(huì)報(bào)錯(cuò);如果擴(kuò)充的方法聲明為 default,就不必?fù)?dān)心對(duì)使用者造成影響。

13.2.4 接口與抽象類的區(qū)別

比較接口抽象類
組合可以實(shí)現(xiàn)多個(gè)接口只能繼承一個(gè)類
狀態(tài)只有靜態(tài)常量任意
構(gòu)造器
代碼塊
訪問權(quán)限public任意

13.2.5 實(shí)現(xiàn)接口與繼承類的區(qū)別

接口和繼承解決的問題不同

繼承的價(jià)值主要在于:解決代碼的復(fù)用性和可維護(hù)性。

接口的價(jià)值主要在于:設(shè)計(jì)好各種規(guī)范(方法),讓其它類去實(shí)現(xiàn)這些方法。

接口比繼承更加靈活

接口比繼承更加靈活,繼承是滿足 is-a 的關(guān)系,天生決定。而接口只需滿足 like-a 的關(guān)系。

13.2.6 什么時(shí)候使用接口

  • 類只支持單繼承,當(dāng)已經(jīng)繼承了其它類時(shí),只有實(shí)現(xiàn)接口才能擴(kuò)展功能。

  • 制定規(guī)范,讓其它人去實(shí)現(xiàn);消費(fèi)者直接調(diào)用,而不必關(guān)心提供者。

  • 方法形參使用接口類型,用于解耦合,因?yàn)榻涌陬愋偷囊每梢灾赶驅(qū)崿F(xiàn)接口的類的對(duì)象

  • 解耦合:降低程序的耦合度,提高程序的擴(kuò)展力

    例1:解耦合

    修改之前:

    class Person {public void play(Swim swim) {swim.play();}public void play(Run run) {run.play();}// 新增其它運(yùn)動(dòng)需要新增方法 }// 如果 Swim 類修改了,Person 中有關(guān) Swim 的部分可能會(huì)受到影響 class Swim {public void play() {System.out.println("游泳中...");} } // 同理 class Run {public void play() {System.out.println("跑步中...");} }class Test {public static void main(String[] args) {Person zs = new Person();zs.play(new Run());} }

    修改方案 1,使用關(guān)聯(lián),使用接口類型的變量作為實(shí)例變量,直接調(diào)用它的方法。

    interface Sport {void play(); } class Swim implements Sport {public void play() {System.out.println("游泳中...");} } class Run implements Sport {public void play() {System.out.println("跑步中...");} } class Person {Sport sport;public void setSport(Sport sport) {this.sport = sport;}public void play() {sport.play();} } class Test {public static void main(String[] args) {Person zs = new Person();zs.setSport(new Run());zs.play();} }

    修改方案 2,作為形參,根據(jù)傳進(jìn)的實(shí)參不同,調(diào)用的 play 方法也不同。

    class Person {public void play(Sport sport) {sport.play();} } class Test {public static void main(String[] args) {Person zs = new Person();// 如果需要其它的運(yùn)動(dòng),可以編寫一個(gè)類繼承 Sport 接口// 不用修改 Person 類,只用傳入實(shí)參即可zs.play(new Swim());} }

    例2:制定規(guī)范

    設(shè)計(jì)一系列公開的接口:

    interface Driver {Connection connect(String name); } interface Connection {void open();void close(); }class Manager {static Driver driver;public static void register(Driver driver) {Manager.driver = driver;}// 面向接口調(diào)用,讓制定規(guī)則的人、使用者不用關(guān)心實(shí)現(xiàn)類是誰public static Connection getConnection(String name) {return driver.connect(name);} }

    這時(shí)來個(gè)張三實(shí)現(xiàn)接口:

    class ZsDriver implements Driver {public Connection connect(String name) {System.out.println("使用張三寫的代碼連接數(shù)據(jù)庫成功!");return new ZsConnection(name);} } class ZsConnection implements Connection {private String name;public ZsConnection(String name) {this.name = name;}public void open() {System.out.println(name + "打開了通道");}public void close() {System.out.println(name + "關(guān)閉了連接");} }

    使用者編寫程序,選擇一個(gè)實(shí)現(xiàn)者,按接口聲明的規(guī)范調(diào)用方法。

    class Test{public static void main(String[] args) {Manager.register(new ZsDriver());Connection conn = Manager.getConnection("路人甲");conn.open();conn.close();} }

    如果又來個(gè)李四實(shí)現(xiàn)接口,只需要改動(dòng)測(cè)試類的一個(gè)地方,不需要改 Manager 類和規(guī)范。

    Manager.register(new LsDriver());

    以后通過讀取配置文件,自動(dòng)創(chuàng)建對(duì)象并傳入 register 方法,連代碼都不需要改。

    例3:擴(kuò)展功能

    class Animal {int age;int type; } interface Wing {void fly(); }// 如果貓已經(jīng)繼承了 Animal 類,想要飛,只能實(shí)現(xiàn)接口,而不能再繼承鳥類 class Cat extends Animal implements Wing {public void fly() {System.out.println("本貓也會(huì)飛了...");} }

    13.2.7 類與類之間的關(guān)系

    多用組合,少用繼承

    依賴:A 類的方法中使用 B 類型的對(duì)象,如上學(xué)時(shí)借助公交車。

    class A {public void some() {B b = new B(數(shù)據(jù)1, 數(shù)據(jù)2);b.invoke();} }

    關(guān)聯(lián)(組合):B 類作為 A 類的成員變量。

    class A {B b; }

    聚合:特殊的關(guān)系,B 類組成的集合作為 A 類的成員變量,是部分與整體的關(guān)系;每個(gè) b 的生命周期不由 a 決定;如同我與我擁有的書的關(guān)系:我沒來時(shí),書在,我不在了,書還在。

    class Person {List<Book> bookList = new ArrayList<>(3);// 人的腦海static int count;// 人的數(shù)量String name;// 人的姓名public Person(String name) {this.name = name;}public Book end() {return new Book(name + (++count));}public void selection(Book[] books) {for (int i = 0; i < books.length; i++) {bookList.add(books[i]);}} } class World {public static void main(String[] args) {Book b1 = new Book("月亮是如何練成的");Book b2 = new Book("太陽的燃燒");Book b3 = new Book("語法快速入門");Book b4 = new Book("惡魔法則");Book b5 = beginToEnd("我", b1);// 人不在了,書還在Book b6 = beginToEnd("你", b2, b5);Book b7 = beginToEnd("他", b1, b2, b3, b4, b6);}public static Book beginToEnd(String name, Book... books) {Person p = new Person(name);p.selection(books);// 人收集書籍return p.end();} }

    合成:特殊的聚合,B 類組成的集合作為 A 類的成員變量,部分與整體的關(guān)系;每個(gè) b 的生命周期由 a 決定;如同我與我的四肢的關(guān)系。

    實(shí)現(xiàn):實(shí)現(xiàn)類與接口的關(guān)系。

    class A implements B {}

    繼承(泛化):父子類關(guān)系,A

    class A extends B {} 關(guān)系UML 連接符
    依賴人----->車
    關(guān)聯(lián)人——>狗
    聚合車?——>輪胎
    合成人?——>四肢
    實(shí)現(xiàn)實(shí)現(xiàn)類-----?接口
    繼承子類——?父類

    雙向關(guān)聯(lián)可以雙箭頭,也可以無箭頭。

    class A {B b; } class B {A a; }

    13.3 內(nèi)部類

    內(nèi)容導(dǎo)視:

    • 實(shí)例內(nèi)部類
    • 靜態(tài)內(nèi)部類
    • 局部?jī)?nèi)部類
    • 匿名內(nèi)部類
    • 內(nèi)部類如何訪問到外部類的私有字段
    • 如何繼承實(shí)例內(nèi)部類

    定義在類中的類稱為內(nèi)部類,外面的類稱為外部類。如同正常類使用即可,編譯也會(huì)生成 .class 文件。

    class OutClass {// 外部類static interface InnerInterface2 {// 內(nèi)部接口(static 可以省略,接口默認(rèn)是靜態(tài)成員)} }

    內(nèi)部類可以訪問外部類的私有變量,對(duì)同一個(gè)包下的類隱藏。

    13.3.1 實(shí)例內(nèi)部類

    實(shí)例內(nèi)部類定義在外部類的成員位置,地位等同于實(shí)例變量,由于靜態(tài)方法不能直接訪問實(shí)例相關(guān)的,需要通過外部類的實(shí)例.new InnerClass()訪問。

    訪問權(quán)限修飾符 class 外部類類名 {訪問權(quán)限修飾符 class 內(nèi)部類類名 {...} }

    實(shí)例內(nèi)部類可以直接訪問外部類的所有成員,包括私有的;作用域?yàn)檎麄€(gè)類體。

    創(chuàng)建內(nèi)部類對(duì)象:

    // 外部類中 class OutClass {class InnerClass {}// 實(shí)例方法中public void some() {InnerClass inner = new InnerClass();}// 靜態(tài)方法中public static void some2() {OutClass out = new OutClass();InnerClass inner = out.new InnerClass();// new OutClass().new InnerClass();} } // 外部其它類中 class B {public static void main(String[] args) {OutClass out = new OutClass();OutClass.InnerClass inner = out.new InnerClass();} }

    實(shí)例內(nèi)部類不支持靜態(tài)相關(guān)的聲明,除了靜態(tài)常量(以字面量的方式賦值)。編譯后生成 OutClass$InnerClass.class 文件。

    最好不要使用 $ 作為標(biāo)識(shí)符,$ 是用于編譯器自定義類名、變量名,以免沖突。

    實(shí)例內(nèi)部類不能被繼承外部類的類重寫。

    class Out {class Inner {public void some() {System.out.println("最開始的內(nèi)部類");}} } class Out2 extends Out {class Inner {public void some() {System.out.println("重寫后的內(nèi)部類");}} } class Test {public static void main(String[] args) {Out out = new Out2();Out.Inner inner = out.new Inner();inner.some();// 最開始的內(nèi)部類} }

    13.3.2 靜態(tài)內(nèi)部類

    靜態(tài)內(nèi)部類定義在外部類的成員位置,有 static 修飾,地位等同于靜態(tài)變量,使用 new 外部類類名.內(nèi)部類類名()訪問。

    當(dāng)不需要直接訪問外部類的實(shí)例變量或方法時(shí)可以定義為靜態(tài)內(nèi)部類。

    訪問權(quán)限修飾符 class 外部類類名 {訪問權(quán)限修飾符 static class 內(nèi)部類類名 {...} }

    靜態(tài)內(nèi)部類可以直接訪問外部類所有的靜態(tài)成員,包括私有的;作用域?yàn)檎麄€(gè)類體。

    創(chuàng)建靜態(tài)內(nèi)部類對(duì)象:

    // 外部類中 class OutClass {static class InnerClass {public static int i = 3;}// 方法中public static void some() {InnerClass inner = new InnerClass();} } // 外部其它類中 class B {public static void main(String[] args) {OutClass.InnerClass inner = new OutClass.InnerClass();int i = OutClass.InnerClass.i;} }

    編譯后生成 OutClass$InnerClass.class 文件。

    13.3.3 局部?jī)?nèi)部類

    局部?jī)?nèi)部類定義在外部類的局部位置,地位等同于局部變量,可以使用 final 修飾。

    訪問權(quán)限修飾符 class 外部類類名 {方法中、代碼塊中 {class 內(nèi)部類類名 {...}} }

    在實(shí)例方法、實(shí)例代碼塊、構(gòu)造器內(nèi)聲明的內(nèi)部類可以直接訪問外部類的所有成員,包括私有的;在靜態(tài)方法、靜態(tài)代碼塊內(nèi)聲明的內(nèi)部類只能訪問靜態(tài)成員;

    局部?jī)?nèi)部類只在定義內(nèi)部類時(shí)的方法或代碼塊內(nèi)有效。

    創(chuàng)建內(nèi)部類對(duì)象:

    class OutClass {public void some() {// 僅在此方法內(nèi)有效class InnerClass {}InnerClass inner = new InnerClass();} }

    局部?jī)?nèi)部類不支持靜態(tài)相關(guān)的聲明,除了靜態(tài)常量(以字面量的方式賦值)。

    所在方法內(nèi),局部?jī)?nèi)部類只能使用值不會(huì)改變的局部變量。(使用的變量本質(zhì)是 final 變量,使得局部變量與在局部類內(nèi)建立的拷貝保持一致)

    public static void main(String[] args) {int i = 3;abstract class InnerClass {// 閉包public void some() {// i++;從內(nèi)部類引用的本地變量必須是最終變量或?qū)嶋H上的最終變量System.out.println(i);}} }

    通過反編譯可以看出,引用的本地變量 i 存儲(chǔ)在內(nèi)部類的成員變量 final int val$i;,且在構(gòu)造器中賦的值。

    abstract class com.cqh.arr1.Out$1InnerClass {final int val$i;com.cqh.arr1.Out$1InnerClass();Code:0: aload_01: iload_12: putfield #1 // Field val$i:I5: aload_06: invokespecial #2 // Method java/lang/Object."<init>":()V9: return

    在計(jì)算機(jī)科學(xué)中,閉包(Closure),又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures),是引用了自由變量的函數(shù)。

    簡(jiǎn)單來說就是當(dāng)一個(gè)方法引用了方法局部變量外的變量時(shí),它就是一個(gè)閉包。閉包是由方法和與其相關(guān)的引用環(huán)境(方法外變量)組合而成的實(shí)體。

    13.3.4 匿名內(nèi)部類

    匿名內(nèi)部類是一種局部?jī)?nèi)部類,類名是隱匿的,所以沒有構(gòu)造器,作為子類或?qū)崿F(xiàn)類,定義匿名內(nèi)部類的同時(shí)也會(huì)創(chuàng)建該類的實(shí)例,一次性用品。

    作為子類:

    父類類名 引用名 = new 父類類名(實(shí)參列表) {子類類體... };

    作為實(shí)現(xiàn)類:

    接口名 引用名 = new 接口名() {實(shí)現(xiàn)類類體... };

    例:

    interface I1 {void some(); } class Test {public static void main(String[] args) {// 生成了一個(gè)實(shí)現(xiàn) I1 接口的匿名類,創(chuàng)建了此匿名類的對(duì)象后調(diào)用 some 方法new I1() {@Overridepublic void some() {System.out.println("實(shí)現(xiàn) some 方法...");}}.some();// 局部?jī)?nèi)部類class A implements I1 {@Overridepublic void some() {System.out.println("實(shí)現(xiàn) some 方法 2...");}};new A().some();} }

    編譯后生成 OutClass$1.class 文件,從 1 開始,每遇見匿名內(nèi)部類就加一。

    當(dāng)不想編寫大量代碼時(shí),可以使用匿名內(nèi)部類更加方便快捷:

    // 之前 class ArrayList2<String> extends ArrayList {{add("zs");add("ls");} } System.out.println(new ArrayList2());// 之后 System.out.println(new ArrayList<String>(){{add("zs"); add("ls");}});

    13.3.5 內(nèi)部類如何訪問到外部類的私有字段

    class Out {private String name;class Inner {public void some() {name = "g";System.out.println(name);}private Inner() {}}public static void main(String[] args) {new Out().new Inner().some();} }

    編譯后生成 Out.class,Out$Inner.class,反編譯后如下:

    class Out {private java.lang.String name;Out();public static void main(java.lang.String[]);static java.lang.String access$002(Out, java.lang.String);static java.lang.String access$000(Out); } class Out$Inner {final Out this$0;public void some();private Out$Inner(Out);Out$Inner(Out, Out$1); }

    還原真實(shí)的代碼:

    class Out {private String name;public static void main(String[] args) {new Inner(new Out(), null).some();}// 此方法用于賦值static String access$002(Out out, String str) {out.name = str;return str;}// 此方法用于訪問私有字段static String access$000(Out out) {return out.name;} } class Inner {// 需要外部類的引用final Out this$0;public void some() {// 給外部類引用的字段賦值Out.access$002(this$0, "g");System.out.println(Out.access$000(this$0));}// 外部類引用通過構(gòu)造器賦值private Inner(Out out) {this$0 = out;}Inner(Out out, Out out2) {this(out);} }

    可以看見外部類生成了默認(rèn)訪問權(quán)限的 access$xxx 方法供內(nèi)部類訪問。如果想要修改本類的 private 字段,代碼需要與 Out 類放置在同一個(gè)包中。

    假如我現(xiàn)在已有 Out 類源碼,正好此類的內(nèi)部類訪問了外部類的私有變量,我可以將復(fù)制此類,將源碼中的內(nèi)部類去掉,手動(dòng)添加 access$xxx 方法。

    package com.cqh; // 想要訪問 Out.class 中的私有字段 class Out {private boolean flag = true;class Inner {public void other() {if (flag) {System.out.println("hello");flag = false;}}} }

    在任意地方新建 com/cqh,復(fù)制此類到 cqh 目錄下,去掉內(nèi)部類后編譯生成 class 文件。

    package com.cqh;// 與原 Out.class 在同一個(gè)包下 // 另一個(gè)地方的 Out.java class Out {private boolean flag = true;static boolean access$000(Out out) {return out.flag;}static boolean access$002(Out out, boolean flag) {out.flag = flag;return out.flag;} } // 攻擊代碼 class Invade {public static void main(String[] args) {Out out = new Out();out.access$002(out, false);System.out.println(out.access$000(out));} }

    將編譯后生成的 Invade.class 放置在 Out.class 所在目錄下(實(shí)際目錄);就可以訪問、修改 Out 類的私有字段。

    有人說,那我豈不是把類放在 java.xxx 包下,就可以修改 JDK 源碼的私有字段嗎?

    不可以,因?yàn)橛邪踩珯C(jī)制,包名不允許以 java. 開頭:

    Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.awt 安全異常,禁止的包名稱

    13.3.6 如何繼承實(shí)例內(nèi)部類

    通過上節(jié)的還原真實(shí)的代碼,可以看出實(shí)例內(nèi)部類必須傳入外部類的引用,在構(gòu)造器中完成賦值。

    所以繼承實(shí)例內(nèi)部類時(shí),需要使用特殊的語法,將外部類引用傳遞進(jìn)去。

    class Out {class Inner {// 調(diào)用的是此構(gòu)造public Inner() {}} } class Other extends Out.Inner {public Other(Out out) {// 調(diào)用 Out$Inner 類的無參構(gòu)造,將外部類引用作為參數(shù)傳遞out.super();} }

    13.4 lambda 表達(dá)式

    JDK8 推出的新特性,目的是簡(jiǎn)化創(chuàng)建函數(shù)式接口的實(shí)現(xiàn)類對(duì)象的代碼,一般作為實(shí)參使用。可以看作是簡(jiǎn)化的匿名內(nèi)部類。

    函數(shù)式接口(functional interface):只包含一個(gè)抽象方法的接口(可以有默認(rèn)方法和靜態(tài)方法)

    函數(shù)式接口可以加 @FunctionalInterface 注解,如果無意增加了另一個(gè)抽象方法會(huì)報(bào)錯(cuò)。

    @FunctionalInterface interface I1 {void some(); }

    lambda 語法:接口名 引用名 = (形參列表) -> {方法體}

    規(guī)則

    • 可以省略形參的數(shù)據(jù)類型

    • 當(dāng)形參只有一個(gè)時(shí),可以省略小括號(hào)

    • 當(dāng)方法體只有一條語句時(shí),可以省略花括號(hào)

      • 當(dāng)這條語句為 return xxx 時(shí),可以省略 return
      interface Math {int add(int n1, int n2); }Math math = (n1, n2) -> n1 + n2; Math math2 = (n1, n2) -> {return n1 + n2;} Math math3 = new Math() {@Overridepublic int add(int n1, int n2) {return n1 + n2;} };

    例:

    interface I1 {void some(); } class Test {public static void main(String[] args) {// lambda 表達(dá)式I1 i1 = () -> {System.out.println("實(shí)現(xiàn) some 方法");};// 匿名內(nèi)部類I1 i2 = new I1() {@Overridepublic void some() {System.out.println("實(shí)現(xiàn) some 方法 2...");}};// 作為實(shí)參invoke(() -> System.out.println("實(shí)現(xiàn) some 方法 3..."));}public static void invoke(I1 i) {i.some();} }

    13.5 方法引用

    內(nèi)容導(dǎo)視:

    • 方法引用
    • 構(gòu)造器引用

    JDK 8 新特性,當(dāng) lambda 表達(dá)式中只有一條語句時(shí),可以使用此特性,例:

    interface I1 {void some(int num); } class Test {public static void main(String[] args) {I1 i = System.out::println;I1 i2 = num -> System.out.println(num);} }

    13.5.1 方法引用

    只有一條調(diào)用方法的語句時(shí)。

    有三種形式:

    • 引用::實(shí)例方法名
    • 類名::靜態(tài)方法名
    • 類名::實(shí)例方法名

    前兩種方式,形參繼續(xù)傳遞給調(diào)用的方法:

    interface I1 {int add(int n1, int n2); } class A {public static int add(int n1, int n2) {return n1 + n2;} } class Test {public static void main(String[] args) {I1 i1 = (n1, n2) -> A.add(n1, n2);// 等價(jià)于下面的語句I1 i2 = A::add;} }

    后一種方式,第一個(gè)形參作為對(duì)象引用,其它參數(shù)傳遞給調(diào)用的方法:

    interface I1 {void init(A a, int age); } class A {int age;public void setAge(int age) {this.age = age;} } class Test {public static void main(String[] args) {I1 i1 = (a, age) -> a.setAge(age);I1 i2 = A::setAge;} }

    13.5.2 構(gòu)造器引用

    只有一條返回對(duì)象的語句時(shí)。

    語法:類型::new

    傳進(jìn)來的實(shí)參作為構(gòu)造器的實(shí)參。

    interface I1 {A init(int age); } class A {int age;public A(int age) {this.age = age;} } class Test {public static void main(String[] args) {I1 i1 = age -> new A(age);I1 i2 = A::new;} }

    13.x 總結(jié)回顧

    某實(shí)例方法只是為了讓子類重寫,自身不確定如何實(shí)現(xiàn),可以聲明為抽象方法。

    接口里的常量、方法都是 public 修飾的;當(dāng)不想強(qiáng)迫子類實(shí)現(xiàn)某方法時(shí),可以使用 default。

    接口作為規(guī)范讓子類實(shí)現(xiàn),用于擴(kuò)展功能。

    匿名內(nèi)部類很常見,用于簡(jiǎn)化創(chuàng)建對(duì)象,Lambda 表達(dá)式對(duì)此簡(jiǎn)化更近一步,用于函數(shù)式接口。

    13.y 腦海練習(xí)

    13.1 控制臺(tái)上輸出?

    1)

    class Student {final String name;Vehicle vehicle;public Student(String name) {this.name = name;}public void goToSchool() {if (!(vehicle instanceof Bike)) {this.vehicle = VehiclesFactory.getBike();}System.out.print(this.name);vehicle.work("學(xué)校");}public void flying() {this.vehicle = VehiclesFactory.getBambooDragonfly();System.out.print(this.name); vehicle.work("飛天");} }interface Vehicle {void work(String goal); } class Bike implements Vehicle {@Overridepublic void work(String goal) {System.out.println("騎著老舊的小自行車嘎吱嘎吱緩緩地駛向了" + goal);} } class VehiclesFactory {private static final Bike bike = new Bike();public static Vehicle getBike() {return bike;}public static Vehicle getBambooDragonfly() {return goal -> System.out.println("轉(zhuǎn)著竹蜻蜓" + goal + "~~~");} } class Test {public static void main(String[] args) {Student zs = new Student("張三");zs.goToSchool();zs.flying();} }

    2)

    abstract class World {public final void life() {goToSchool();goToWork();toGetMarried();toHaveChildren();die();}protected abstract void goToSchool();protected abstract void goToWork();protected abstract void toGetMarried();protected abstract void toHaveChildren();protected abstract void die(); } class Loser extends World {String name;public Loser(String name) {this.name = name;}@Overridepublic void goToSchool() {System.out.println(name + "滿懷疲憊地上學(xué)了,成績(jī)倒數(shù)...");}@Overridepublic void goToWork() {System.out.print("末尾淘汰制,因業(yè)績(jī)墊底," + name +"被辭退了;");System.out.println("但" + name + "絲毫不慌,因?yàn)楦F不過三代。");}@Overridepublic void toGetMarried() {System.out.println("父母催著結(jié)婚,于是" + name + "急著結(jié)婚了" +",盡管不知道如何撫養(yǎng)孩子,想著給錢就行了...");}@Overridepublic void toHaveChildren() {System.out.print(name + "在外地辛苦工作,妻子半輩子守在農(nóng)村;似乎孩子不怎么認(rèn)" + name + "了...");System.out.println("哦,原來半生只是一場(chǎng)夢(mèng)...");}@Overridepublic void die() {System.out.print(name + "在陽臺(tái)上安詳?shù)貢裰?#xff0c;突然就沒了生息...");System.out.print("可惜高樓大廈,每層人家門戶緊閉,沒有人注意到" + name + "的逝去,");System.out.println("而" + name + "家里除他以外再?zèng)]有人了...");} } class Test {public static void main(String[] args) {new Loser("三代目").life();} }

    3)

    class Arr {int[] arr;public void foreach(I2 i2) {Objects.requireNonNull(i2);for (int i = 0; i < arr.length; i++) {i2.some(arr[i]);}}public Arr(int[] arr) {Objects.requireNonNull(arr);this.arr = arr;} } interface I2 {void some(int element); } class Test {public static void main(String[] args) {Arr a = new Arr(new int[]{4, 6, 8});a.foreach((element) -> {System.out.println("遍歷的元素為:" + element);});} }

    4)

    interface Math {int invoke(int n1, int n2); }static Math math = (n1, n2) -> {Math math1 = (a1, b1) -> a1 + b1;Math math2 = (x1, y1) -> x1 * y1 - x1;return math1.invoke(n1, n2) - math2.invoke(n1, n2); };public static void main(String[] args) {System.out.println(math.invoke(5, 6)); }

    5)

    interface IntConsumer {void run(int value); } public static void repeat(int n, IntConsumer action) {for (int i = 0; i < n; i++) {action.run(i);} } public static void main(String[] args) {repeat(10, i -> System.out.println("down:" + (9 - i))); }

    6)

    interface TypeC {void work(); } interface MicroUSB {void work2(); }class Phone implements MicroUSB {@Overridepublic void work2() {System.out.println("充電中...");} } class Adapter implements TypeC {Phone phone;public Adapter(Phone phone) {Objects.requireNonNull(phone);this.phone = phone;}@Overridepublic void work() {phone.work2();} } class Test {public static void main(String[] args) {Phone phone = new Phone();charge(new Adapter(phone));}public static void charge(TypeC typeC) {typeC.work();} }

    參考答案

    第十三章答案

    13.1 控制臺(tái)上輸出?

    1)

    class Student {final String name;Vehicle vehicle;public Student(String name) {this.name = name;}public void goToSchool() {if (!(vehicle instanceof Bike)) {this.vehicle = VehiclesFactory.getBike();}System.out.print(this.name);vehicle.work("學(xué)校");}public void flying() {this.vehicle = VehiclesFactory.getBambooDragonfly();System.out.print(this.name); vehicle.work("飛天");} }interface Vehicle {void work(String goal); } class Bike implements Vehicle {@Overridepublic void work(String goal) {System.out.println("騎著老舊的小自行車嘎吱嘎吱緩緩地駛向了" + goal);} } class VehiclesFactory {private static final Bike bike = new Bike();public static Vehicle getBike() {return bike;}public static Vehicle getBambooDragonfly() {return goal -> System.out.println("轉(zhuǎn)著竹蜻蜓" + goal + "~~~");} } class Test {public static void main(String[] args) {Student zs = new Student("張三");zs.goToSchool();zs.flying();} }

    zs 調(diào)用 goToSchool 方法,vehicle 默認(rèn)為 null,if 條件為 true,進(jìn)入;調(diào)用 getBike 方法,返回 Bike 類型的對(duì)象,賦給了 zs.vehicle;

    vehicle.work(),vehicle 實(shí)際類型為 Bike,調(diào)用的是 Bike 類中的 work 方法,輸出 張三騎著老舊的小自行車嘎吱嘎吱緩緩地駛向了學(xué)校

    zs 調(diào)用 flying 方法,getBambooDragonfly 返回的是實(shí)現(xiàn) Vehicle 接口的匿名內(nèi)部類的對(duì)象,賦給了 zs.vehicle;

    調(diào)用 vehicle.work 方法,輸出 張三轉(zhuǎn)著竹蜻蜓飛天~~~


    2)在接口或抽象類中定義一個(gè)算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

    主要解決:一些方法通用,卻在每一個(gè)子類都重新寫了這一方法。

    關(guān)鍵代碼:在抽象類實(shí)現(xiàn),其他步驟在子類實(shí)現(xiàn)。

    優(yōu)點(diǎn):1、封裝不變部分,擴(kuò)展可變部分。 2、提取公共代碼,便于維護(hù)。 3、行為由父類控制,子類實(shí)現(xiàn)。

    缺點(diǎn):每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類來實(shí)現(xiàn),導(dǎo)致類的個(gè)數(shù)增加,使得系統(tǒng)更加龐大。

    使用場(chǎng)景:1、有多個(gè)子類共有的方法,且邏輯相同。 2、重要的、復(fù)雜的方法,可以考慮作為模板方法。

    注意事項(xiàng):為防止惡意操作,一般模板方法都加上 final 關(guān)鍵詞。

    如果子類重寫的方法,邏輯大致相同,那沒必要每個(gè)類都寫一遍,可以提取公共部分,在父類中定義一個(gè)骨架,某個(gè)步驟延遲到子類實(shí)現(xiàn)。

    abstract class World {public final void life() {goToSchool();goToWork();toGetMarried();toHaveChildren();die();}protected abstract void goToSchool();protected abstract void goToWork();protected abstract void toGetMarried();protected abstract void toHaveChildren();protected abstract void die(); } class Loser extends World {String name;public Loser(String name) {this.name = name;}@Overridepublic void goToSchool() {System.out.println(name + "滿懷疲憊地上學(xué)了,成績(jī)倒數(shù)...");}@Overridepublic void goToWork() {System.out.print("末尾淘汰制,因業(yè)績(jī)墊底," + name +"被辭退了;");System.out.println("但" + name + "絲毫不慌,因?yàn)楦F不過三代。");}@Overridepublic void toGetMarried() {System.out.println("父母催著結(jié)婚,于是" + name + "急著結(jié)婚了" +",盡管不知道如何撫養(yǎng)孩子,想著給錢就行了...");}@Overridepublic void toHaveChildren() {System.out.print(name + "在外地辛苦工作,妻子半輩子守在農(nóng)村;似乎孩子不怎么認(rèn)" + name + "了...");System.out.println("哦,原來半生只是一場(chǎng)夢(mèng)...");}@Overridepublic void die() {System.out.print(name + "在陽臺(tái)上安詳?shù)貢裰?#xff0c;突然就沒了生息...");System.out.print("可惜高樓大廈,每層人家門戶緊閉,沒有人注意到" + name + "的逝去,");System.out.println("而" + name + "家里除他以外再?zèng)]有人了...");} } class Test {public static void main(String[] args) {new Loser("三代目").life();} }

    Loser 類中沒有 life 方法,所以調(diào)用的是 World 接口中的 life 方法,內(nèi)部的這些方法已被 Loser 重寫,所以依次調(diào)用 Loser 類中的 goToSchool、goToWork、toGetMarried … 等方法。


    3)

    class Arr {int[] arr;public void foreach(I2 i2) {Objects.requireNonNull(i2);for (int i = 0; i < arr.length; i++) {i2.some(arr[i]);}}public Arr(int[] arr) {Objects.requireNonNull(arr);this.arr = arr;} } interface I2 {void some(int element); } class Test {public static void main(String[] args) {Arr a = new Arr(new int[]{4, 6, 8});a.foreach((element) -> {System.out.println("遍歷的元素為:" + element);});} }

    有參構(gòu)造賦值 a.arr = {4,6,8}

    調(diào)用 foreach,遍歷數(shù)組,每次遍歷調(diào)用 i2.some 方法,輸出 遍歷的元素為:4、遍歷的元素為:6、遍歷的元素為:8


    4)

    interface Math {int invoke(int n1, int n2); }static Math math = (n1, n2) -> {Math math1 = (a1, b1) -> a1 + b1;Math math2 = (x1, y1) -> x1 * y1 - x1;return math1.invoke(n1, n2) - math2.invoke(n1, n2); };public static void main(String[] args) {System.out.println(math.invoke(5, 6)); } math.invoke(5, 6) 返回值為 math1.invoke(5, 6) - math2.invoke(5, 6);math1.invoke(5, 6) 返回值為 5 + 6 = 11; math2.invoke(5, 6) 返回值為 5 * 6 - 5 = 25;所以返回值為 11 - 25 = -14

    5)

    interface IntConsumer {void run(int value); } public static void repeat(int n, IntConsumer action) {for (int i = 0; i < n; i++) {action.run(i);} } public static void main(String[] args) {repeat(10, i -> System.out.println("down:" + (9 - i))); }

    repeat 方法中每次遍歷調(diào)用 action 的 run 方法,傳入 0、1、2、…、9

    輸出 down:9、down:8、… down:0


    6)

    interface TypeC {void work(); } interface MicroUSB {void work2(); }class Phone implements MicroUSB {@Overridepublic void work2() {System.out.println("充電中...");} } // 優(yōu)先使用組合,而不是繼承 class Adapter implements TypeC {Phone phone;public Adapter(Phone phone) {Objects.requireNonNull(phone);this.phone = phone;}@Overridepublic void work() {phone.work2();} }/*class Adapter extends Phone implements TypeC {@Overridepublic void work() {super.work2();} }*/ class Test {public static void main(String[] args) {Phone phone = new Phone();charge(new Adapter(phone));// 充電中...}public static void charge(TypeC typeC) {typeC.work();} }

    由于 Phone 不是 TypeC 類型,無法作為 charge 方法的實(shí)參;要想充電,必須借助實(shí)現(xiàn) Typec 接口的適配器 Adapter,通過適配器調(diào)用 Phone 的方法。

    總結(jié)

    以上是生活随笔為你收集整理的JavaSE 接口与内部类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    亚洲国产欧美一区二区三区丁香婷 | 四虎精品成人免费网站 | av成人资源 | 狠狠干天天干 | 500部大龄熟乱视频 欧美日本三级 | 99视频在线观看视频 | 肉色欧美久久久久久久免费看 | 中文字幕国产精品 | 国产网红在线观看 | 久久久久久国产精品999 | 亚洲精品国产精品99久久 | 国语久久 | 欧美精品久久99 | 91高清免费观看 | 欧美精品二区 | 丁香5月婷婷久久 | 日韩免费三区 | 久久无码av一区二区三区电影网 | 久久99久久99久久 | 亚洲国产中文字幕 | 天天做天天射 | 91最新中文字幕 | 水蜜桃亚洲一二三四在线 | 国产91小视频 | 在线免费观看黄色小说 | 最新日本中文字幕 | 99久久精品无码一区二区毛片 | 色资源二区在线视频 | 香蕉视频在线观看免费 | 天天综合网天天综合色 | 欧美精品久久久久久久久久白贞 | 日日日天天天 | 最近中文国产在线视频 | 色婷婷www| 国产精品淫 | 精品在线99 | 欧美九九九 | 一区二区三区av在线 | 亚洲电影图片小说 | 国产99久久99热这里精品5 | 色资源网在线观看 | 黄色软件大全网站 | .国产精品成人自产拍在线观看6 | 亚洲欧美怡红院 | 亚洲日本一区二区在线 | 黄色的网站免费看 | 免费观看的黄色 | 亚洲精品456在线播放乱码 | 中字幕视频在线永久在线观看免费 | 免费福利视频网 | 国产区免费在线 | 日韩欧美视频免费看 | 久久免费视频在线观看 | 激情欧美xxxx | 亚洲精品一区二区三区新线路 | 狠狠操影视 | www.888av| 久久久久久99精品 | 黄色网在线免费观看 | 精品视频在线播放 | 东方av免费在线观看 | 91精品天码美女少妇 | av成人免费在线观看 | 日本黄区免费视频观看 | 草久久久| 国产成人精品电影久久久 | 中文字幕第| 日韩欧美电影在线观看 | 97超碰在线免费 | 国产黄色在线观看 | 天天操夜夜做 | 国产成人精品在线播放 | 不卡视频在线 | 国产黄大片在线观看 | 亚洲国产精品va在线看黑人 | 激情伊人 | 91视频免费国产 | 97爱爱爱| 精品视频中文字幕 | 五月色丁香 | 日本精品在线看 | 亚洲九九九在线观看 | 国产又黄又硬又爽 | 视频精品一区二区三区 | 欧美一级黄大片 | 婷婷深爱 | 日韩免费视频一区二区 | 五月天婷亚洲天综合网精品偷 | 国产在线观看你懂得 | 国产婷婷vvvv激情久 | 成人午夜剧场在线观看 | 免费在线观看一区二区三区 | 午夜aaaa | 日韩专区在线播放 | 日韩精品一区二区三区免费观看视频 | 欧美一区二区日韩一区二区 | 在线免费色视频 | 国产人成看黄久久久久久久久 | 一区二区伦理 | 国产在线中文字幕 | 日日爽视频 | 日韩v欧美v日本v亚洲v国产v | 亚洲一级二级三级 | 成人精品一区二区三区中文字幕 | 亚洲日韩欧美一区二区在线 | 99国产精品| 国产区欧美 | 大荫蒂欧美视频另类xxxx | 精品国产片 | 国产亚洲精品av | 黄色三级在线观看 | 亚洲欧美va | 久久成年人网站 | 欧美成年人在线视频 | 99视频久| 亚洲欧洲久久久 | 欧美精品久久久久久久久久 | 国产精品久久久久久影院 | 亚洲精品视频在 | 中文av不卡 | 在线国产激情视频 | 视频在线91| 在线看日韩av | 91看片淫黄大片一级在线观看 | 在线v片免费观看视频 | 日韩免费 | 欧洲亚洲女同hd | 99久久精品国产一区二区三区 | 亚洲综合导航 | 四虎成人精品 | av在线8 | 亚洲国产午夜 | 午夜精品一区二区三区可下载 | 九九色网| 国产精品原创在线 | 麻豆精品国产传媒 | 深爱五月激情五月 | 免费观看一区 | 五月综合激情网 | 精品久久中文 | av高清影院 | 久久男人中文字幕资源站 | 婷婷在线免费视频 | 91久久一区二区 | 精品国产乱码久久久久久三级人 | 成年人在线免费看视频 | 久久夜夜爽| 四虎在线观看视频 | 久久精品99久久久久久2456 | 国产成人综合图片 | 韩国精品一区二区三区六区色诱 | 精精国产xxxx视频在线播放 | 欧美性生活免费 | 91av在线电影 | 久久久久网址 | 久久综合久久综合九色 | 亚洲无人区小视频 | 四虎8848免费高清在线观看 | 日韩网站在线 | 中国一 片免费观看 | 97超碰资源总站 | 欧美在线视频一区二区 | 激情五月***国产精品 | 国产精品久久一区二区无卡 | 九九九热精品免费视频观看网站 | 尤物97国产精品久久精品国产 | 黄色毛片视频免费 | 黄色在线免费观看网站 | 精品国产一区二区久久 | 97久久久免费福利网址 | 精品福利视频在线 | 久草网在线观看 | 手机看片久久 | 日本精品在线看 | 丝袜一区在线 | 婷婷丁香导航 | 99久久er热在这里只有精品66 | 亚洲伦理一区 | 天堂va欧美va亚洲va老司机 | 亚洲精品资源在线观看 | 999久久久久久久久6666 | jizz欧美性9| 国产一区二区视频在线 | 免费电影播放 | 综合精品久久久 | 国产视频一区二区在线 | 不卡的av| 久久99久久99精品免观看软件 | 久久伊99综合婷婷久久伊 | 天天干天天看 | 久久99亚洲精品 | 免费国产一区二区视频 | 免费在线观看91 | 成年人国产在线观看 | 在线观看视频在线观看 | 欧美性生活免费 | 国产精品毛片一区二区在线看 | 欧美大片mv免费 | 91免费在线 | 精品久久久影院 | 最新午夜电影 | 黄色网址国产 | 国产成人精品av在线观 | 日韩久久精品一区二区 | 午夜久久美女 | 九七在线视频 | 日日日视频 | 国产精品女人久久久 | 久久婷婷一区 | 天天操夜操 | 在线观看中文字幕亚洲 | 色噜噜日韩精品欧美一区二区 | 成 人 黄 色 视频 免费观看 | 久久久精品一区二区三区 | 9999国产| 国产精品一区二区三区在线播放 | 中文字幕在线有码 | 奇米777777| 美女视频黄是免费的 | 久久久资源 | 亚洲成av人影院 | 日本二区三区在线 | 欧日韩在线 | 天天干天天操天天入 | 亚洲精品福利在线 | 亚洲欧美经典 | 成年人免费在线观看网站 | 香蕉视频在线看 | 久久精品中文 | 久久国产精品一区二区 | 黄色影院在线免费观看 | 国产精品mv在线观看 | 午夜精品久久久久久久久久 | 日韩高清精品一区二区 | 久久精品一区二区三区中文字幕 | 91九色国产在线 | 免费久久网 | 亚洲美女精品区人人人人 | 伊人www22综合色 | 久久99精品久久久久蜜臀 | 69精品在线 | 亚洲精品66 | 久久成人精品视频 | 国产一区二区免费看 | 久久玖| 天天综合久久综合 | 国产一级大片在线观看 | 91片网| 国产精品久久久久久久久久白浆 | 日韩精品专区在线影院重磅 | 三日本三级少妇三级99 | av线上看| 9在线观看免费高清完整版在线观看明 | 国产日韩三级 | 99国产一区二区三精品乱码 | 国产精品久久久区三区天天噜 | 亚洲精品美女免费 | 天天色天天综合 | 亚洲成人黄色 | 成人毛片在线视频 | 日韩高清精品免费观看 | 波多野结衣在线观看一区 | x99av成人免费| 97精品国产97久久久久久粉红 | 福利一区在线 | 成人午夜性影院 | 在线观看亚洲视频 | 日韩av成人在线观看 | 欧美日韩高清一区二区三区 | 中国一级特黄毛片大片久久 | 五月婷网| 国产黄色片网站 | 在线观看亚洲精品视频 | 久久久久综合网 | 97福利在线 | 91九色免费视频 | 亚洲黄色激情小说 | www免费视频com━ | 成人在线观看免费视频 | 亚洲japanese制服美女 | 色综合天天狠天天透天天伊人 | 天天射天天色天天干 | 日本一区二区三区免费看 | 91免费视频国产 | 国产视频首页 | 精品视频在线看 | 久久久久久免费视频 | 色94色欧美 | av官网 | 精品影院一区二区久久久 | 美女视频黄免费网站 | 成人av片在线观看 | 99久久国产免费,99久久国产免费大片 | 欧美少妇的秘密 | 91丨九色丨国产女 | 欧美三人交 | 日日操日日 | 亚洲三级性片 | 精品电影一区 | 成人午夜电影久久影院 | 国产色拍| 在线观看的av | 福利视频在线看 | 亚洲一区动漫 | 久久男人中文字幕资源站 | 日日操天天操狠狠操 | 超碰久热| 日韩欧美一区二区不卡 | 国产日韩精品一区二区在线观看播放 | 中文字幕免费国产精品 | 免费视频你懂的 | 免费在线观看国产精品 | 91视频88av | 日韩网站一区 | 91久久国产自产拍夜夜嗨 | 国产一区二区在线播放视频 | 九九影视理伦片 | 久久国内免费视频 | 91福利影院在线观看 | 996久久国产精品线观看 | 黄色不卡av| 96超碰在线| 日韩欧美视频 | 久草免费资源 | ,久久福利影视 | 日韩一区二区三区观看 | 国产精品一码二码三码在线 | 中文字幕亚洲欧美 | 麻豆免费视频观看 | 69av网| 久久综合欧美精品亚洲一区 | 久久久五月婷婷 | 日本成人免费在线观看 | 97在线视频免费观看 | 欧美伦理一区二区三区 | 亚洲第一成网站 | 性日韩欧美在线视频 | 亚洲闷骚少妇在线观看网站 | 久久精品视频在线免费观看 | 69久久夜色精品国产69 | 久久国产精品久久久久 | 日日干影院 | 亚洲综合色站 | 色多多污污在线观看 | 狠日日| 久草在线在线视频 | 久久毛片网 | 在线成人免费电影 | 国产精品自在欧美一区 | 久久超碰免费 | 日韩精品中文字幕在线不卡尤物 | 91亚洲精品久久久蜜桃借种 | 开心色插 | 亚洲欧美精品一区 | 日本高清久久久 | 色综合天天狠天天透天天伊人 | 国内精品视频在线播放 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 99这里只有久久精品视频 | 免费av免费观看 | 免费成人在线观看 | 九九精品视频在线 | 国产精品 中文在线 | 欧美成人区 | 欧美日韩一区三区 | 中文字幕国产一区二区 | 国产精品二区在线观看 | 精品国产免费人成在线观看 | 久久久综合九色合综国产精品 | 在线成人免费 | 日韩中文字 | 国产精品video爽爽爽爽 | 中国一级片在线 | 久久免费看a级毛毛片 | 欧美日韩久久一区 | 中文字幕最新精品 | 美女国产免费 | 国产黄色理论片 | 9999精品免费视频 | 欧美色操 | 国产精品 国产精品 | 久久夜色电影 | 黄色视屏av | 99视频精品全国免费 | 国产剧在线观看片 | 天天色图 | 中文字幕丝袜 | 亚洲蜜桃在线 | 国产一级大片在线观看 | 一区二区三区四区五区在线视频 | 久久视奸 | 中文字幕乱在线伦视频中文字幕乱码在线 | 一级黄色免费 | 国产 视频 高清 免费 | av在线电影网站 | 久久久毛片 | 亚洲精品自拍视频在线观看 | 天天操天天操 | 黄色一级大片在线观看 | 日韩在线观看网址 | 亚洲精选久久 | 99热官网| 亚洲国产久| 久久99精品国产99久久 | 国产福利一区二区三区视频 | 五月婷婷激情 | 国产中文字幕三区 | 亚洲欧洲成人精品av97 | 亚洲国产欧美一区二区三区丁香婷 | 玖玖在线视频观看 | 在线观看完整版免费 | 久久久九色精品国产一区二区三区 | 在线免费观看av网站 | 国产视频1区2区3区 久久夜视频 | 国产精品 美女 | 国产伦精品一区二区三区… | www.神马久久 | 一色屋精品视频在线观看 | 国产精品11 | 中文字幕在线看视频国产中文版 | 成人av动漫在线 | 男女激情麻豆 | 欧美日韩一级久久久久久免费看 | 黄色影院在线免费观看 | 久久99偷拍视频 | 91在线91拍拍在线91 | 三级a视频 | 在线观看日韩视频 | 天天曰天天爽 | 99久久国产免费,99久久国产免费大片 | 日韩在线视频观看 | 国产在线91在线电影 | 色狠狠综合 | 四虎成人av | 国产黄在线免费观看 | 91成人精品一区在线播放69 | 在线免费观看羞羞视频 | 狠狠躁夜夜a产精品视频 | 精品国产99国产精品 | 国产精品 亚洲精品 | 欧美精品xxx| 欧美日韩成人 | 久久av高清 | 亚洲精品99久久久久中文字幕 | 国产伦精品一区二区三区在线 | 久久a热6 | 精品久久久成人 | 久久美女电影 | a√资源在线| 久久国产热视频 | 99国产在线观看 | 久久久久国产精品厨房 | 人人干人人干人人干 | 国产精品久久影院 | 91资源在线 | 在线观看911视频 | 日韩在线观看网址 | 亚洲欧美久久 | 中文在线免费看视频 | 久久不见久久见免费影院 | 国产黄av| 欧美日韩精品影院 | 欧美一级特黄aaaaaa大片在线观看 | 国产一级不卡毛片 | 国产黄色免费观看 | 国产69精品久久99不卡的观看体验 | 亚洲综合精品在线 | 中文字幕亚洲不卡 | 91激情| 黄色影院在线免费观看 | 欧美在线视频免费 | 国产一区二区在线免费 | www.黄色小说.com | 久久免费视频网 | 97综合在线 | 久久久久日本精品一区二区三区 | 成人av av在线| 亚洲精品国精品久久99热一 | 国色综合| 男女精品久久 | 国产精品99精品 | 国产在线一卡 | 国产在线欧美 | 欧美综合在线视频 | 亚洲精品ww | 在线观看av片 | 午夜精品一区二区三区视频免费看 | 一级一级一片免费 | 久久精品网站视频 | 韩日在线一区 | 四虎欧美 | 一级片免费观看视频 | 天天干夜夜擦 | 日韩欧美国产激情在线播放 | 9在线观看免费高清完整版在线观看明 | 麻豆视频在线观看 | 国产精品专区在线 | 国产午夜三级一二三区 | 一区二区三区四区久久 | 中文av一区二区 | 亚洲国产精品va在线 | 韩国av一区 | a黄色影院 | 午夜久久福利影院 | 九九视频这里只有精品 | 97色资源 | 国产69久久久 | 日本中文在线观看 | 中文字幕一区二区在线播放 | 天堂成人在线 | 亚洲午夜av | 国产专区视频在线 | 亚洲成人国产 | 国产91九色蝌蚪 | 国产欧美高清 | 国产成人99久久亚洲综合精品 | 日韩精品视频网站 | 久久呀 | av看片在线观看 | 久久亚洲私人国产精品va | 综合精品久久 | 国产一区国产二区在线观看 | 日韩免费在线视频观看 | 激情黄色一级片 | 久久99精品久久久久久三级 | ,久久福利影视 | 99精品一区二区 | 亚洲视频每日更新 | 六月丁香激情综合色啪小说 | 亚洲人视频在线 | 亚洲精品视频免费在线观看 | 欧美精品v国产精品v日韩精品 | 久久免费精彩视频 | 亚洲波多野结衣 | 成人在线免费视频 | 天天操综合 | 色婷婷激情四射 | 久久国产亚洲精品 | 欧美国产一区二区 | 中文字幕在线播放一区二区 | 四虎国产视频 | 91大神精品视频在线观看 | 久久九九视频 | 二区三区中文字幕 | 久久久精品国产一区二区三区 | 精品免费99久久 | 国产特级毛片 | 激情婷婷六月 | 国产精品自在线 | 91久久一区二区 | 免费精品国产va自在自线 | 丁香婷婷综合五月 | 亚洲精品国产麻豆 | 一区二区三区日韩在线 | 丁香六月激情婷婷 | 伊人久操 | 911精品视频 | 国产日产在线观看 | 婷婷亚洲五月色综合 | 国产123区在线观看 国产精品麻豆91 | 精品一区二区免费视频 | 玖玖视频| 国产精品青草综合久久久久99 | 玖玖在线看 | 在线香蕉视频 | 婷婷亚洲最大 | 亚洲第一av在线播放 | 国产亚洲精品久久久久久久久久 | 黄色三级网站在线观看 | 三级在线视频播放 | 免费看特级毛片 | 色网免费观看 | 免费观看性生活大片3 | 免费在线观看黄色网 | 香蕉久久国产 | 久草9视频 | 免费视频网| 久久久在线免费观看 | 亚洲精品在线观看免费 | 久久久久人人 | 日本成人中文字幕在线观看 | 五月婷婷久 | 成人午夜黄色影院 | 探花视频在线观看免费版 | 国产精品大片免费观看 | 久久国产91| 超碰国产在线播放 | www.少妇| 久久国产成人午夜av影院潦草 | 国产一区二区三区免费在线 | 欧洲激情在线 | 美女av免费 | 最新高清无码专区 | 成人三级av | 中文字幕一区二区三区在线视频 | 久草精品视频 | 国产91精品在线观看 | 在线网址你懂得 | 国产一区视频在线 | 亚洲电影久久久 | 色多多在线观看 | 天天色天天操天天爽 | 精品福利在线 | 色.www| 五月激情片| 日韩在线三级 | 亚洲最大成人网4388xx | 日本中文字幕在线视频 | 日本成址在线观看 | 天天色官网 | 亚洲国产美女精品久久久久∴ | 国产视频亚洲精品 | mm1313亚洲精品国产 | 欧美人操人| 久久综合九色九九 | 日本精品视频在线观看 | 天天干天天射天天爽 | www.久久99 | 韩国三级在线一区 | 一区三区视频在线观看 | 免费一级日韩欧美性大片 | a黄色片在线观看 | 中文字幕专区高清在线观看 | 精品亚洲二区 | 国产精品6 | 日韩久久在线 | 黄色成人在线网站 | www成人av| 国产日韩高清在线 | 精品一区二三区 | 2019久久精品| 国产婷婷精品av在线 | 欧美成人手机版 | 不卡av电影在线观看 | 国产精品99精品久久免费 | 亚洲精品一区二区三区在线观看 | 九九热精品视频在线观看 | 亚洲永久精品在线 | 色婷婷综合久色 | 精品久久影院 | 久久视 | 欧洲激情综合 | 美女视频黄频大全免费 | 久久国产精品99久久久久久老狼 | 操久久免费视频 | 久久一区91 | 久久久黄视频 | 日韩不卡高清 | 色综合天天色综合 | 日韩欧美高清视频在线观看 | 亚洲精品美女久久17c | 久久在线观看视频 | 天天操天天舔天天干 | 伊人中文在线 | 久久这里精品视频 | 午夜久久久久久久 | 亚洲黄色免费 | 偷拍区另类综合在线 | 色婷婷亚洲综合 | 亚洲 欧美 变态 国产 另类 | 久久久久国产精品免费网站 | 在线成人免费电影 | 四虎在线观看精品视频 | 日本h视频在线观看 | 国产高清专区 | 在线观看www91 | 在线成人欧美 | 欧美日韩在线精品 | 丰满少妇对白在线偷拍 | 在线免费av网站 | 久久综合精品国产一区二区三区 | 亚洲精品国产精品国自 | 成人免费网站视频 | 久久9视频| 精品国产伦一区二区三区观看体验 | 亚洲视频高清 | 毛片基地黄久久久久久天堂 | 欧美国产日韩一区二区三区 | 91在线看视频免费 | 天天插天天狠 | 久久综合狠狠综合久久综合88 | 国产成人中文字幕 | 蜜臀av性久久久久av蜜臀妖精 | 公开超碰在线 | www最近高清中文国语在线观看 | 视频国产一区二区三区 | 96看片| 亚洲精品午夜国产va久久成人 | 麻豆视频免费看 | 在线看福利av | 国内精品美女在线观看 | 欧洲亚洲国产视频 | 在线精品一区二区 | 亚洲成色 | 欧美婷婷色 | 国产精品久久毛片 | 国产在线精品视频 | 久久久久久久影院 | 天天干夜夜操视频 | 国产一区二区三区高清播放 | 久久亚洲热 | 国产又粗又猛又黄 | 天天操人人干 | 在线观看中文字幕av | 91亚洲精品国偷拍自产在线观看 | 91传媒激情理伦片 | 狠狠躁18三区二区一区ai明星 | 精品中文字幕在线播放 | 国产精品国产三级国产aⅴ入口 | 色狠狠久久av五月综合 | 亚洲激情五月 | www免费看片com | 天天色天天操天天爽 | 成人av电影免费在线播放 | 天天躁日日躁狠狠躁 | 色在线国产 | 在线免费观看亚洲视频 | 91高清免费看 | 国色天香在线观看 | 亚洲更新最快 | 91精品视频免费在线观看 | 激情五月婷婷综合 | 激情网站网址 | 免费日韩av电影 | 超碰97中文 | 久久97精品 | 日本aaa在线观看 | 91精品国产91久久久久久三级 | 欧美午夜久久久 | 成人一区在线观看 | 免费人成在线观看 | 99久久久国产精品 | 色播激情五月 | 最新国产中文字幕 | 久久国产精彩视频 | 中文字幕在线日本 | 亚洲天天干 | 亚洲精品综合一二三区在线观看 | av中文字幕免费在线观看 | 在线视频 你懂得 | 亚洲一区 av| 国产午夜一级毛片 | 日韩高清精品一区二区 | 青青河边草免费 | 国产专区在线看 | www.久久com | 国产精品一区二区免费 | 91精品视屏| 欧洲亚洲激情 | 毛片888| 国产99久久久国产精品 | 国产一区二区三区久久久 | 黄色国产在线观看 | 久久精品视频3 | 五月天激情视频 | 婷婷五月在线视频 | 手机av网站 | 国内精品在线观看视频 | 亚洲va男人天堂 | 天天干,夜夜爽 | 欧美日韩国产mv | 99视频精品 | 色国产在线 | 天天av在线播放 | 日本精品二区 | 密桃av在线| 色免费在线 | 色91在线 | 久久影院中文字幕 | 亚洲乱码在线 | 亚洲综合五月 | 久久五月天色综合 | 91高清不卡 | 国产精品1区2区3区 久久免费视频7 | 成人午夜精品久久久久久久3d | 精品久久久久久综合日本 | 午夜精品剧场 | 精品毛片在线 | 九九热av | 麻豆91精品 | 精品亚洲免费视频 | 亚洲成人国产 | 亚洲国产免费看 | 国产区网址 | 香蕉视频在线免费 | 久久久久久久国产精品影院 | 99综合视频 | 婷婷久久五月 | 亚洲国产99 | 二区三区在线视频 | 91色吧 | 国产一二三四在线观看视频 | www.夜夜草| 久久网页 | av大全在线免费观看 | 69国产盗摄一区二区三区五区 | 色欧美综合 | 国产在线观看污片 | 免费观看的黄色 | 欧美一区二区在线看 | av免费试看 | 人人插超碰 | 午夜av色 | 亚洲国产中文字幕在线 | 亚洲视频在线视频 | 麻豆传媒在线免费看 | 99视频精品视频高清免费 | 亚洲涩综合 | 亚洲色图22p | 国产精品欧美一区二区三区不卡 | 国产高清视频免费最新在线 | 又长又大又黑又粗欧美 | 六月婷操| 久草网站在线 | 精品久久久久久久久亚洲 | 免费影视大全推荐 | 成年人免费在线观看 | 成人资源在线播放 | 亚洲国产精品一区二区尤物区 | 一级成人免费 | 久草免费色站 | 一区二区伦理 | 五月婷婷综合在线视频 | 九九久久婷婷 | 亚洲国产成人精品久久 | 人人狠狠综合久久亚洲婷 | 懂色av一区二区三区蜜臀 | 91精品在线视频 | 超碰人人超 | 亚洲国产中文字幕 | 91精品秘密在线观看 | 国产精品福利小视频 | 一区三区在线欧 | 午夜精品视频一区二区三区在线看 | 天天在线视频色 | 天海翼一区二区三区免费 | 成人播放器 | 日日夜夜人人天天 | 日韩精品最新在线观看 | 免费在线观看日韩视频 | 国产中文字幕第一页 | 天天干天天干天天色 | 欧美二区视频 | 亚洲欧美少妇 | 亚洲最新av网站 | 九九九视频在线 | 免费看一及片 | 国产成人99久久亚洲综合精品 | 九九热免费观看 | 天天亚洲 | 国产精品自产拍在线观看 | av丝袜在线| www免费 | 天天操偷偷干 | 亚洲国产日韩精品 | 欧美精品视 | 国产精品欧美一区二区三区不卡 | 免费视频一二三区 | 国产成人免费 | 又色又爽的网站 | 青青河边草免费 | 午夜性生活 | 中文字幕无吗 | 97超碰人人澡人人爱 | 五月婷婷在线视频观看 | 亚洲日本一区二区在线 | 色先锋av资源中文字幕 | 国产在线视频资源 | 日日躁夜夜躁xxxxaaaa | 伊人热| 天天射天天干天天操 | 婷婷六月天丁香 | 中文av在线免费观看 | 一级欧美一级日韩 | 国产成人一区二区三区在线观看 | 国产美女免费看 | 婷婷丁香激情 | 国产精品九色 | 国产夫妻性生活自拍 | 国产视频日韩 | 免费在线观看中文字幕 | 人人澡人人爽欧一区 | 2019中文字幕第一页 | 亚洲精品无 | 91成年人在线观看 | 久草在线电影网 | 久久精品欧美一区 | 亚洲在线国产 | 国产精品欧美一区二区三区不卡 | 操高跟美女 | 日韩不卡高清视频 | 午夜性福利 | 亚洲成人国产精品 | 精品国产伦一区二区三区观看方式 | 久日视频 | 亚洲精品视频在线观看视频 | 91tv国产成人福利 | 美女激情影院 | 久久国产精品一二三区 | 91九色蝌蚪视频网站 | 免费看一级特黄a大片 | 九九久久国产精品 | 成人一级电影在线观看 | 天天插狠狠干 | 久久午夜国产精品 | 日批视频 | 在线国产视频 | 午夜视频99 | 在线观看精品视频 | 亚洲成av人片一区二区梦乃 | 国产成人精品一区二区三区免费 | 国产又粗又猛又黄又爽的视频 | 国产一区二区三区在线免费观看 | 国产区在线看 | 免费高清在线观看成人 | 色九九影院 | 国偷自产视频一区二区久 | 特级黄录像视频 | 久久免费电影网 | 亚洲尺码电影av久久 | 欧美日韩不卡在线视频 | 国产色综合天天综合网 | 国产日韩欧美中文 | 少妇视频在线播放 | www91在线| 亚洲综合在线视频 | 亚一亚二国产专区 | 奇米影视四色8888 | 久久99在线观看 | 黄在线免费看 | 久久午夜电影院 | 91大片成人网 | 免费看v片| 夜夜爱av| 黄色国产在线观看 | 又大又硬又黄又爽视频在线观看 | 欧美色图另类 | 国产一区二区久久精品 | 蜜臀av性久久久久av蜜臀妖精 | 美女视频a美女大全免费下载蜜臀 | 中文字幕av一区二区三区四区 | 看片的网址 | 伊人午夜视频 | 免费观看www视频 | 亚洲精品视频观看 | 嫩草av在线 | 国产一级大片在线观看 | 99久高清在线观看视频99精品热在线观看视频 | 成人在线免费视频观看 | 五月婷婷久久综合 | 最近最新中文字幕视频 | 久久久精品亚洲 | 女人高潮特级毛片 | 麻豆传媒在线视频 | 狠狠色丁香婷婷综合视频 | a在线免费 | 国产精品美女在线观看 | 久久99在线观看 | 中文字幕在线观看完整版电影 | 日韩av一区二区三区 | 西西444www | www.91国产 | 免费h精品视频在线播放 | 在线观看日本高清mv视频 | 日日狠狠 | 色在线视频 | 深爱激情综合网 | 午夜视频二区 | www色婷婷com| 午夜av网站| 亚洲另类人人澡 | 亚洲精品在线观看av | 久久久久久久免费看 | 亚洲永久av| 黄色网址中文字幕 | 日韩av一区二区在线播放 | 精品国产一区二区三区四区vr | 国产99久久久国产精品免费看 | 色偷偷88888欧美精品久久久 | 国产玖玖在线 | 夜夜操天天操 | 2021国产精品 | 久久色在线观看 | 久草视频手机在线 | 国产高清视频 | 激情视频亚洲 | 91在线视频播放 | 日韩国产精品久久久久久亚洲 | 国产精品va在线观看入 | 国产小视频你懂的 | 五月婷婷在线视频观看 | 日韩av中文字幕在线免费观看 | 天天操狠狠操网站 | 右手影院亚洲欧美 | 18国产精品白浆在线观看免费 | 婷婷激情网站 | 五月婷婷六月丁香激情 | 狠狠躁日日躁狂躁夜夜躁av |