久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kotlin极简教程:第7章 面向对象编程

發布時間:2025/4/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kotlin极简教程:第7章 面向对象编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:https://github.com/EasyKotlin

在前面的章節中,我們學習了Kotlin的語言基礎知識、類型系統、集合類以及泛型相關的知識。在本章節以及下一章中,我們將一起來學習Kotlin對面向對象編程以及函數式編程的支持。

7.1 面向對象編程思想

7.1.1 一切皆是映射

《易傳·系辭上傳》:“易有太極,是生兩儀,兩儀生四象,四象生八卦。” 如今的互聯網世界,其基石卻是01(陰陽),不得不佩服我華夏先祖的博大精深的智慧。

一切皆是映射

計算機領域中的所有問題,都可以通過向上一層進行抽象封裝來解決.這里的封裝的本質概念,其實就是“映射”。

就好比通過的電子電路中的電平進行01邏輯映射,于是有了布爾代數,數字邏輯電路系統;

對01邏輯的進一步封裝抽象成CPU指令集映射,誕生了匯編語言;

通過匯編語言的向上抽象一層編譯解釋器,于是有了pascal,fortran,C語言;

再對核心函數api進行封裝形成開發包(Development Kit), 于是有了Java,C++ 。

從面向過程到面向對象,再到設計模式,架構設計,面向服務,Sass/Pass/Iass等等的思想,各種軟件理論思想五花八門,但萬變不離其宗。

  • 你要解決一個怎樣的問題?
  • 你的問題領域是怎樣的?
  • 你的模型(數據結構)是什么?
  • 你的算法是什么?
  • 你對這個世界的本質認知是怎樣的?
  • 你的業務領域的邏輯問題,流程是什么?

Grady Booch:我對OO編程的目標從來就不是復用。相反,對我來說,對象提供了一種處理復雜性的方式。這個問題可以追溯到亞里士多德:您把這個世界視為過程還是對象?在OO興起運動之前,編程以過程為中心–例如結構化設計方法。然而,系統已經到達了超越其處理能力的復雜性極點。有了對象,我們能夠通過提升抽象級別來構建更大的、更復雜的系統–我認為,這才是面向對象編程運動的真正勝利。

最初, 人們使用物理的或邏輯的二進制機器指令來編寫程序, 嘗試著表達思想中的邏輯, 控制硬件計算和顯示, 發現是可行的;

接著, 創造了助記符 —— 匯編語言, 比機器指令更容易記憶;

再接著, 創造了編譯器、解釋器和計算機高級語言, 能夠以人類友好自然的方式去編寫程序, 在犧牲少量性能的情況下, 獲得比匯編語言更強且更容易使用的語句控制能力:條件、分支、循環, 以及更多的語言特性: 指針、結構體、聯合體、枚舉等, 還創造了函數, 能夠將一系列指令封裝成一個獨立的邏輯塊反復使用;

逐漸地,產生了面向過程的編程方法;

后來, 人們發現將數據和邏輯封裝成對象, 更接近于現實世界, 且更容易維護大型軟件, 又出現了面向對象的編程語言和編程方法學, 增加了新的語言特性: 繼承、 多態、 模板、 異常錯誤。

為了不必重復開發常見工具和任務, 人們創造和封裝了容器及算法、SDK, 垃圾回收器, 甚至是并發庫;

為了讓計算機語言更有力更有效率地表達各種現實邏輯, 消解軟件開發中遇到的沖突, 還在語言中支持了元編程、 高階函數, 閉包 等有用特性。

為了更高效率地開發可靠的軟件和應用程序, 人們逐漸構建了代碼編輯器、 IDE、 代碼版本管理工具、公共庫、應用框架、 可復用組件、系統規范、網絡協議、 語言標準等, 針對遇到的問題提出了許多不同的思路和解決方案, 并總結提煉成特定的技術和設計模式, 還探討和形成了不少軟件開發過程, 用來保證最終發布的軟件質量。 盡管編寫的這些軟件和工具還存在不少 BUG ,但是它們都“奇跡般地存活”, 并共同構建了今天蔚為壯觀的互聯網時代的電商,互聯網金融,云計算,大數據,物聯網,機器智能等等的“虛擬世界”。

7.1.2 二進制01與易經陰陽

二進制數是用0和1兩個數碼來表示的數。它的基數為2,進位規則是“逢二進一”,借位規則是“借一當二”,由18世紀德國數理哲學大師萊布尼茲發現。當前的計算機系統使用的基本上是二進制系統。

19世紀愛爾蘭邏輯學家B對邏輯命題的思考過程轉化為對符號0,1的某種代數演算,二進制是逢2進位的進位制。0、1是基本算符。因為它只使用0、1兩個數字符號,非常簡單方便,易于用電子方式實現。

二進制的發現直接導致了電子計算器和計算機的發明,并讓計算機得到了迅速的普及,進入各行各業,成為人類生活和生產的重要工具。

二進制的實質是通過兩個數字“0”和“1”來描述事件。在人類的生產、生活等許多領域,我們可以通過計算機來虛擬地描述現實中存在的事件,并能通過給定的條件和參數模擬事件變化的規律。二進制的計算機幾乎是萬能的,能將我們生活的現實世界完美復制,并且還能根據我們人類給定的條件模擬在現實世界難以實現的各種實驗。

但是,不論計算機能給我們如何多變、如何完美、如何復雜的畫面,其本源只是簡單的“0”和“1”。“0”和“1”在計算機中通過不同的組合與再組合,模擬出一個紛繁復雜、包羅萬象的虛擬世界。我們簡單圖示如下:

二進制的“0”和“1”通過計算機里能夠創造出一個虛擬的、紛繁的世界。自然界中的陰陽形成了現實世界的萬事萬物。

所以自然世界的“陰”“陽”作為基礎切實地造就了復雜的現實世界,計算機的“0”和“1”形象地模擬現實世界的一切現象,易學中的“卦”和“陰陽爻”抽象地揭示了自然界存在的事件和其變化規律。

所以說,編程的本質跟大自然創造萬物的本質是一樣的。

7.1.3 從面向過程到面向對象

從IBM公司的約翰·巴庫斯在1957年開發出世界上第一個高級程序設計語言Fortran至今,高級程序設計語言的發展已經經歷了整整半個世紀。在這期間,程序設計語言主要經歷了從面向過程(如C和Pascal語言)到面向對象(如C++和Java語言),再到面向組件編程(如.NET平臺下的C#語言),以及面向服務架構技術(如SOA、Service以及最近很火的微服務架構)等。

面向過程編程

結構化編程思想的核心:功能分解(自頂向下,逐層細化)。

1971年4月份的 Communications of ACM上,尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日—, 結構化編程思想的創始人。因發明了Euler、Alogo-W、Modula和Pascal等一系列優秀的編程語言并提出了結構化編程思想而在1984年獲得了圖靈獎。)發表了論文“通過逐步求精方式開發程序’(Program Development by Stepwise Refinement),首次提出“結構化程序設計”(structure programming)的概念。

不要求一步就編制成可執行的程序,而是分若干步進行,逐步求精。

第一步編出的程序抽象度最高,第二步編出的程序抽象度有所降低…… 最后一步編出的程序即為可執行的程序。

用這種方法編程,似乎復雜,實際上優點很多,可使程序易讀、易寫、易調試、易維護、易保證其正確性及驗證其正確性。

結構化程序設計方法又稱為“自頂向下”或“逐步求精”法,在程序設計領域引發了一場革命,成為程序開發的一個標準方法,尤其是在后來發展起來的軟件工程中獲得廣泛應用。有人評價說Wirth的結構化程序設計概念“完全改變了人們對程序設計的思維方式”,這是一點也不夸張的。

尼古拉斯· 沃思教授在編程界提出了一個著名的公式:

程序 = 數據結構 + 算法

面向對象編程

面向對象編程思想的核心:應對變化,提高復用。

阿倫·凱(Alan Kay):面向對象編程思想的創始人。2003年因在面向對象編程上所做的巨大貢獻而獲得圖靈獎。

The best way to predict the future is to invent it,預測未來最好的方法是創造它!(Alan Kay)

阿倫·凱是Smalltalk面向對象編程語言的發明人之一,也是面向對象編程思想的創始人之一,同時,他還是筆記本電腦最早的構想者和現代Windows GUI的建筑師。最早提出PC概念和互聯網的也是阿倫·凱,所以人們都尊稱他為“預言大師”。他是當今IT界屈指可數的技術天才級人物。

面向對象編程思想主要是復用性和靈活性(彈性)。復用性是面向對象編程的一個主要機制。靈活性主要是應對變化的特性,因為客戶的需求是不斷改變的,怎樣適應客戶需求的變化,這是軟件設計靈活性或者說是彈性的問題。

Java是一種面向對象編程語言,它基于Smalltalk語言,作為OOP語言,它具有以下五個基本特性:

  • 萬物皆對象,每一個對象都會存儲數據,并且可以對自身執行操作。因此,每一個對象包含兩部分:成員變量和成員方法。在成員方法中可以改變成員變量的值。
  • 程序是對象的集合,他們通過發送消息來告知彼此所要做的事情,也就是調用相應的成員函數。
  • 每一個對象都有自己的由其他對象所構成的存儲,也就是說在創建新對象的時候可以在成員變量中使用已存在的對象。
  • 每個對象都擁有其類型,每個對象都是某個類的一個實例,每一個類區別于其它類的特性就是可以向它發送什么類型的消息,也就是它定義了哪些成員函數。
  • 某一個特定類型的所有對象都可以接受同樣的消息。另一種對對象的描述為:對象具有狀態(數據,成員變量)、行為(操作,成員方法)和標識(成員名,內存地址)。
  • 面向對象語言其實是對現實生活中的實物的抽象。

    每個對象能夠接受的請求(消息)由對象的接口所定義,而在程序中必須由滿足這些請求的代碼,這段代碼稱之為這個接口的實現。當向某個對象發送消息(請求)時,這個對象便知道該消息的目的(該方法的實現已定義),然后執行相應的代碼。

    我們經常說一些代碼片段是優雅的或美觀的,實際上意味著它們更容易被人類有限的思維所處理。

    對于程序的復合而言,好的代碼是它的表面積要比體積增長的慢。

    代碼塊的“表面積”是是我們復合代碼塊時所需要的信息(接口API協議定義)。代碼塊的“體積”就是接口內部的實現邏輯(API背后的實現代碼)。

    在面向對象編程中,一個理想的對象應該是只暴露它的抽象接口(純表面, 無體積),其方法則扮演箭頭的角色。如果為了理解一個對象如何與其他對象進行復合,當你發現不得不深入挖掘對象的實現之時,此時你所用的編程范式的原本優勢就蕩然無存了。

    面向組件和面向服務

    • 面向組件

    我們知道面向對象支持重用,但是重用的單元很小,一般是類;而面向組件則不同,它可以重用多個類甚至一個程序。也就是說面向組件支持更大范圍內的重用,開發效率更高。如果把面向對象比作重用零件,那么面向組件則是重用部件。

    • 面向服務

    將系統進行功能化,每個功能提供一種服務。現在非常流行微服務MicroService技術以及SOA(面向服務架構)技術。

    面向過程(Procedure)→面向對象(Object)→ 面向組件(Component) →面向服務(Service)

    正如解決數學問題通常我們會談“思想”,諸如反證法、化繁為簡等,解決計算機問題也有很多非常出色的思想。思想之所以稱為思想,是因為“思想”有拓展性與引導性,可以解決一系列問題。

    解決問題的復雜程度直接取決于抽象的種類及質量。過將結構、性質不同的底層實現進行封裝,向上提供統一的API接口,讓使用者覺得就是在使用一個統一的資源,或者讓使用者覺得自己在使用一個本來底層不直接提供、“虛擬”出來的資源。

    計算機中的所有問題 , 都可以通過向上抽象封裝一層來解決。同樣的,任何復雜的問題, 最終總能夠回歸最本質,最簡單。

    面向對象編程是一種自頂向下的程序設計方法。萬事萬物都是對象,對象有其行為(方法),狀態(成員變量,屬性)。OOP是一種編程思想,而不是針對某個語言而言的。當然,語言影響思維方式,思維依賴語言的表達,這也是辯證的來看。

    所謂“面向對象語言”,其實經典的“過程式語言”(比如Pascal,C),也能體現面向對象的思想。所謂“類”和“對象”,就是C語言里面的抽象數據類型結構體(struct)。

    而面向對象的多態是唯一相比struct多付出的代價,也是最重要的特性。這就是SmallTalk、Java這樣的面向對象語言所提供的特性。

    回到一個古老的話題:程序是什么?

    在面向對象的編程世界里,下面的這個公式

    程序 = 算法 + 數據結構

    可以簡單重構成:

    程序 = 基于對象操作的算法 + 以對象為最小單位的數據結構

    封裝總是為了減少操作粒度,數據結構上的封裝導致了數據的減少,自然減少了問題求解的復雜度;對代碼的封裝使得代碼得以復用,減少了代碼的體積,同樣使問題簡化。這個時候,算法操作的就是一個抽象概念的集合。

    在面向對象的程序設計中,我們便少不了集合類容器。容器就用來存放一類有共同抽象概念的東西。這里說有共同概念的東西(而沒有說對象),其實,就是我們上一個章節中講到的泛型。這樣對于一個通用的算法,我們就可以最大化的實現復用,作用于的集合。

    面向對象的本質就是讓對象有多態性,把不同對象以同一特性來歸組,統一處理。至于所謂繼承、虛表、等等概念,只是其實現的細節。

    在遵循這些面向對象設計原則基礎上,前輩們總結出一些解決不同問題場景的設計模式,以GOF的23中設計模式最為知名。

    我們用一幅圖簡單概括一下面向對象編程的知識框架:

    講了這么多思考性的思想層面的東西,我們下面來開始Kotlin的面向對象編程的學習。Kotlin對面向對象編程是完全支持的。

    7.2 類與構造函數

    Kotlin和Java很相似,也是一種面向對象的語言。下面我們來一起學習Kotlin的面向對象的特性。如果您熟悉Java或者C++、C#中的類,您可以很快上手。同時,您也將看到Kotlin與Java中的面向對象編程的一些不同的特性。

    Kotlin中的類和接口跟Java中對應的概念有些不同,比如接口可以包含屬性聲明;Kotlin的類聲明,默認是final和public的。

    另外,嵌套類并不是默認在內部的。它們不包含外部類的隱式引用。

    在構造函數方面,Kotlin簡短的主構造函數在大多數情況下都可以滿足使用,當然如果有稍微復雜的初始化邏輯,我們也可以聲明次級構造函數來完成。

    我們還可以使用 data 修飾符來聲明一個數據類,使用 object 關鍵字來表示單例對象、伴生對象等。

    Kotlin類的成員可以包含:

    • 構造函數和初始化塊
    • 屬性
    • 函數
    • 嵌套類和內部類
    • 對象聲明

    7.2.1 聲明類

    和大部分語言類似,Kotlin使用class作為類的關鍵字,當我們聲明一個類時,直接通過class加類名的方式來實現:

    class World

    這樣我們就聲明了一個World類。

    7.2.2 構造函數

    在 Kotlin 中,一個類可以有

    • 一個主構造函數(primary constructor)
    • 一個或多個次構造函數(secondary constructor)

    主構造函數

    主構造函數是類頭的一部分,直接放在類名后面:

    open class Student constructor(var name: String, var age: Int) : Any() { ... }

    如果主構造函數沒有任何注解或者可見性修飾符,可以省略這個 constructor 關鍵字。如果構造函數有注解或可見性修飾符,這個 constructor 關鍵字是必需的,并且這些修飾符在它前面:

    annotation class MyAutowiredclass ElementaryStudent public @MyAutowired constructor(name: String, age: Int) : Student(name, age) { ... }

    與普通屬性一樣,主構造函數中聲明的屬性可以是可變的(var)或只讀的(val)。

    主構造函數不能包含任何的代碼。初始化的代碼可以放到以 init 關鍵字作為前綴的初始化塊(initializer blocks)中:

    open class Student constructor(var name: String, var age: Int) : Any() {init {println("Student{name=$name, age=$age} created!")}...}

    主構造的參數可以在初始化塊中使用,也可以在類體內聲明的屬性初始化器中使用。

    次構造函數

    在類體中,我們也可以聲明前綴有 constructor 的次構造函數,次構造函數不能有聲明 val 或 var :

    class MiddleSchoolStudent {constructor(name: String, age: Int) {} }

    如果類有一個主構造函數,那么每個次構造函數需要委托給主構造函數, 委托到同一個類的另一個構造函數用 this 關鍵字即可:

    class ElementarySchoolStudent public @MyAutowired constructor(name: String, age: Int) : Student(name, age) {override var weight: Float = 80.0fconstructor(name: String, age: Int, weight: Float) : this(name, age) {this.weight = weight}... }

    如果一個非抽象類沒有聲明任何(主或次)構造函數,它會有一個生成的不帶參數的主構造函數。構造函數的可見性是 public。

    私有主構造函數

    我們如果希望這個構造函數是私有的,我們可以如下聲明:

    class DontCreateMe private constructor() { }

    這樣我們在代碼中,就無法直接使用主構造函數來實例化這個類,下面的寫法是不允許的:

    val dontCreateMe = DontCreateMe() // cannot access it

    但是,我們可以通過次構造函數引用這個私有主構造函數來實例化對象:

    7.2.2 類的屬性

    我們再給這個World類加入兩個屬性。我們可能直接簡單地寫成:

    class World1 {val yin: Intval yang: Int }

    在Kotlin中,直接這樣寫語法上是會報錯的:

    意思很明顯,是說這個類的屬性必須要初始化,或者如果不初始化那就得是抽象的abstract屬性。

    我們把這兩個屬性都給初始化如下:

    class World1 {val yin: Int = 0val yang: Int = 1 }

    我們再來使用測試代碼來看下訪問這兩個屬性的方式:

    >>> class World1 { ... val yin: Int = 0 ... val yang: Int = 1 ... } >>> val w1 = World1() >>> w1.yin 0 >>> w1.yang 1

    上面的World1類的代碼,在Java中等價的寫法是:

    public final class World1 {private final int yin;private final int yang = 1;public final int getYin() {return this.yin;}public final int getYang() {return this.yang;} }

    我們可以看出,Kotlin中的類的字段自動帶有getter方法和setter方法。而且寫起來比Java要簡潔的多。

    7.2.3 函數(方法)

    我們再來給這個World1類中加上一個函數:

    class World2 {val yin: Int = 0val yang: Int = 1fun plus(): Int {return yin + yang} }val w2 = World2() println(w2.plus()) // 輸出 1

    7.3 抽象類

    7.3.1 抽象類的定義

    含有抽象函數的類(這樣的類需要使用abstract修飾符來聲明),稱為抽象類。

    下面是一個抽象類的例子:

    abstract class Person(var name: String, var age: Int) : Any() {abstract var addr: Stringabstract val weight: Floatabstract fun doEat()abstract fun doWalk()fun doSwim() {println("I am Swimming ... ")}open fun doSleep() {println("I am Sleeping ... ")} }

    7.3.2 抽象函數

    在上面的這個抽象類中,不僅可以有抽象函數abstract fun doEat() abstract fun doWalk(),同時可以有具體實現的函數fun doSwim(), 這個函數默認是final的。也就是說,我們不能重寫這個doSwim函數:

    如果一個函數想要設計成能被重寫,例如fun doSleep(),我們給它加上open關鍵字即可。然后,我們就可以在子類中重寫這個open fun doSleep():

    class Teacher(name: String, age: Int) : Person(name, age) {override var addr: String = "HangZhou"override val weight: Float = 100.0foverride fun doEat() {println("Teacher is Eating ... ")}override fun doWalk() {println("Teacher is Walking ... ")}override fun doSleep() {super.doSleep()println("Teacher is Sleeping ... ")}// override fun doSwim() { // cannot be overriden // println("Teacher is Swimming ... ") // } }

    抽象函數是一種特殊的函數:它只有聲明,而沒有具體的實現。抽象函數的聲明格式為:

    abstract fun doEat()

    關于抽象函數的特征,我們簡單總結如下:

    • 抽象函數必須用abstract關鍵字進行修飾
    • 抽象函數不用手動添加open,默認被open修飾
    • 抽象函數沒有具體的實現
    • 含有抽象函數的類成為抽象類,必須由abtract關鍵字修飾。抽象類中可以有具體實現的函數,這樣的函數默認是final(不能被覆蓋重寫),如果想要重寫這個函數,給這個函數加上open關鍵字。

    7.3.3 抽象屬性

    抽象屬性就是在var或val前被abstract修飾,抽象屬性的聲明格式為:

    abstract var addr : String abstract val weight : Float

    關于抽象屬性,需要注意的是:

  • 抽象屬相在抽象類中不能被初始化
  • 如果在子類中沒有主構造函數,要對抽象屬性手動初始化。如果子類中有主構造函數,抽象屬性可以在主構造函數中聲明。
  • 綜上所述,抽象類和普通類的區別有:

    1.抽象函數必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認為public。

    也就是說,這三個函數

    abstract fun doEat() abstract fun doWalk()fun doSwim() {println("I am Swimming ... ") }

    默認的都是public的。

    另外抽象類中的具體實現的函數,默認是final的。上面的三個函數,等價的Java的代碼如下:

    public abstract void doEat();public abstract void doWalk();public final void doSwim() {String var1 = "I am Swimming ... ";System.out.println(var1); }

    2.抽象類不能用來創建對象實例。也就是說,下面的寫法編譯器是不允許的:

    3.如果一個類繼承于一個抽象類,則子類必須實現父類的抽象方法。實現父類抽象函數,我們使用override關鍵字來表明是重寫函數:

    class Programmer(override var addr: String, override val weight: Float, name: String, age: Int) : Person(name, age) {override fun doEat() {println("Programmer is Eating ... ")}override fun doWalk() {println("Programmer is Walking ... ")} }

    如果子類沒有實現父類的抽象函數,則必須將子類也定義為為abstract類。例如:

    abstract class Writer(override var addr: String, override val weight: Float, name: String, age: Int) : Person(name, age) {override fun doEat() {println("Programmer is Eating ... ")}abstract override fun doWalk(); }

    doWalk函數沒有實現父類的抽象函數,那么我們在子類中把它依然定義為抽象函數。相應地這個子類,也成為了抽象子類,需要使用abstract關鍵字來聲明。

    如果抽象類中含有抽象屬性,在實現子類中必須將抽象屬性初始化,除非子類也為抽象類。例如我們聲明一個Teacher類繼承Person類:

    class Teacher(name: String, age: Int) : Person(name, age) {override var addr: String // error, 需要初始化,或者聲明為abstractoverride val weight: Float // error, 需要初始化,或者聲明為abstract... }

    這樣寫,編譯器會直接報錯:

    解決方法是,在實現的子類中,我們將抽象屬性初始化即可:

    class Teacher(name: String, age: Int) : Person(name, age) {override var addr: String = "HangZhou"override val weight: Float = 100.0foverride fun doEat() {println("Teacher is Eating ... ")}override fun doWalk() {println("Teacher is Walking ... ")} }

    7.4 接口

    7.4.1 接口定義

    和Java類似,Kotlin使用interface作為接口的關鍵詞:

    interface ProjectService

    Kotlin 的接口與 Java 8 的接口類似。與抽象類相比,他們都可以包含抽象的方法以及方法的實現:

    interface ProjectService {val name: Stringval owner: Stringfun save(project: Project)fun print() {println("I am project")} }

    7.4.2 實現接口

    接口是沒有構造函數的。我們使用冒號: 語法來實現一個接口,如果有多個用,逗號隔開:

    class ProjectServiceImpl : ProjectService class ProjectMilestoneServiceImpl : ProjectService, MilestoneService

    我們也可以實現多個接口:

    class Projectclass Milestoneinterface ProjectService {val name: Stringval owner: Stringfun save(project: Project)fun print() {println("I am project")} }interface MilestoneService {val name: Stringfun save(milestone: Milestone)fun print() {println("I am Milestone")} }class ProjectMilestoneServiceImpl : ProjectService, MilestoneService {override val name: Stringget() = "ProjectMilestone"override val owner: Stringget() = "Jack"override fun save(project: Project) {println("Save Project")}override fun print() { // super.print()super<ProjectService>.print()super<MilestoneService>.print()}override fun save(milestone: Milestone) {println("Save Milestone")} }

    當子類繼承了某個類之后,便可以使用父類中的成員變量,但是并不是完全繼承父類的所有成員變量。具體的原則如下:

    1.能夠繼承父類的public和protected成員變量;不能夠繼承父類的private成員變量;

    2.對于父類的包訪問權限成員變量,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;

    3.對于子類可以繼承的父類成員變量,如果在子類中出現了同名稱的成員變量,則會發生隱藏現象,即子類的成員變量會屏蔽掉父類的同名成員變量。如果要在子類中訪問父類中同名成員變量,需要使用super關鍵字來進行引用。

    7.4.3 覆蓋沖突

    在kotlin中, 實現繼承通常遵循如下規則:如果一個類從它的直接父類繼承了同一個函數的多個實現,那么它必須重寫這個函數并且提供自己的實現(或許只是直接用了繼承來的實現) 為表示使用父類中提供的方法我們用 super 表示。

    在重寫print()時,因為我們實現的ProjectService、MilestoneService都有一個print()函數,當我們直接使用super.print()時,編譯器是無法知道我們想要調用的是那個里面的print函數的,這個我們叫做覆蓋沖突:

    這個時候,我們可以使用下面的語法來調用:

    super<ProjectService>.print() super<MilestoneService>.print()

    7.4.4 接口中的屬性

    在接口中聲明的屬性,可以是抽象的,或者是提供訪問器的實現。

    在企業應用中,大多數的類型都是無狀態的,如:Controller、ApplicationService、DomainService、Repository等。

    因為接口沒有狀態, 所以它的屬性是無狀態的。

    interface MilestoneService {val name: String // 抽象的val owner: String get() = "Jack" // 訪問器fun save(milestone: Milestone)fun print() {println("I am Milestone")} }class MilestoneServiceImpl : MilestoneService {override val name: Stringget() = "MilestoneServiceImpl name"override fun save(milestone: Milestone) {println("save Milestone")} }

    7.5 抽象類和接口的差異

    概念上的區別

    接口主要是對動作的抽象,定義了行為特性的規約。
    抽象類是對根源的抽象。當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用接口。

    語法層面上的區別

    接口不能保存狀態,可以有屬性但必須是抽象的。
    一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。

    類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。

    接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。

    設計層面上的區別

    抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。

    繼承是 is a的關系,而 接口實現則是 has a 的關系。如果一個類繼承了某個抽象類,則子類必定是抽象類的種類,而接口實現就不需要有這層類型關系。

    設計層面不同,抽象類作為很多子類的父類,它是一種模板式設計。而接口是一種行為規范,它是一種輻射式設計。也就是說:

    • 對于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現,子類可以不進行變更;

    • 而對于接口則不行,如果接口進行了變更,則所有實現這個接口的類都必須進行相應的改動。

    實際應用上的差異

    在實際使用中,使用抽象類(也就是繼承),是一種強耦合的設計,用來描述A is a B 的關系,即如果說A繼承于B,那么在代碼中將A當做B去使用應該完全沒有問題。比如在Android中,各種控件都可以被當做View去處理。

    如果在你設計中有兩個類型的關系并不是is a,而是is like a,那就必須慎重考慮繼承。因為一旦我們使用了繼承,就要小心處理好子類跟父類的耦合依賴關系。組合優于繼承。

    7.6 繼承

    繼承是面向對象編程的一個重要的方式,因為通過繼承,子類就可以擴展父類的功能。

    在Kotlin中,所有的類會默認繼承Any這個父類,但Any并不完全等同于java中的Object類,因為它只有equals(),hashCode()和toString()這三個方法。

    7.6.1 open類

    除了抽象類、接口默認可以被繼承(實現)外,我們也可以把一個類聲明為open的,這樣我們就可以繼承這個open類。

    當我們想定義一個父類時,需要使用open關鍵字:

    open class Base{ }

    當然,抽象類是默認open的。

    然后在子類中使用冒號:進行繼承

    class SubClass : Base(){ }

    如果父類有構造函數,那么必須在子類的主構造函數中進行繼承,沒有的話則可以選擇主構造函數或二級構造函數

    //父類 open class Base(type:String){ } //子類 class SubClass(type:String) : Base(type){ }

    Kotlin中的override重寫和java中也有所不同,因為Kotlin提倡所有的操作都是明確的,因此需要將希望被重寫的函數設為open:

    open fun doSomething() {}

    然后通過override標記實現重寫

    override fun doSomething() { super.doSomething() }

    同樣的,抽象函數以及接口中定義的函數默認都是open的。

    override重寫的函數也是open的,如果希望它不被重寫,可以在前面增加final :

    open class SubClass : Base{ constructor(type:String) : super(type){ } final override fun doSomething() { super.doSomething() } }

    7.6.2 多重繼承

    有些編程語言支持一個類擁有多個父類,例如C++。 我們將這個特性稱之為多重繼承(multiple inheritance)。多重繼承會有二義性和鉆石型繼承樹(DOD:Diamond Of Death)的復雜性問題。Kotlin跟Java一樣,沒有采用多繼承,任何一個子類僅允許一個父類存在,而在多繼承的問題場景下,使用實現多個interface 組合的方式來實現多繼承的功能。

    代碼示例:

    package com.easy.kotlinabstract class Animal {fun doEat() {println("Animal Eating")} }abstract class Plant {fun doEat() {println("Plant Eating")} }interface Runnable {fun doRun() }interface Flyable {fun doFly() }class Dog : Animal(), Runnable {override fun doRun() {println("Dog Running")} }class Eagle : Animal(), Flyable {override fun doFly() {println("Eagle Flying")} }// 始祖鳥, 能飛也能跑 class Archaeopteryx : Animal(), Runnable, Flyable {override fun doRun() {println("Archaeopteryx Running")}override fun doFly() {println("Archaeopteryx Flying")}}fun main(args: Array<String>) {val d = Dog()d.doEat()d.doRun()val e = Eagle()e.doEat()e.doFly()val a = Archaeopteryx()a.doEat()a.doFly()a.doRun() }

    上述代碼類之間的關系,我們用圖示如下:

    我們可以看出,Archaeopteryx繼承了Animal類,用了父類doEat()函數功能;實現了Runnable接口,擁有了doRun()函數規范;實現了Flyable接口,擁有了doFly()函數規范。

    在這里,我們通過實現多個接口,組合完成了的多個功能,而不是設計多個層次的復雜的繼承關系。

    7.7 枚舉類

    Kotlin的枚舉類定義如下:

    public abstract class Enum<E : Enum<E>>(name: String, ordinal: Int): Comparable<E> {companion object {}public final val name: Stringpublic final val ordinal: Intpublic override final fun compareTo(other: E): Intprotected final fun clone(): Anypublic override final fun equals(other: Any?): Booleanpublic override final fun hashCode(): Intpublic override fun toString(): String }

    我們可以看出,這個枚舉類有兩個屬性:

    public final val name: String public final val ordinal: Int

    分別表示的是枚舉對象的值跟下標位置。

    同時,我們可以看出枚舉類還實現了Comparable接口。

    7.7.1 枚舉類基本用法

    枚舉類的最基本的用法是實現類型安全的枚舉:

    enum class Direction {NORTH, SOUTH, WEST, EAST }>>> val north = Direction.NORTH >>> north.name NORTH >>> north.ordinal 0 >>> north is Direction true

    每個枚舉常量都是一個對象。枚舉常量用逗號分隔。

    7.7.2 初始化枚舉值

    我們可以如下初始化枚舉類的值:

    enum class Color(val rgb: Int) {RED(0xFF0000),GREEN(0x00FF00),BLUE(0x0000FF) }>>> val red = Color.RED >>> red.rgb 16711680

    另外,枚舉常量也可以聲明自己的匿名類:

    enum class ActivtyLifeState {onCreate {override fun signal() = onStart},onStart {override fun signal() = onStop},onStop {override fun signal() = onStart},onDestroy {override fun signal() = onDestroy};abstract fun signal(): ActivtyLifeState }>>> val s = ActivtyLifeState.onCreate >>> println(s.signal()) onStart

    7.7.3 使用枚舉常量

    我們使用enumValues()函數來列出枚舉的所有值:

    @SinceKotlin("1.1") public inline fun <reified T : Enum<T>> enumValues(): Array<T>

    每個枚舉常量,默認都name名稱和ordinal位置的屬性(這個跟Java的Enum類里面的類似):

    val name: String val ordinal: Int

    代碼示例:

    enum class RGB { RED, GREEN, BLUE }>>> val rgbs = enumValues<RGB>().joinToString { "${it.name} : ${it.ordinal} " } >>> rgbs RED : 0 , GREEN : 1 , BLUE : 2

    我們直接聲明了一個簡單枚舉類,我們使用遍歷函數enumValues<RGB>()列出了RGB枚舉類的所有枚舉值。使用it.name it.ordinal直接訪問各個枚舉值的名稱和位置。

    另外,我們也可以自定義枚舉屬性值:

    enum class Color(val rgb: Int) {RED(0xFF0000),GREEN(0x00FF00),BLUE(0x0000FF) }>>> val colors = enumValues<Color>().joinToString { "${it.rgb} : ${it.name} : ${it.ordinal} " } >>> colors 16711680 : RED : 0 , 65280 : GREEN : 1 , 255 : BLUE : 2

    然后,我們可以直接使用it.rgb訪問屬性名來得到對應的屬性值。

    7.8 注解類

    Kotlin 的注解與 Java 的注解完全兼容。

    7.8.1 聲明注解

    annotation class 注解名

    代碼示例:

    @Target(AnnotationTarget.CLASS,AnnotationTarget.FUNCTION,AnnotationTarget.EXPRESSION,AnnotationTarget.FIELD,AnnotationTarget.LOCAL_VARIABLE,AnnotationTarget.TYPE,AnnotationTarget.TYPEALIAS,AnnotationTarget.TYPE_PARAMETER,AnnotationTarget.VALUE_PARAMETER) @Retention(AnnotationRetention.SOURCE) @MustBeDocumented @Repeatable annotation class MagicClass@Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.SOURCE) @MustBeDocumented @Repeatable annotation class MagicFunction@Target(AnnotationTarget.CONSTRUCTOR) @Retention(AnnotationRetention.SOURCE) @MustBeDocumented @Repeatable annotation class MagicConstructor

    在上面的代碼中,我們通過向注解類添加元注解(meta-annotation)的方法來指定其他屬性:

    • @Target :指定這個注解可被用于哪些元素(類, 函數, 屬性, 表達式, 等等.);
    • @Retention :指定這個注解的信息是否被保存到編譯后的 class 文件中, 以及在運行時是否可以通過反
      射訪問到它;
    • @Repeatable:允許在單個元素上多次使用同一個注解;
    • @MustBeDocumented : 表示這個注解是公開 API 的一部分, 在自動產生的 API 文檔的類或者函數簽名中, 應該包含這個注解的信息。

    這幾個注解定義在kotlin/annotation/Annotations.kt類中。

    7.8.2 使用注解

    注解可以用在類、函數、參數、變量(成員變量、局部變量)、表達式、類型上等。這個由該注解的元注解@Target定義。

    @MagicClass class Foo @MagicConstructor constructor() {constructor(index: Int) : this() {this.index = index}@MagicClass var index: Int = 0@MagicFunction fun magic(@MagicClass name: String) {} }

    注解在主構造器上,主構造器必須加上關鍵字 “constructor”

    @MagicClass class Foo @MagicConstructor constructor() { ... }

    7.9 單例模式(Singleton)與伴生對象(companion object)

    7.9.1 單例模式(Singleton)

    單例模式很常用。它是一種常用的軟件設計模式。例如,Spring中的Bean默認就是單例。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。

    我們用Java實現一個簡單的單例類的代碼如下:

    class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }

    測試代碼:

    Singleton singleton1 = Singleton.getInstance();

    可以看出,我們先在單例類中聲明了一個私有靜態的Singleton instance變量,然后聲明一個私有構造函數private Singleton() {}, 這個私有構造函數使得外部無法直接通過new的方式來構建對象:

    Singleton singleton2 = new Singleton(); //error, cannot private access

    最后提供一個public的獲取當前類的唯一實例的靜態方法getInstance()。我們這里給出的是一個簡單的單例類,是線程不安全的。

    7.9.2 object對象

    Kotlin中沒有 靜態屬性和方法,但是也提供了實現類似于單例的功能,我們可以使用關鍵字 object 聲明一個object對象:

    object AdminUser {val username: String = "admin"val password: String = "admin"fun getTimestamp() = SimpleDateFormat("yyyyMMddHHmmss").format(Date())fun md5Password() = EncoderByMd5(password + getTimestamp()) }

    測試代碼:

    val adminUser = AdminUser.username val adminPassword = AdminUser.md5Password() println(adminUser) // admin println(adminPassword) // g+0yLfaPVYxUf6TMIdXFXw==,這個值具體運行時會變化

    為了方便在REPL中演示說明,我們再寫一個示例代碼:

    >>> object User { ... val username: String = "admin" ... val password: String = "admin" ... }

    object對象只能通過對象名字來訪問:

    >>> User.username admin >>> User.password admin

    不能像下面這樣使用構造函數:

    >>> val u = User() error: expression 'User' of type 'Line130.User' cannot be invoked as a function. The function 'invoke()' is not found val u = User()^

    為了更加直觀的了解object對象的概念,我們把上面的object User的代碼反編譯成Java代碼:

    public final class User {@NotNullprivate static final String username = "admin";@NotNullprivate static final String password = "admin";public static final User INSTANCE;@NotNullpublic final String getUsername() {return username;}@NotNullpublic final String getPassword() {return password;}private User() {INSTANCE = (User)this;username = "admin";password = "admin";}static {new User();} }

    從上面的反編譯代碼,我們可以直觀了解Kotlin的object背后的一些原理。

    7.9.3 嵌套(Nested)object對象

    這個object對象還可以放到一個類里面:

    class DataProcessor {fun process() {println("Process Data")}object FileUtils {val userHome = "/Users/jack/"fun getFileContent(file: String): String {var content = ""val f = File(file)f.forEachLine { content = content + it + "\n" }return content}} }

    測試代碼:

    DataProcessor.FileUtils.userHome // /Users/jack/ DataProcessor.FileUtils.getFileContent("test.data") // 輸出文件的內容

    同樣的,我們只能通過類的名稱來直接訪問object,不能使用對象實例引用。下面的寫法是錯誤的:

    val dp = DataProcessor() dp.FileUtils.userHome // error, Nested object FileUtils cannot access object via reference

    我們在Java中通常會寫一些Utils類,這樣的類我們在Kotlin中就可以直接使用object對象:

    object HttpUtils {val client = OkHttpClient()@Throws(Exception::class)fun getSync(url: String): String? {val request = Request.Builder().url(url).build()val response = client.newCall(request).execute()if (!response.isSuccessful()) throw IOException("Unexpected code " + response)val responseHeaders = response.headers()for (i in 0..responseHeaders.size() - 1) {println(responseHeaders.name(i) + ": " + responseHeaders.value(i))}return response.body()?.string()}@Throws(Exception::class)fun getAsync(url: String) {var result: String? = ""val request = Request.Builder().url(url).build()client.newCall(request).enqueue(object : Callback {override fun onFailure(call: Call, e: IOException?) {e?.printStackTrace()}@Throws(IOException::class)override fun onResponse(call: Call, response: Response) {if (!response.isSuccessful()) throw IOException("Unexpected code " + response)val responseHeaders = response.headers()for (i in 0..responseHeaders.size() - 1) {println(responseHeaders.name(i) + ": " + responseHeaders.value(i))}result = response.body()?.string()println(result)}})} }

    測試代碼:

    val url = "http://www.baidu.com" val html1 = HttpUtils.getSync(url) // 同步get println("html1=${html1}") HttpUtils.getAsync(url) // 異步get

    7.9.4 匿名object

    還有,在代碼行內,有時候我們需要的僅僅是一個簡單的對象,我們這個時候就可以使用下面的匿名object的方式:

    fun distance(x: Double, y: Double): Double {val porigin = object {var x = 0.0var y = 0.0}return Math.sqrt((x - porigin.x) * (x - porigin.x) + (y - porigin.y) * (y - porigin.y)) }

    測試代碼:

    distance(3.0, 4.0)

    需要注意的是,匿名對象只可以用在本地和私有作用域中聲明的類型。代碼示例:

    class AnonymousObjectType {// 私有函數,返回的是匿名object類型private fun privateFoo() = object {val x: String = "x"}// 公有函數,返回的類型是 Anyfun publicFoo() = object {val x: String = "x" // 無法訪問到}fun test() {val x1 = privateFoo().x // Works//val x2 = publicFoo().x // ERROR: Unresolved reference 'x'} }fun main(args: Array<String>) {AnonymousObjectType().publicFoo().x // Unresolved reference 'x' }

    跟 Java 匿名內部類類似,object對象表達式中的代碼可以訪問來自包含它的作用域的變量(與 Java 不同的是,這不限于 final 變量):

    fun countCompare() {var list = mutableListOf(1, 4, 3, 7, 11, 9, 10, 20)var countCompare = 0Collections.sort(list, object : Comparator<Int> {override fun compare(o1: Int, o2: Int): Int {countCompare++println("countCompare=$countCompare")println(list)return o1.compareTo(o2)}}) }

    測試代碼:

    countCompare()countCompare=1 [1, 4, 3, 7, 11, 9, 10, 20] ... countCompare=17 [1, 3, 4, 7, 9, 10, 11, 20]

    7.9.5 伴生對象(companion object)

    Kotlin中還提供了 伴生對象 ,用companion object關鍵字聲明:

    class DataProcessor {fun process() {println("Process Data")}object FileUtils {val userHome = "/Users/jack/"fun getFileContent(file: String): String {var content = ""val f = File(file)f.forEachLine { content = content + it + "\n" }return content}}companion object StringUtils {fun isEmpty(s: String): Boolean {return s.isEmpty()}} }

    一個類只能有1個伴生對象。也就是是下面的寫法是錯誤的:

    class ClassA {companion object Factory {fun create(): ClassA = ClassA()}companion object Factory2 { // error, only 1 companion object is allowed per classfun create(): MyClass = MyClass()} }

    一個類的伴生對象默認引用名是Companion:

    class ClassB {companion object {fun create(): ClassB = ClassB()fun get() = "Hi, I am CompanyB"} }

    我們可以直接像在Java靜態類中使用靜態方法一樣使用一個類的伴生對象的函數,屬性(但是在運行時,它們依舊是實體的實例成員):

    ClassB.Companion.index ClassB.Companion.create() ClassB.Companion.get()

    其中, Companion可以省略不寫:

    ClassB.index ClassB.create() ClassB.get()

    當然,我們也可以指定伴生對象的名稱:

    class ClassC {var index = 0fun get(index: Int): Int {return 0}companion object CompanyC {fun create(): ClassC = ClassC()fun get() = "Hi, I am CompanyC"} }

    測試代碼:

    ClassC.index ClassC.create()// com.easy.kotli.ClassC@7440e464,具體運行值會變化 ClassC.get() // Hi, I am CompanyC ClassC.CompanyC.index ClassC.CompanyC.create() ClassC.CompanyC.get()

    伴生對象的初始化是在相應的類被加載解析時,與 Java 靜態初始化器的語義相匹配。

    即使伴生對象的成員看起來像其他語言的靜態成員,在運行時他們仍然是真實對象的實例成員。而且,還可以實現接口:

    interface BeanFactory<T> {fun create(): T }class MyClass {companion object : BeanFactory<MyClass> {override fun create(): MyClass {println("MyClass Created!")return MyClass()}} }

    測試代碼:

    MyClass.create() // "MyClass Created!" MyClass.Companion.create() // "MyClass Created!"

    另外,如果想使用Java中的靜態成員和靜態方法的話,我們可以用:

    @JvmField注解:生成與該屬性相同的靜態字段
    @JvmStatic注解:在單例對象和伴生對象中生成對應的靜態方法

    7.10 sealed 密封類

    7.10.1 為什么使用密封類

    就像我們為什么要用enum類型一樣,比如你有一個enum類型 MoneyUnit,定義了元、角、分這些單位。枚舉就是為了控制住你所有要的情況是正確的,而不是用硬編碼方式寫成字符串“元”,“角”,“分”。

    同樣,sealed的目的類似,一個類之所以設計成sealed,就是為了限制類的繼承結構,將一個值限制在有限集中的類型中,而不能有任何其他的類型。

    在某種意義上,sealed類是枚舉類的擴展:枚舉類型的值集合也是受限的,但每個枚舉常量只存在一個實例,而密封類的一個子類可以有可包含狀態的多個實例。

    7.10.1 聲明密封類

    要聲明一個密封類,需要在類名前面添加 sealed 修飾符。密封類的所有子類都必須與密封類在同一個文件中聲明(在 Kotlin 1.1 之前, 該規則更加嚴格:子類必須嵌套在密封類聲明的內部):

    sealed class Expression class Unit : Expression() data class Const(val number: Double) : Expression() data class Sum(val e1: Expression, val e2: Expression) : Expression() data class Multiply(val e1: Expression, val e2: Expression) : Expression() object NaN : Expression()

    使用密封類的主要場景是在使用 when 表達式的時候,能夠驗證語句覆蓋了所有情況,而無需再添加一個 else 子句:

    fun eval(expr: Expression): Double = when (expr) {is Unit -> 1.0is Const -> expr.numberis Sum -> eval(expr.e1) + eval(expr.e2)is Multiply -> eval(expr.e1) * eval(expr.e2)NaN -> Double.NaN// 不再需要 `else` 子句,因為我們已經覆蓋了所有的情況 }

    測試代碼:

    fun main(args: Array<String>) {val u = eval(Unit())val a = eval(Const(1.1))val b = eval(Sum(Const(1.0), Const(9.0)))val c = eval(Multiply(Const(10.0), Const(10.0)))println(u)println(a)println(b)println(c) }

    輸出:

    1.0 1.1 10.0 100.0

    7.11 data 數據類

    7.11.1 構造函數中的 val/var

    在開始講數據類之前,我們先來看一下幾種類聲明的寫法。

    寫法一:

    class Aook(name: String)

    這樣寫,這個name變量是無法被外部訪問到的。它對應的反編譯之后的Java代碼如下:

    public final class Aook {public Aook(@NotNull String name) {Intrinsics.checkParameterIsNotNull(name, "name");super();} }

    寫法二:
    要想這個name變量被訪問到,我們可以在類體中再聲明一個變量,然后把這個構造函數中的參數賦值給它:

    class Cook(name: String) {val name = name }

    測試代碼:

    val cook = Cook("Cook") cook.name

    對應的Java實現代碼是:

    public final class Cook {@NotNullprivate final String name;@NotNullpublic final String getName() {return this.name;}public Cook(@NotNull String name) {Intrinsics.checkParameterIsNotNull(name, "name");super();this.name = name;} }

    寫法三:

    class Dook(val name: String) class Eook(var name: String)

    構造函數中帶var、val修飾的變量,Kotlin編譯器會自動為它們生成getter、setter函數。

    上面的寫法對應的Java代碼就是:

    public final class Dook {@NotNullprivate final String name;@NotNullpublic final String getName() {return this.name;}public Dook(@NotNull String name) {Intrinsics.checkParameterIsNotNull(name, "name");super();this.name = name;} }public final class Eook {@NotNullprivate String name;@NotNullpublic final String getName() {return this.name;}public final void setName(@NotNull String var1) {Intrinsics.checkParameterIsNotNull(var1, "<set-?>");this.name = var1;}public Eook(@NotNull String name) {Intrinsics.checkParameterIsNotNull(name, "name");super();this.name = name;} }

    測試代碼:

    val dook = Dook("Dook") dook.name val eook = Eook("Eook") eook.name

    下面我們來學習一下Kotlin中的數據類: data class 。

    7.11.2 領域實體類

    我們寫Java代碼的時候,會經常創建一些只保存數據的類。比如說:

    • POJO類:POJO全稱是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻譯成:普通Java類,具有一部分getter/setter方法的那種類就可以稱作POJO。

    • DTO類:Data Transfer Object,數據傳輸對象類,泛指用于展示層與服務層之間的數據傳輸對象。

    • VO類:VO有兩種說法,一個是ViewObject,一個是ValueObject。

    • PO類:Persisent Object,持久對象。它們是由一組屬性和屬性的get和set方法組成。PO是在持久層所使用,用來封裝原始數據。

    • BO類:Business Object,業務對象層,表示應用程序領域內“事物”的所有實體類。

    • DO類:Domain Object,領域對象,就是從現實世界中抽象出來的有形或無形的業務實體。

    等等。

    這些我們統稱為領域模型中的實體類。最簡單的實體類是POJO類,含有屬性及屬性對應的set和get方法,實體類常見的方法還有用于輸出自身數據的toString方法。

    7.11.3 數據類data class的概念

    在 Kotlin 中,也有對應這樣的領域實體類的概念,并在語言層面上做了支持,叫做數據類 :

    data class Book(val name: String) data class Fook(var name: String) data class User(val name: String, val gender: String, val age: Int) {fun validate(): Boolean {return true} }

    這里的var/val是必須要帶上的。因為編譯器要把主構造函數中聲明的所有屬性,自動生成以下函數:

    equals()/hashCode() toString() : 格式是 User(name=Jacky, gender=Male, age=10) componentN() 函數 : 按聲明順序對應于所有屬性component1()、component2() ... copy() 函數

    如果我們自定義了這些函數,或者繼承父類重寫了這些函數,編譯器就不會再去生成。

    測試代碼:

    val book = Book("Book") book.name book.copy("Book2")val jack = User("Jack", "Male", 1) jack.name jack.gender jack.age jack.toString() jack.validate()val olderJack = jack.copy(age = 2) val anotherJack = jack.copy(name = "Jacky", age = 10)

    在一些場景下,我們需要復制一個對象來改變它的部分屬性,而其余部分保持不變。 copy() 函數就是為此而生成。例如上面的的 User 類的copy函數的使用:

    val olderJack = jack.copy(age = 2) val anotherJack = jack.copy(name = "Jacky", age = 10)

    7.11.4 數據類的限制

    數據類有以下的限制要求:

    1.主構造函數需要至少有一個參數。下面的寫法是錯誤的:

    data class Gook // error, data class must have at least one primary constructor parameter

    2.主構造函數的所有參數需要標記為 val 或 var;

    data class Hook(name: String)// error, data class must have only var/val property

    跟普通類一樣,數據類也可以有次級構造函數:

    data class LoginUser(val name: String = "", val password: String = "") : DBase(), IBaseA, IBaseB {var isActive = trueconstructor(name: String, password: String, isActive: Boolean) : this(name, password) {this.isActive = isActive}... }

    3.數據類不能是抽象、開放、密封或者內部的。也就是說,下面的寫法都是錯誤的:

    abstract data class Iook(val name: String) // modifier abstract is incompatible with data open data class Jook(val name: String) // modifier abstract is incompatible with data sealed data class Kook(val name: String)// modifier sealed is incompatible with data inner data class Look(val name: String)// modifier inner is incompatible with data

    數據類只能是final的:

    final data class Mook(val name: String) // modifier abstract is incompatible with data

    4.在1.1之前數據類只能實現接口。自 1.1 起,數據類可以擴展其他類。代碼示例:

    open class DBase interface IBaseA interface IBaseBdata class LoginUser(val name: String, val password: String) : DBase(), IBaseA, IBaseB {override fun equals(other: Any?): Boolean {return super.equals(other)}override fun hashCode(): Int {return super.hashCode()}override fun toString(): String {return super.toString()}fun validate(): Boolean {return true} }

    測試代碼:

    val loginUser1 = LoginUser("Admin", "admin") println(loginUser1.component1()) println(loginUser1.component2()) println(loginUser1.name) println(loginUser1.password) println(loginUser1.toString())

    輸出:

    Admin admin Admin admin com.easy.kotlin.LoginUser@7440e464

    可以看出,由于我們重寫了override fun toString(): String, 對應的輸出使我們熟悉的類的輸出格式。

    如果我們不重寫這個toString函數,則會默認輸出:

    LoginUser(name=Admin, password=admin)

    上面的類聲明的構造函數,要求我們每次必須初始化name、password的值,如果我們想擁有一個無參的構造函數,我們只要對所有的屬性指定默認值即可:

    data class LoginUser(val name: String = "", val password: String = "") : DBase(), IBaseA, IBaseB { ... }

    這樣我們在創建對象的時候,就可以直接使用:

    val loginUser3 = LoginUser() loginUser3.name loginUser3.password

    7.11.5 數據類的解構

    解構相當于 Component 函數的逆向映射:

    val helen = User("Helen", "Female", 15) val (name, gender, age) = helen println("$name, $gender, $age years of age")

    輸出:Helen, Female, 15 years of age

    7.11.6 標準數據類Pair 和Triple

    標準庫中的二元組 Pair類就是一個數據類:

    public data class Pair<out A, out B>(public val first: A,public val second: B) : Serializable {public override fun toString(): String = "($first, $second)" }

    Kotlin標準庫中,對Pair類還增加了轉換成List的擴展函數:

    public fun <T> Pair<T, T>.toList(): List<T> = listOf(first, second)

    還有三元組Triple類:

    public data class Triple<out A, out B, out C>(public val first: A,public val second: B,public val third: C) : Serializable {public override fun toString(): String = "($first, $second, $third)" }fun <T> Triple<T, T, T>.toList(): List<T> = listOf(first, second, third)

    7.12 嵌套類(Nested Class)

    7.12.1 嵌套類:類中的類

    類可以嵌套在其他類中,可以嵌套多層:

    class NestedClassesDemo {class Outer {private val zero: Int = 0val one: Int = 1class Nested {fun getTwo() = 2class Nested1 {val three = 3fun getFour() = 4}}} }

    測試代碼:

    val one = NestedClassesDemo.Outer().one val two = NestedClassesDemo.Outer.Nested().getTwo() val three = NestedClassesDemo.Outer.Nested.Nested1().three val four = NestedClassesDemo.Outer.Nested.Nested1().getFour() println(one) println(two) println(three) println(four)

    我們可以看出,訪問嵌套類的方式是直接使用 類名., 有多少層嵌套,就用多少層類名來訪問。

    普通的嵌套類,沒有持有外部類的引用,所以是無法訪問外部類的變量的:

    class NestedClassesDemo { class Outer {private val zero: Int = 0val one: Int = 1class Nested {fun getTwo() = 2fun accessOuter() = {println(zero) // error, cannot access outer classprintln(one) // error, cannot access outer class}}} }

    我們在Nested類中,訪問不到Outer類中的變量zero,one。
    如果想要訪問到,我們只需要在Nested類前面加上inner關鍵字修飾,表明這是一個嵌套的內部類。

    7.12.2 內部類(Inner Class)

    類可以標記為 inner 以便能夠訪問外部類的成員。內部類會帶有一個對外部類的對象的引用:

    class NestedClassesDemo { class Outer {private val zero: Int = 0val one: Int = 1inner class Inner {fun accessOuter() = {println(zero) // worksprintln(one) // works}} }

    測試代碼:

    val innerClass = NestedClassesDemo.Outer().Inner().accessOuter()

    我們可以看到,當訪問inner class Inner的時候,我們使用的是Outer().Inner(), 這是持有了Outer的對象引用。跟普通嵌套類直接使用類名訪問的方式區分。

    7.12.3 匿名內部類(Annonymous Inner Class)

    匿名內部類,就是沒有名字的內部類。既然是內部類,那么它自然也是可以訪問外部類的變量的。

    我們使用對象表達式創建一個匿名內部類實例:

    class NestedClassesDemo { class AnonymousInnerClassDemo {var isRunning = falsefun doRun() {Thread(object : Runnable {override fun run() {isRunning = trueprintln("doRun : i am running, isRunning = $isRunning")}}).start()}} }

    如果對象是函數式 Java 接口,即具有單個抽象方法的 Java 接口的實例,例如上面的例子中的Runnable接口:

    @FunctionalInterface public interface Runnable {public abstract void run(); }

    我們可以使用lambda表達式創建它,下面的幾種寫法都是可以的:

    fun doStop() {var isRunning = trueThread({isRunning = falseprintln("doStop: i am not running, isRunning = $isRunning")}).start() }fun doWait() {var isRunning = trueval wait = Runnable {isRunning = falseprintln("doWait: i am waiting, isRunning = $isRunning")}Thread(wait).start() }fun doNotify() {var isRunning = trueval wait = {isRunning = falseprintln("doNotify: i notify, isRunning = $isRunning")}Thread(wait).start() }

    測試代碼:

    NestedClassesDemo.Outer.AnonymousInnerClassDemo().doRun() NestedClassesDemo.Outer.AnonymousInnerClassDemo().doStop() NestedClassesDemo.Outer.AnonymousInnerClassDemo().doWait() NestedClassesDemo.Outer.AnonymousInnerClassDemo().doNotify()

    輸出:

    doRun : i am running, isRunning = true doStop: i am not running, isRunning = false doWait: i am waiting, isRunning = false doNotify: i notify, isRunning = false

    關于lambda表達式以及函數式編程,我們將在下一章中學習。

    7.13 委托(Delegation)

    7.13.1 代理模式(Proxy Pattern)

    代理模式,也稱委托模式。

    在代理模式中,有兩個對象參與處理同一個請求,接受請求的對象將請求委托給另一個對象來處理。代理模式是一項基本技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在特殊的場合采用了代理模式。

    代理模式使得我們可以用聚合來替代繼承,它還使我們可以模擬mixin(混合類型)。委托模式的作用是將委托者與實際實現代碼分離出來,以達成解耦的目的。

    一個代理模式的Java代碼示例:

    package com.easy.kotlin;interface JSubject {public void request(); }class JRealSubject implements JSubject {@Overridepublic void request() {System.out.println("JRealSubject Requesting");} }class JProxy implements JSubject {private JSubject subject = null;//通過構造函數傳遞代理者public JProxy(JSubject sub) {this.subject = sub;}@Overridepublic void request() { //實現接口中定義的方法this.before();this.subject.request();this.after();}private void before() {System.out.println("JProxy Before Requesting ");}private void after() {System.out.println("JProxy After Requesting ");} }public class DelegateDemo {public static void main(String[] args) {JRealSubject jRealSubject = new JRealSubject();JProxy jProxy = new JProxy(jRealSubject);jProxy.request();} }

    輸出:

    JProxy Before Requesting JRealSubject Requesting JProxy After Requesting

    7.13.2 類的委托(Class Delegation)

    就像支持單例模式的object對象一樣,Kotlin 在語言層面原生支持委托模式。

    代碼示例:

    package com.easy.kotlinimport java.util.*interface Subject {fun hello() }class RealSubject(val name: String) : Subject {override fun hello() {val now = Date()println("Hello, REAL $name! Now is $now")} }class ProxySubject(val sb: Subject) : Subject by sb {override fun hello() {println("Before ! Now is ${Date()}")sb.hello()println("After ! Now is ${Date()}")} }fun main(args: Array<String>) {val subject = RealSubject("World")subject.hello()println("-------------------------")val proxySubject = ProxySubject(subject)proxySubject.hello() }

    在這個例子中,委托代理類 ProxySubject 繼承接口 Subject,并將其所有共有的方法委托給一個指定的對象sb :

    class ProxySubject(val sb: Subject) : Subject by sb

    ProxySubject 的超類型Subject中的 by sb 表示 sb 將會在 ProxySubject 中內部存儲。

    另外,我們在覆蓋重寫了函數override fun hello()。

    測試代碼:

    fun main(args: Array<String>) {val subject = RealSubject("World")subject.hello()println("-------------------------")val proxySubject = ProxySubject(subject)proxySubject.hello() }

    輸出:

    Hello, REAL World! Now is Wed Jul 05 02:45:42 CST 2017 ------------------------- Before ! Now is Wed Jul 05 02:45:42 CST 2017 Hello, REAL World! Now is Wed Jul 05 02:45:42 CST 2017 After ! Now is Wed Jul 05 02:45:42 CST 2017

    7.13.3 委托屬性 (Delegated Properties)

    通常對于屬性類型,我們是在每次需要的時候手動聲明它們:

    class NormalPropertiesDemo {var content: String = "NormalProperties init content" }

    那么這個content屬性將會很“呆板”。屬性委托賦予了屬性富有變化的活力。

    例如:

    • 延遲屬性(lazy properties): 其值只在首次訪問時計算
    • 可觀察屬性(observable properties): 監聽器會收到有關此屬性變更的通知
    • 把多個屬性儲存在一個映射(map)中,而不是每個存在單獨的字段中。

    委托屬性

    Kotlin 支持 委托屬性:

    class DelegatePropertiesDemo {var content: String by Content()override fun toString(): String {return "DelegatePropertiesDemo Class"} }class Content {operator fun getValue(delegatePropertiesDemo: DelegatePropertiesDemo, property: KProperty<*>): String {return "${delegatePropertiesDemo} property '${property.name}' = 'Balalala ... ' "}operator fun setValue(delegatePropertiesDemo: DelegatePropertiesDemo, property: KProperty<*>, value: String) {println("${delegatePropertiesDemo} property '${property.name}' is setting value: '$value'")} }

    在 var content: String by Content()中, by 后面的表達式的Content()就是該屬性委托的對象。content屬性對應的 get()(和 set())會被委托給Content()的 operator fun getValue() 和 operator fun setValue() 函數,這兩個函數是必須的,而且得是操作符函數。

    測試代碼:

    val n = NormalPropertiesDemo() println(n.content) n.content = "Lao tze" println(n.content)val e = DelegatePropertiesDemo() println(e.content) // call Content.getValue e.content = "Confucius" // call Content.setValue println(e.content) // call Content.getValue

    輸出:

    NormalProperties init content Lao tze DelegatePropertiesDemo Class property 'content' = 'Balalala ... ' DelegatePropertiesDemo Class property 'content' is setting value: 'Confucius' DelegatePropertiesDemo Class property 'content' = 'Balalala ...

    懶加載屬性委托 lazy

    lazy() 函數定義如下:

    @kotlin.jvm.JvmVersion public fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)

    它接受一個 lambda 并返回一個 Lazy <T> 實例的函數,返回的實例可以作為實現懶加載屬性的委托:

    第一次調用 get() 會執行已傳遞給 lazy() 的 lamda 表達式并記錄下結果, 后續調用 get() 只是返回之前記錄的結果。

    代碼示例:

    val synchronizedLazyImpl = lazy({println("lazyValueSynchronized1 3!")println("lazyValueSynchronized1 2!")println("lazyValueSynchronized1 1!")"Hello, lazyValueSynchronized1 ! " })val lazyValueSynchronized1: String by synchronizedLazyImpl println(lazyValueSynchronized1) println(lazyValueSynchronized1)val lazyValueSynchronized2: String by lazy {println("lazyValueSynchronized2 3!")println("lazyValueSynchronized2 2!")println("lazyValueSynchronized2 1!")"Hello, lazyValueSynchronized2 ! " }println(lazyValueSynchronized2) println(lazyValueSynchronized2)

    輸出:

    lazyValueSynchronized1 3! lazyValueSynchronized1 2! lazyValueSynchronized1 1! Hello, lazyValueSynchronized1 ! Hello, lazyValueSynchronized1 ! lazyValueSynchronized2 3! lazyValueSynchronized2 2! lazyValueSynchronized2 1! Hello, lazyValueSynchronized2 ! Hello, lazyValueSynchronized2 !

    默認情況下,對于 lazy 屬性的求值是同步的(synchronized), 下面兩種寫法是等價的:

    val synchronizedLazyImpl = lazy({println("lazyValueSynchronized1 3!")println("lazyValueSynchronized1 2!")println("lazyValueSynchronized1 1!")"Hello, lazyValueSynchronized1 ! " })val synchronizedLazyImpl2 = lazy(LazyThreadSafetyMode.SYNCHRONIZED, {println("lazyValueSynchronized1 3!")println("lazyValueSynchronized1 2!")println("lazyValueSynchronized1 1!")"Hello, lazyValueSynchronized1 ! " })

    該值是線程安全的。所有線程會看到相同的值。

    如果初始化委托多個線程可以同時執行,不需要同步鎖,使用LazyThreadSafetyMode.PUBLICATION:

    val lazyValuePublication: String by lazy(LazyThreadSafetyMode.PUBLICATION, {println("lazyValuePublication 3!")println("lazyValuePublication 2!")println("lazyValuePublication 1!")"Hello, lazyValuePublication ! " })

    而如果屬性的初始化是單線程的,那么我們使用 LazyThreadSafetyMode.NONE 模式(性能最高):

    val lazyValueNone: String by lazy(LazyThreadSafetyMode.NONE, {println("lazyValueNone 3!")println("lazyValueNone 2!")println("lazyValueNone 1!")"Hello, lazyValueNone ! " })

    Delegates.observable 可觀察屬性委托

    我們把屬性委托給Delegates.observable函數,當屬性值被重新賦值的時候, 觸發其中的回調函數 onChange。

    該函數定義如下:

    public inline fun <T> observable(initialValue: T, crossinline onChange: (property: KProperty<*>, oldValue: T, newValue: T) -> Unit):ReadWriteProperty<Any?, T> = object : ObservableProperty<T>(initialValue) {override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) = onChange(property, oldValue, newValue)}

    代碼示例:

    class PostHierarchy {var level: String by Delegates.observable("P0",{ property: KProperty<*>,oldValue: String,newValue: String ->println("$oldValue -> $newValue")}) }

    測試代碼:

    val ph = PostHierarchy() ph.level = "P1" ph.level = "P2" ph.level = "P3" println(ph.level) // P3

    輸出:

    P0 -> P1 P1 -> P2 P2 -> P3 P3

    我們可以看出,屬性level每次賦值,都回調了Delegates.observable中的lambda表達式所寫的onChange函數。

    Delegates.vetoable 可否決屬性委托

    這個函數定義如下:

    public inline fun <T> vetoable(initialValue: T, crossinline onChange: (property: KProperty<*>, oldValue: T, newValue: T) -> Boolean):ReadWriteProperty<Any?, T> = object : ObservableProperty<T>(initialValue) {override fun beforeChange(property: KProperty<*>, oldValue: T, newValue: T): Boolean = onChange(property, oldValue, newValue)}

    當我們把屬性委托給這個函數時,我們可以通過onChange函數的返回值是否為true, 來選擇屬性的值是否需要改變。

    代碼示例:

    class PostHierarchy {var grade: String by Delegates.vetoable("T0", {property, oldValue, newValue ->true})var notChangeGrade: String by Delegates.vetoable("T0", {property, oldValue, newValue ->false}) }

    測試代碼:

    ph.grade = "T1" ph.grade = "T2" ph.grade = "T3" println(ph.grade) // T3ph.notChangeGrade = "T1" ph.notChangeGrade = "T2" ph.notChangeGrade = "T3" println(ph.notChangeGrade) // T0

    我們可以看出,當onChange函數返回值是false的時候,對屬性notChangeGrade的賦值都沒有生效,依然是原來的默認值T0 。

    Delegates.notNull 非空屬性委托

    我們也可以使用委托來實現屬性的非空限制:

    var name: String by Delegates.notNull()

    這樣name屬性就被限制為不能為null,如果被賦值null,編譯器直接報錯:

    ph.name = null // error Null can not be a value of a non-null type String

    屬性委托給Map映射

    我們也可以把屬性委托給Map:

    class Account(val map: Map<String, Any?>) {val name: String by mapval password: String by map }

    測試代碼:

    val account = Account(mapOf("name" to "admin","password" to "admin"))println("Account(name=${account.name}, password = ${account.password})")

    輸出:

    Account(name=admin, password = admin)

    如果是可變屬性,這里也可以把只讀的 Map 換成 MutableMap :

    class MutableAccount(val map: MutableMap<String, Any?>) {var name: String by mapvar password: String by map }

    測試代碼:

    val maccount = MutableAccount(mutableMapOf("name" to "admin","password" to "admin" ))maccount.password = "root" println("MutableAccount(name=${maccount.name}, password = ${maccount.password})")

    輸出:

    MutableAccount(name=admin, password = root)

    本章小結

    本章我們介紹了Kotlin面向對象編程的特性: 類與構造函數、抽象類與接口、繼承以及多重繼承等基礎知識,同時介紹了Kotlin中的注解類、枚舉類、數據類、密封類、嵌套類、內部類、匿名內部類等特性類。最后我們學習了Kotlin中對單例模式、委托模式的語言層面上的內置支持:object對象、委托。

    總的來說,Kotlin相比于Java的面向對象編程,增加不少有趣的功能與特性支持,這使得我們代碼寫起來更加方便快捷了。

    我們知道,在Java 8 中,引進了對函數式編程的支持:Lambda表達式、Function接口、stream API等,而在Kotlin中,對函數式編程的支持更加全面豐富,代碼寫起來也更加簡潔優雅。下一章中,我們來一起學習Kotlin的函數式編程。

    本章示例代碼工程:https://github.com/EasyKotlin/chatper7_oop

    總結

    以上是生活随笔為你收集整理的Kotlin极简教程:第7章 面向对象编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲精品国偷拍自产在线观看蜜桃 | 国产av无码专区亚洲awww | 国产成人一区二区三区在线观看 | 精品久久久久香蕉网 | 无码精品国产va在线观看dvd | 成人亚洲精品久久久久软件 | 亚洲一区二区三区在线观看网站 | 亚洲精品国产品国语在线观看 | 国产精品亚洲专区无码不卡 | 亚洲一区二区三区国产精华液 | 日本乱偷人妻中文字幕 | 无码精品国产va在线观看dvd | 1000部夫妻午夜免费 | 男人的天堂2018无码 | 精品国产一区av天美传媒 | 牲欲强的熟妇农村老妇女 | 国产午夜亚洲精品不卡下载 | 欧美日韩人成综合在线播放 | 老司机亚洲精品影院无码 | 国产在线aaa片一区二区99 | 日韩人妻无码中文字幕视频 | 99久久99久久免费精品蜜桃 | 高潮毛片无遮挡高清免费视频 | 国产成人无码av一区二区 | 97人妻精品一区二区三区 | 人妻夜夜爽天天爽三区 | 蜜臀aⅴ国产精品久久久国产老师 | av香港经典三级级 在线 | 日韩亚洲欧美中文高清在线 | 国产在线精品一区二区三区直播 | 色欲人妻aaaaaaa无码 | 国产特级毛片aaaaaa高潮流水 | 久久亚洲中文字幕精品一区 | 日韩无码专区 | 性欧美牲交在线视频 | 亚洲精品综合一区二区三区在线 | 日本精品少妇一区二区三区 | 丰满人妻一区二区三区免费视频 | 99精品视频在线观看免费 | 亚洲国产欧美日韩精品一区二区三区 | 国产精品无码一区二区桃花视频 | 无码纯肉视频在线观看 | 亚洲无人区一区二区三区 | 国产性生交xxxxx无码 | 久久综合九色综合欧美狠狠 | 少妇无码一区二区二三区 | 老子影院午夜精品无码 | 国产精品无码mv在线观看 | 成年美女黄网站色大免费视频 | 色综合久久久久综合一本到桃花网 | 久久亚洲中文字幕无码 | 婷婷综合久久中文字幕蜜桃三电影 | 国产欧美精品一区二区三区 | 久久久久se色偷偷亚洲精品av | 久久精品国产大片免费观看 | 亚洲熟悉妇女xxx妇女av | 日韩人妻无码一区二区三区久久99 | 国产精品毛片一区二区 | 日韩少妇内射免费播放 | 人妻中文无码久热丝袜 | 性欧美牲交在线视频 | 国产尤物精品视频 | 麻豆果冻传媒2021精品传媒一区下载 | 熟妇人妻无乱码中文字幕 | 一本色道婷婷久久欧美 | 成年美女黄网站色大免费视频 | 无码av岛国片在线播放 | 亚洲一区av无码专区在线观看 | 欧美日韩亚洲国产精品 | 中文字幕人妻丝袜二区 | 成年美女黄网站色大免费全看 | 欧美老人巨大xxxx做受 | 日韩人妻系列无码专区 | 大地资源中文第3页 | 国産精品久久久久久久 | 久久久久亚洲精品男人的天堂 | 国产精品二区一区二区aⅴ污介绍 | 无码国产激情在线观看 | 免费视频欧美无人区码 | 动漫av一区二区在线观看 | 精品国产精品久久一区免费式 | 免费人成在线视频无码 | 少妇厨房愉情理9仑片视频 | 欧美日本免费一区二区三区 | 亚洲狠狠婷婷综合久久 | 欧美日韩一区二区三区自拍 | 国产成人精品无码播放 | 麻豆精品国产精华精华液好用吗 | 在线欧美精品一区二区三区 | 97资源共享在线视频 | 最新国产麻豆aⅴ精品无码 | 久久久中文久久久无码 | 中文无码伦av中文字幕 | 色偷偷人人澡人人爽人人模 | 久久综合狠狠综合久久综合88 | 亚洲成av人片在线观看无码不卡 | 色一情一乱一伦 | 爆乳一区二区三区无码 | 国精品人妻无码一区二区三区蜜柚 | 黑人粗大猛烈进出高潮视频 | 久久精品中文闷骚内射 | 成人片黄网站色大片免费观看 | 国产性生交xxxxx无码 | 九九热爱视频精品 | 国产av一区二区三区最新精品 | 一本大道伊人av久久综合 | www国产亚洲精品久久久日本 | 久久久亚洲欧洲日产国码αv | 日本一卡二卡不卡视频查询 | 国产熟女一区二区三区四区五区 | 少妇人妻av毛片在线看 | 亚洲男女内射在线播放 | 在线 国产 欧美 亚洲 天堂 | 任你躁在线精品免费 | 日韩av无码一区二区三区不卡 | 日韩在线不卡免费视频一区 | 国产精品自产拍在线观看 | 99久久人妻精品免费一区 | 亚洲精品一区二区三区在线观看 | 亚洲精品一区二区三区大桥未久 | 亚洲精品国产第一综合99久久 | 亚洲欧美精品aaaaaa片 | 国产亚洲日韩欧美另类第八页 | 日韩少妇白浆无码系列 | 大乳丰满人妻中文字幕日本 | 国产亚洲日韩欧美另类第八页 | 日韩精品一区二区av在线 | 色一情一乱一伦一视频免费看 | 澳门永久av免费网站 | 狠狠色噜噜狠狠狠狠7777米奇 | 小sao货水好多真紧h无码视频 | 国产农村乱对白刺激视频 | 中文字幕乱码人妻二区三区 | 日韩精品成人一区二区三区 | 亚洲精品久久久久avwww潮水 | 欧美第一黄网免费网站 | 欧美丰满熟妇xxxx | 国产熟女一区二区三区四区五区 | 国产av剧情md精品麻豆 | 国产做国产爱免费视频 | 无码av免费一区二区三区试看 | 国模大胆一区二区三区 | 国产成人综合美国十次 | 国产在线精品一区二区高清不卡 | 人人妻人人澡人人爽欧美一区 | 日本va欧美va欧美va精品 | 亚洲综合色区中文字幕 | 国产黄在线观看免费观看不卡 | 99久久人妻精品免费二区 | 性欧美牲交xxxxx视频 | 又大又黄又粗又爽的免费视频 | 欧美性猛交xxxx富婆 | 久久久精品国产sm最大网站 | 97久久精品无码一区二区 | 亚洲国产精品久久人人爱 | 国产精品亚洲а∨无码播放麻豆 | 欧美精品一区二区精品久久 | 国产口爆吞精在线视频 | 欧美第一黄网免费网站 | 国产超级va在线观看视频 | 亚洲爆乳精品无码一区二区三区 | 精品国产成人一区二区三区 | 超碰97人人射妻 | 亚洲熟女一区二区三区 | 久久精品视频在线看15 | 日韩亚洲欧美精品综合 | 99久久婷婷国产综合精品青草免费 | 国产深夜福利视频在线 | 国产极品视觉盛宴 | 精品久久8x国产免费观看 | 精品无码国产自产拍在线观看蜜 | 国产猛烈高潮尖叫视频免费 | 国语精品一区二区三区 | 国产精品久免费的黄网站 | 欧美丰满熟妇xxxx性ppx人交 | 久久久久99精品成人片 | 对白脏话肉麻粗话av | 久久人妻内射无码一区三区 | 国产一区二区不卡老阿姨 | 中文字幕日韩精品一区二区三区 | 日韩精品a片一区二区三区妖精 | 性生交片免费无码看人 | 精品人妻av区 | 国产黄在线观看免费观看不卡 | a在线观看免费网站大全 | 欧美性猛交xxxx富婆 | 天天躁夜夜躁狠狠是什么心态 | 精品无人区无码乱码毛片国产 | 国产精品久久久久久久9999 | 国产精品国产三级国产专播 | 高中生自慰www网站 | 国产亚洲美女精品久久久2020 | 午夜精品久久久久久久 | 亚洲一区二区三区偷拍女厕 | 熟女少妇人妻中文字幕 | 无码精品国产va在线观看dvd | 久久国产自偷自偷免费一区调 | 久久国产精品二国产精品 | 人妻熟女一区 | 国模大胆一区二区三区 | 国产精华av午夜在线观看 | 国产av人人夜夜澡人人爽麻豆 | 人人爽人人澡人人高潮 | av无码不卡在线观看免费 | 国产亚洲精品久久久久久 | 欧美变态另类xxxx | 日本精品高清一区二区 | 正在播放老肥熟妇露脸 | 18禁止看的免费污网站 | 综合人妻久久一区二区精品 | 午夜成人1000部免费视频 | 国产精品-区区久久久狼 | 国产av无码专区亚洲a∨毛片 | 久久久婷婷五月亚洲97号色 | 中国女人内谢69xxxx | 蜜桃av抽搐高潮一区二区 | 久久久中文久久久无码 | 日产精品99久久久久久 | 午夜免费福利小电影 | 国产精品欧美成人 | 中文字幕无线码免费人妻 | 国产精品免费大片 | 日韩视频 中文字幕 视频一区 | 亚洲另类伦春色综合小说 | 亚洲精品美女久久久久久久 | 国产精品高潮呻吟av久久4虎 | 三上悠亚人妻中文字幕在线 | 免费看男女做好爽好硬视频 | 在线看片无码永久免费视频 | 暴力强奷在线播放无码 | 天堂在线观看www | 人人妻人人澡人人爽人人精品 | 亚洲精品一区二区三区大桥未久 | 无码成人精品区在线观看 | 任你躁国产自任一区二区三区 | 免费人成在线视频无码 | 日本va欧美va欧美va精品 | 97人妻精品一区二区三区 | 国产精品毛片一区二区 | 中文字幕av伊人av无码av | 99精品视频在线观看免费 | 乱人伦人妻中文字幕无码久久网 | 国产亚洲视频中文字幕97精品 | 国语自产偷拍精品视频偷 | 人人妻人人澡人人爽欧美一区九九 | www国产亚洲精品久久久日本 | 精品国精品国产自在久国产87 | 国产真实伦对白全集 | 欧美午夜特黄aaaaaa片 | 亚洲国产欧美日韩精品一区二区三区 | 国产乱子伦视频在线播放 | 中文字幕无码日韩欧毛 | 国产suv精品一区二区五 | 无码精品国产va在线观看dvd | 人人澡人人透人人爽 | 疯狂三人交性欧美 | 亚洲成av人片在线观看无码不卡 | 日本精品久久久久中文字幕 | 精品熟女少妇av免费观看 | 国产高清av在线播放 | 人妻尝试又大又粗久久 | 国语自产偷拍精品视频偷 | 一本久道高清无码视频 | 久热国产vs视频在线观看 | 久久久久国色av免费观看性色 | 国产极品视觉盛宴 | 久久久精品成人免费观看 | 激情亚洲一区国产精品 | 无码毛片视频一区二区本码 | 久久99精品国产麻豆蜜芽 | 久久精品女人的天堂av | 久久精品国产精品国产精品污 | 国产成人无码专区 | 香港三级日本三级妇三级 | 久久婷婷五月综合色国产香蕉 | 欧美人与善在线com | 精品水蜜桃久久久久久久 | 无码毛片视频一区二区本码 | 日韩人妻无码中文字幕视频 | 又大又硬又爽免费视频 | 中文字幕人妻无码一区二区三区 | 97精品人妻一区二区三区香蕉 | 日韩精品无码一本二本三本色 | 无码吃奶揉捏奶头高潮视频 | 亚洲熟熟妇xxxx | 无码人妻久久一区二区三区不卡 | 精品一二三区久久aaa片 | 色偷偷人人澡人人爽人人模 | 中文字幕乱码人妻无码久久 | 男人和女人高潮免费网站 | 欧美国产日产一区二区 | 久久99精品久久久久久 | 思思久久99热只有频精品66 | 国产精品人人妻人人爽 | 精品国产一区二区三区四区 | 99国产精品白浆在线观看免费 | 麻豆人妻少妇精品无码专区 | 日欧一片内射va在线影院 | 秋霞成人午夜鲁丝一区二区三区 | 无码人妻av免费一区二区三区 | 亚洲成av人影院在线观看 | 久久久久久久女国产乱让韩 | 清纯唯美经典一区二区 | 国内少妇偷人精品视频免费 | 中文字幕av日韩精品一区二区 | 在线视频网站www色 | 亚洲综合另类小说色区 | 国产手机在线αⅴ片无码观看 | 亚洲乱码日产精品bd | 国产一区二区三区四区五区加勒比 | 国产精品无码一区二区三区不卡 | 亚洲男人av香蕉爽爽爽爽 | 欧美放荡的少妇 | 色综合天天综合狠狠爱 | 久久亚洲精品中文字幕无男同 | 国产精品久久久久久亚洲毛片 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲中文字幕无码一久久区 | 亚洲一区二区三区国产精华液 | 丝袜人妻一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 国产精品久久久午夜夜伦鲁鲁 | 暴力强奷在线播放无码 | 人人澡人摸人人添 | 中文字幕+乱码+中文字幕一区 | 男女作爱免费网站 | 中国大陆精品视频xxxx | 国产人妻精品午夜福利免费 | 久久成人a毛片免费观看网站 | 日韩亚洲欧美精品综合 | 国产精品久久久久久久影院 | 国产香蕉尹人视频在线 | 中文字幕日产无线码一区 | 亚洲小说春色综合另类 | 亚洲中文字幕久久无码 | 日本大香伊一区二区三区 | 欧洲vodafone精品性 | 天堂亚洲免费视频 | 亚洲成av人综合在线观看 | 无码成人精品区在线观看 | 麻豆精产国品 | 一本无码人妻在中文字幕免费 | 国产在线aaa片一区二区99 | 一本久久a久久精品亚洲 | 人妻与老人中文字幕 | 亚洲第一无码av无码专区 | av无码久久久久不卡免费网站 | 人人妻在人人 | 国产精品成人av在线观看 | 特黄特色大片免费播放器图片 | 亚洲男人av香蕉爽爽爽爽 | 亚洲男人av天堂午夜在 | 麻豆成人精品国产免费 | 国产亚洲精品久久久久久久久动漫 | 国产在线aaa片一区二区99 | 波多野结衣av在线观看 | 伊人久久大香线蕉av一区二区 | 国产内射爽爽大片视频社区在线 | 国产成人av免费观看 | 午夜嘿嘿嘿影院 | 三级4级全黄60分钟 | 欧美老熟妇乱xxxxx | 成人动漫在线观看 | 亚洲午夜无码久久 | 无码午夜成人1000部免费视频 | 亚洲色欲色欲欲www在线 | 丰满妇女强制高潮18xxxx | 国产乱码精品一品二品 | 丰满岳乱妇在线观看中字无码 | 午夜精品一区二区三区在线观看 | 一个人免费观看的www视频 | 1000部啪啪未满十八勿入下载 | 国产国产精品人在线视 | 久久久久99精品成人片 | 老子影院午夜精品无码 | 亚洲精品一区二区三区在线观看 | 日本乱人伦片中文三区 | 亚洲人成网站免费播放 | 天天爽夜夜爽夜夜爽 | 免费网站看v片在线18禁无码 | 大肉大捧一进一出视频出来呀 | 天天拍夜夜添久久精品大 | 欧美高清在线精品一区 | 草草网站影院白丝内射 | 日本一区二区三区免费播放 | 18精品久久久无码午夜福利 | 国精产品一区二区三区 | 亚洲s色大片在线观看 | 日韩精品无码一本二本三本色 | 国产高清av在线播放 | 乱人伦人妻中文字幕无码 | 婷婷五月综合缴情在线视频 | 欧美激情综合亚洲一二区 | 国产成人人人97超碰超爽8 | 国产另类ts人妖一区二区 | 欧美国产日产一区二区 | 久久伊人色av天堂九九小黄鸭 | 玩弄少妇高潮ⅹxxxyw | 蜜臀av无码人妻精品 | 窝窝午夜理论片影院 | 婷婷六月久久综合丁香 | 亚洲一区二区三区四区 | 丰满少妇熟乱xxxxx视频 | 色婷婷av一区二区三区之红樱桃 | 精品无码一区二区三区爱欲 | 国产亚洲tv在线观看 | 动漫av一区二区在线观看 | 性生交大片免费看女人按摩摩 | 久久99热只有频精品8 | 欧美人与物videos另类 | 高潮毛片无遮挡高清免费 | 性欧美牲交xxxxx视频 | aⅴ亚洲 日韩 色 图网站 播放 | 久久久久se色偷偷亚洲精品av | 精品国产乱码久久久久乱码 | 人妻少妇精品视频专区 | 俺去俺来也www色官网 | 四虎国产精品免费久久 | 国产精品毛片一区二区 | 欧美国产日韩亚洲中文 | 亚洲精品欧美二区三区中文字幕 | 中文字幕日产无线码一区 | 亚洲娇小与黑人巨大交 | 久久人人爽人人爽人人片ⅴ | 纯爱无遮挡h肉动漫在线播放 | 在线а√天堂中文官网 | 一本无码人妻在中文字幕免费 | 日本又色又爽又黄的a片18禁 | 亚洲日韩一区二区三区 | 兔费看少妇性l交大片免费 | www成人国产高清内射 | 九九综合va免费看 | 波多野结衣高清一区二区三区 | 久久亚洲精品中文字幕无男同 | 俄罗斯老熟妇色xxxx | 欧美喷潮久久久xxxxx | 1000部夫妻午夜免费 | 久久久无码中文字幕久... | 小sao货水好多真紧h无码视频 | 88国产精品欧美一区二区三区 | 国产精品99久久精品爆乳 | 狠狠色色综合网站 | 国产乡下妇女做爰 | 鲁大师影院在线观看 | 欧美老熟妇乱xxxxx | 色婷婷久久一区二区三区麻豆 | 精品久久久无码人妻字幂 | 国产九九九九九九九a片 | 国产精品第一区揄拍无码 | а天堂中文在线官网 | 欧美性生交xxxxx久久久 | 高潮毛片无遮挡高清免费 | 在线精品国产一区二区三区 | 国产美女精品一区二区三区 | 久久国语露脸国产精品电影 | 中文字幕无码视频专区 | 55夜色66夜色国产精品视频 | 强开小婷嫩苞又嫩又紧视频 | 亚洲精品午夜国产va久久成人 | 精品国产麻豆免费人成网站 | 波多野结衣高清一区二区三区 | 亚洲熟妇色xxxxx亚洲 | 日本乱人伦片中文三区 | 中文字幕无线码 | 国产午夜无码视频在线观看 | 成人精品视频一区二区三区尤物 | 青草青草久热国产精品 | 又色又爽又黄的美女裸体网站 | 人妻少妇被猛烈进入中文字幕 | 欧美色就是色 | 久久国产精品精品国产色婷婷 | 未满成年国产在线观看 | 98国产精品综合一区二区三区 | 欧美日本免费一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 久9re热视频这里只有精品 | 日韩人妻无码一区二区三区久久99 | 久久久久成人片免费观看蜜芽 | 自拍偷自拍亚洲精品被多人伦好爽 | 女人被爽到呻吟gif动态图视看 | 熟女俱乐部五十路六十路av | 国产香蕉尹人视频在线 | 免费人成在线视频无码 | 国产精品美女久久久久av爽李琼 | 亚洲精品成人福利网站 | 中文字幕av伊人av无码av | 亚洲呦女专区 | 2020久久超碰国产精品最新 | 在线精品亚洲一区二区 | 亚洲人成影院在线无码按摩店 | 樱花草在线社区www | 亚洲精品无码人妻无码 | 亚洲一区二区三区无码久久 | 无遮挡国产高潮视频免费观看 | 300部国产真实乱 | 国精品人妻无码一区二区三区蜜柚 | 国内精品一区二区三区不卡 | 激情五月综合色婷婷一区二区 | 精品成在人线av无码免费看 | 国产成人精品优优av | 人妻与老人中文字幕 | 免费中文字幕日韩欧美 | 国产人妻人伦精品1国产丝袜 | 女人被男人躁得好爽免费视频 | 久久人人爽人人爽人人片ⅴ | 无码av岛国片在线播放 | 久久久久成人片免费观看蜜芽 | 波多野结衣av在线观看 | 麻豆国产人妻欲求不满 | 国产亚洲精品久久久闺蜜 | 一本久道高清无码视频 | 中文无码精品a∨在线观看不卡 | 精品国产av色一区二区深夜久久 | 精品国产一区二区三区四区在线看 | 国产精品第一国产精品 | 国产偷抇久久精品a片69 | a片在线免费观看 | 思思久久99热只有频精品66 | 300部国产真实乱 | 国内精品一区二区三区不卡 | 欧美国产日韩亚洲中文 | 国产精品18久久久久久麻辣 | 欧美真人作爱免费视频 | 免费无码肉片在线观看 | 丁香花在线影院观看在线播放 | 两性色午夜视频免费播放 | 在线成人www免费观看视频 | 欧洲美熟女乱又伦 | 国产三级精品三级男人的天堂 | 美女极度色诱视频国产 | 无码乱肉视频免费大全合集 | 亚洲精品国产品国语在线观看 | 又大又硬又黄的免费视频 | 午夜丰满少妇性开放视频 | 岛国片人妻三上悠亚 | 内射后入在线观看一区 | 人妻无码αv中文字幕久久琪琪布 | 日韩精品乱码av一区二区 | 嫩b人妻精品一区二区三区 | 国产凸凹视频一区二区 | 日本乱偷人妻中文字幕 | 天堂无码人妻精品一区二区三区 | 亚洲乱码国产乱码精品精 | 精品国产一区av天美传媒 | 熟女俱乐部五十路六十路av | 色婷婷综合中文久久一本 | 丰满人妻翻云覆雨呻吟视频 | 久久精品国产一区二区三区 | 国产小呦泬泬99精品 | 天天燥日日燥 | 在线播放亚洲第一字幕 | 黑人大群体交免费视频 | 美女张开腿让人桶 | 中文字幕亚洲情99在线 | 国产激情无码一区二区app | 综合激情五月综合激情五月激情1 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 一个人免费观看的www视频 | 国产亚洲精品久久久闺蜜 | 人妻天天爽夜夜爽一区二区 | 亚洲精品美女久久久久久久 | 麻豆av传媒蜜桃天美传媒 | 妺妺窝人体色www婷婷 | 午夜不卡av免费 一本久久a久久精品vr综合 | 精品无码国产一区二区三区av | 性啪啪chinese东北女人 | 小sao货水好多真紧h无码视频 | 国内少妇偷人精品视频免费 | 98国产精品综合一区二区三区 | 国产午夜亚洲精品不卡下载 | 欧美真人作爱免费视频 | 国产凸凹视频一区二区 | 蜜桃视频韩日免费播放 | 国产网红无码精品视频 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲国产精华液网站w | 无码一区二区三区在线 | 久久精品国产99久久6动漫 | 国产婷婷色一区二区三区在线 | 亚洲中文字幕久久无码 | 国产精品无码一区二区三区不卡 | 国内精品九九久久久精品 | 国产无套内射久久久国产 | 国产成人无码a区在线观看视频app | 正在播放老肥熟妇露脸 | 亚洲成a人片在线观看无码 | 日韩人妻无码一区二区三区久久99 | 粉嫩少妇内射浓精videos | 日本一区二区三区免费播放 | 波多野结衣高清一区二区三区 | 成熟女人特级毛片www免费 | 97久久精品无码一区二区 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲第一网站男人都懂 | 国产无遮挡又黄又爽又色 | 亚洲国产欧美国产综合一区 | 99国产精品白浆在线观看免费 | 国产精品久久国产三级国 | 久久国语露脸国产精品电影 | 一二三四在线观看免费视频 | 国产av剧情md精品麻豆 | 99久久久国产精品无码免费 | 国产人妻精品午夜福利免费 | 天天躁夜夜躁狠狠是什么心态 | 亚洲精品一区三区三区在线观看 | 熟女体下毛毛黑森林 | 亚洲成av人综合在线观看 | 少妇无码av无码专区在线观看 | 国产精品怡红院永久免费 | 国产无套内射久久久国产 | 成人免费视频在线观看 | yw尤物av无码国产在线观看 | 丝袜人妻一区二区三区 | 欧美日韩综合一区二区三区 | 免费网站看v片在线18禁无码 | 国产成人综合色在线观看网站 | 久久精品国产日本波多野结衣 | 动漫av一区二区在线观看 | 纯爱无遮挡h肉动漫在线播放 | 日韩欧美中文字幕公布 | 少妇性荡欲午夜性开放视频剧场 | 国产在线精品一区二区三区直播 | 亚洲国产成人a精品不卡在线 | 十八禁视频网站在线观看 | 日韩人妻无码中文字幕视频 | 日韩精品a片一区二区三区妖精 | 熟女俱乐部五十路六十路av | 乱人伦中文视频在线观看 | 成人一在线视频日韩国产 | 欧美猛少妇色xxxxx | 在线观看国产一区二区三区 | 人人妻人人澡人人爽精品欧美 | 人人爽人人爽人人片av亚洲 | 国产精品视频免费播放 | 亚洲中文字幕va福利 | 国产精品久久久一区二区三区 | 欧美性猛交内射兽交老熟妇 | 亚洲精品一区二区三区在线观看 | 久久午夜无码鲁丝片午夜精品 | 久久久久成人片免费观看蜜芽 | 亚洲色欲色欲欲www在线 | 亚洲欧美精品伊人久久 | a在线观看免费网站大全 | 国产精品久久久久久无码 | 精品午夜福利在线观看 | 日韩人妻无码一区二区三区久久99 | 蜜桃臀无码内射一区二区三区 | 国产三级精品三级男人的天堂 | 国产精品久久久久无码av色戒 | 国产美女极度色诱视频www | 人人妻人人澡人人爽人人精品浪潮 | 精品亚洲韩国一区二区三区 | 爽爽影院免费观看 | 亚洲а∨天堂久久精品2021 | 亚洲区欧美区综合区自拍区 | 中文字幕亚洲情99在线 | 亚洲精品一区二区三区在线观看 | 国内丰满熟女出轨videos | 99riav国产精品视频 | 少妇高潮一区二区三区99 | 亚洲一区二区三区在线观看网站 | 亚洲色成人中文字幕网站 | 老司机亚洲精品影院 | 76少妇精品导航 | 无码av最新清无码专区吞精 | 欧美老妇与禽交 | 亚洲精品欧美二区三区中文字幕 | 初尝人妻少妇中文字幕 | 亚洲va欧美va天堂v国产综合 | 午夜福利电影 | 高潮毛片无遮挡高清免费视频 | 免费无码一区二区三区蜜桃大 | 熟女少妇人妻中文字幕 | 最新版天堂资源中文官网 | 国产无遮挡又黄又爽又色 | 无码人妻精品一区二区三区下载 | 欧美日本免费一区二区三区 | 暴力强奷在线播放无码 | 精品人妻中文字幕有码在线 | 亚洲国产av精品一区二区蜜芽 | 亚洲欧美日韩国产精品一区二区 | 国产在线aaa片一区二区99 | 狠狠噜狠狠狠狠丁香五月 | 波多野结衣高清一区二区三区 | 亚洲熟妇色xxxxx欧美老妇y | 蜜臀av无码人妻精品 | 欧美黑人乱大交 | 久久精品女人天堂av免费观看 | 亚洲性无码av中文字幕 | 日本熟妇人妻xxxxx人hd | 色诱久久久久综合网ywww | 动漫av一区二区在线观看 | 国产精品免费大片 | 夜精品a片一区二区三区无码白浆 | 亚洲乱码国产乱码精品精 | 十八禁真人啪啪免费网站 | 俺去俺来也在线www色官网 | 99精品久久毛片a片 | 人人爽人人澡人人高潮 | 亚洲人亚洲人成电影网站色 | 熟妇女人妻丰满少妇中文字幕 | 国内精品九九久久久精品 | 亚洲午夜福利在线观看 | 亚洲の无码国产の无码影院 | 又大又硬又爽免费视频 | 国产亚洲精品久久久ai换 | 成人无码影片精品久久久 | 国产精品亚洲一区二区三区喷水 | а√天堂www在线天堂小说 | 亚洲s码欧洲m码国产av | 未满小14洗澡无码视频网站 | 日本精品少妇一区二区三区 | 久久久久国色av免费观看性色 | 久久无码中文字幕免费影院蜜桃 | 成人片黄网站色大片免费观看 | 人妻无码久久精品人妻 | 国产两女互慰高潮视频在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产69精品久久久久app下载 | 国产精品va在线播放 | 日产精品高潮呻吟av久久 | 亚洲国产精品成人久久蜜臀 | 熟妇人妻无乱码中文字幕 | 好爽又高潮了毛片免费下载 | 亚洲日韩一区二区 | 亚洲日韩中文字幕在线播放 | 99er热精品视频 | 精品无码一区二区三区爱欲 | 欧美人与善在线com | 熟妇人妻无乱码中文字幕 | 国产亚洲人成在线播放 | 国产精品人妻一区二区三区四 | 日韩精品一区二区av在线 | 久久精品国产99精品亚洲 | 中文字幕乱码人妻二区三区 | 欧美老妇交乱视频在线观看 | 精品国产aⅴ无码一区二区 | 极品嫩模高潮叫床 | 2019nv天堂香蕉在线观看 | 性史性农村dvd毛片 | 88国产精品欧美一区二区三区 | 高潮喷水的毛片 | 男人的天堂av网站 | 久久亚洲精品成人无码 | 搡女人真爽免费视频大全 | 久久久久免费精品国产 | 夜夜躁日日躁狠狠久久av | 久久无码中文字幕免费影院蜜桃 | 四虎影视成人永久免费观看视频 | 日日碰狠狠躁久久躁蜜桃 | 真人与拘做受免费视频一 | 亚洲精品一区二区三区大桥未久 | 国产精品人人妻人人爽 | 久久zyz资源站无码中文动漫 | 乱中年女人伦av三区 | 久久国产精品精品国产色婷婷 | 水蜜桃亚洲一二三四在线 | 亚洲精品一区二区三区四区五区 | 欧美大屁股xxxxhd黑色 | 九月婷婷人人澡人人添人人爽 | 欧美 日韩 亚洲 在线 | 野狼第一精品社区 | 久久精品国产99精品亚洲 | 精品无码成人片一区二区98 | 国产亚洲视频中文字幕97精品 | 狠狠色噜噜狠狠狠7777奇米 | 精品无码av一区二区三区 | 性欧美牲交xxxxx视频 | 精品国偷自产在线 | 亚洲精品久久久久久一区二区 | 欧美性猛交xxxx富婆 | 国产激情艳情在线看视频 | www国产精品内射老师 | 少妇被黑人到高潮喷出白浆 | 欧美人与善在线com | 无码国产激情在线观看 | 亚洲国产午夜精品理论片 | 国产精品办公室沙发 | 搡女人真爽免费视频大全 | 正在播放东北夫妻内射 | 美女极度色诱视频国产 | 久久久精品欧美一区二区免费 | 亚洲人亚洲人成电影网站色 | 国内精品久久毛片一区二区 | 日日天干夜夜狠狠爱 | 中文字幕无码日韩欧毛 | 日本精品久久久久中文字幕 | 久久综合给合久久狠狠狠97色 | 欧美黑人性暴力猛交喷水 | 精品国偷自产在线视频 | 国产内射老熟女aaaa | 国产免费久久久久久无码 | 伦伦影院午夜理论片 | 在线观看国产午夜福利片 | 色综合久久中文娱乐网 | 欧美第一黄网免费网站 | 综合激情五月综合激情五月激情1 | 丁香啪啪综合成人亚洲 | 亚洲欧美国产精品久久 | 夜精品a片一区二区三区无码白浆 | 无码午夜成人1000部免费视频 | 西西人体www44rt大胆高清 | 国产精品爱久久久久久久 | 欧美性生交xxxxx久久久 | 亚洲国产成人av在线观看 | 国产精品无套呻吟在线 | 欧美精品一区二区精品久久 | 欧美 亚洲 国产 另类 | 97夜夜澡人人爽人人喊中国片 | 亚洲 欧美 激情 小说 另类 | 好男人www社区 | 对白脏话肉麻粗话av | 人妻夜夜爽天天爽三区 | 成人毛片一区二区 | 76少妇精品导航 | 伊人色综合久久天天小片 | 学生妹亚洲一区二区 | 国产精品二区一区二区aⅴ污介绍 | 国产激情艳情在线看视频 | 国内精品一区二区三区不卡 | 欧美freesex黑人又粗又大 | 亚洲国产成人a精品不卡在线 | 亚洲中文字幕无码中文字在线 | 无码国内精品人妻少妇 | 午夜性刺激在线视频免费 | 亚洲 另类 在线 欧美 制服 | 色噜噜亚洲男人的天堂 | 国产高潮视频在线观看 | 亚洲中文字幕av在天堂 | 小鲜肉自慰网站xnxx | 亚洲国产欧美国产综合一区 | 性欧美牲交xxxxx视频 | 欧美日韩人成综合在线播放 | 乱码午夜-极国产极内射 | 欧美日韩在线亚洲综合国产人 | 精品国偷自产在线 | 在教室伦流澡到高潮hnp视频 | 国产精品嫩草久久久久 | 久久99国产综合精品 | 国产成人综合美国十次 | 精品久久8x国产免费观看 | 国产97人人超碰caoprom | 99精品视频在线观看免费 | 中文字幕 人妻熟女 | 99久久精品无码一区二区毛片 | 蜜桃av抽搐高潮一区二区 | 国产精品资源一区二区 | 97无码免费人妻超级碰碰夜夜 | 少妇人妻大乳在线视频 | 国产 浪潮av性色四虎 | a在线亚洲男人的天堂 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产在线精品一区二区三区直播 | 少妇无码一区二区二三区 | 中文字幕无码av波多野吉衣 | 成年女人永久免费看片 | 少妇被黑人到高潮喷出白浆 | 女人和拘做爰正片视频 | 老司机亚洲精品影院 | 67194成是人免费无码 | 国产一区二区不卡老阿姨 | 日本欧美一区二区三区乱码 | 国内精品人妻无码久久久影院蜜桃 | 天天爽夜夜爽夜夜爽 | 国产精品第一国产精品 | 成人aaa片一区国产精品 | 国产人妻精品午夜福利免费 | 两性色午夜免费视频 | 国产舌乚八伦偷品w中 | 亚洲精品久久久久久一区二区 | 漂亮人妻洗澡被公强 日日躁 | 麻豆国产人妻欲求不满谁演的 | 日韩精品a片一区二区三区妖精 | 精品国产一区二区三区四区 | 色情久久久av熟女人妻网站 | 中文字幕中文有码在线 | 国产欧美亚洲精品a | 国产成人精品久久亚洲高清不卡 | 久久久精品欧美一区二区免费 | 成人免费视频视频在线观看 免费 | 双乳奶水饱满少妇呻吟 | 亚洲国精产品一二二线 | 亚洲大尺度无码无码专区 | 天天摸天天透天天添 | 国精品人妻无码一区二区三区蜜柚 | 久久综合九色综合欧美狠狠 | 国产午夜亚洲精品不卡下载 | 九九综合va免费看 | 人人澡人人透人人爽 | 国产一区二区不卡老阿姨 | av在线亚洲欧洲日产一区二区 | 亚洲综合久久一区二区 | 欧美丰满老熟妇xxxxx性 | av小次郎收藏 | 一本色道久久综合狠狠躁 | 欧美性生交xxxxx久久久 | 久久精品人人做人人综合 | 99精品视频在线观看免费 | 久久视频在线观看精品 | 妺妺窝人体色www婷婷 | 中文字幕av无码一区二区三区电影 | 婷婷丁香五月天综合东京热 | 午夜成人1000部免费视频 | 国产精品亚洲综合色区韩国 | 中国女人内谢69xxxxxa片 | 色婷婷av一区二区三区之红樱桃 | 国产精品-区区久久久狼 | 丝袜美腿亚洲一区二区 | 国产凸凹视频一区二区 | 国产av无码专区亚洲a∨毛片 | 久久国产劲爆∧v内射 | 乱中年女人伦av三区 | 亚洲 激情 小说 另类 欧美 | 久久久亚洲欧洲日产国码αv | 性欧美牲交在线视频 | 狠狠躁日日躁夜夜躁2020 | 黑人大群体交免费视频 | 久久99精品久久久久久 | 老太婆性杂交欧美肥老太 | 欧美一区二区三区视频在线观看 | 国产av一区二区精品久久凹凸 | 无码人妻丰满熟妇区五十路百度 | 精品国产aⅴ无码一区二区 | 老子影院午夜精品无码 | 亚洲精品一区二区三区在线 | 亚洲精品欧美二区三区中文字幕 | 国产精品嫩草久久久久 | 精品国产一区二区三区av 性色 | 人妻少妇精品无码专区动漫 | 嫩b人妻精品一区二区三区 | 精品欧洲av无码一区二区三区 | v一区无码内射国产 | 人人妻人人藻人人爽欧美一区 | 一个人看的www免费视频在线观看 | 成人精品视频一区二区 | 伊人久久大香线蕉av一区二区 | 自拍偷自拍亚洲精品10p | 未满小14洗澡无码视频网站 | 无码纯肉视频在线观看 | 少妇久久久久久人妻无码 | 无遮挡国产高潮视频免费观看 | 无遮无挡爽爽免费视频 | 内射白嫩少妇超碰 | 色噜噜亚洲男人的天堂 | 日韩亚洲欧美精品综合 | 国产午夜手机精彩视频 | 成人欧美一区二区三区 | 性生交片免费无码看人 | 国产成人精品久久亚洲高清不卡 | 蜜桃无码一区二区三区 | 欧美老妇与禽交 | 亚洲精品午夜国产va久久成人 | 娇妻被黑人粗大高潮白浆 | 免费乱码人妻系列无码专区 | 99久久精品国产一区二区蜜芽 | 亚洲另类伦春色综合小说 | 国产性生大片免费观看性 | 一本一道久久综合久久 | 日本精品久久久久中文字幕 | 国产精品亚洲一区二区三区喷水 | 两性色午夜免费视频 | 欧美性黑人极品hd | 欧美自拍另类欧美综合图片区 | 人人爽人人爽人人片av亚洲 | 少妇太爽了在线观看 | 欧美阿v高清资源不卡在线播放 | 牛和人交xxxx欧美 | 永久免费观看美女裸体的网站 | 国产精品亚洲一区二区三区喷水 | 午夜丰满少妇性开放视频 | 中文字幕亚洲情99在线 | 成年美女黄网站色大免费全看 | 帮老师解开蕾丝奶罩吸乳网站 | 国产午夜无码精品免费看 | 色欲人妻aaaaaaa无码 | 国产激情无码一区二区 | 窝窝午夜理论片影院 | 领导边摸边吃奶边做爽在线观看 | 欧美真人作爱免费视频 | 国产va免费精品观看 | 国产成人无码a区在线观看视频app | 荡女精品导航 | 扒开双腿疯狂进出爽爽爽视频 | 成人毛片一区二区 | 小鲜肉自慰网站xnxx | 国产精品久久久久无码av色戒 | 玩弄少妇高潮ⅹxxxyw | a片在线免费观看 | 欧美 亚洲 国产 另类 | 亚洲gv猛男gv无码男同 | 亚洲大尺度无码无码专区 | 麻豆国产丝袜白领秘书在线观看 | 日本一卡二卡不卡视频查询 | 伊在人天堂亚洲香蕉精品区 | 国产97在线 | 亚洲 | 草草网站影院白丝内射 | 国内精品一区二区三区不卡 | 99久久亚洲精品无码毛片 | 欧美黑人性暴力猛交喷水 | 狠狠色丁香久久婷婷综合五月 | 国产精品第一国产精品 | 欧美三级a做爰在线观看 | 丰满人妻被黑人猛烈进入 | 欧美 亚洲 国产 另类 | 人妻与老人中文字幕 | 九月婷婷人人澡人人添人人爽 | 熟妇人妻中文av无码 | 久久久国产一区二区三区 | 国产一精品一av一免费 | 亚洲成在人网站无码天堂 | a片免费视频在线观看 | 国产精品va在线观看无码 | 中文字幕乱码人妻无码久久 | 成人影院yy111111在线观看 | 国产午夜视频在线观看 | 精品久久综合1区2区3区激情 | 丰满少妇熟乱xxxxx视频 | 成人无码精品1区2区3区免费看 | 久久精品人人做人人综合试看 | 中文字幕+乱码+中文字幕一区 | 又黄又爽又色的视频 | 久久无码人妻影院 | √8天堂资源地址中文在线 | 伊在人天堂亚洲香蕉精品区 | 午夜福利试看120秒体验区 | 欧美日韩综合一区二区三区 | 精品久久8x国产免费观看 | 牲交欧美兽交欧美 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产真实伦对白全集 | 国产亚洲欧美在线专区 | 亚洲综合无码一区二区三区 | 中文字幕乱妇无码av在线 | 成在人线av无码免观看麻豆 | 国产人成高清在线视频99最全资源 | 日韩欧美中文字幕公布 | 国产精品va在线观看无码 | 国产办公室秘书无码精品99 | 国产精品人人爽人人做我的可爱 | 桃花色综合影院 | 曰本女人与公拘交酡免费视频 | 亚洲中文字幕av在天堂 | 久久久久99精品成人片 | 无遮无挡爽爽免费视频 | 国产亚洲精品久久久闺蜜 | 狂野欧美激情性xxxx | 国产精品美女久久久网av | 成人精品视频一区二区 | 亚洲一区二区三区 | 久久久久久国产精品无码下载 | 四虎4hu永久免费 | 日韩精品久久久肉伦网站 | 精品无码一区二区三区爱欲 | 欧美日韩一区二区综合 | 亚洲成a人一区二区三区 | 18禁黄网站男男禁片免费观看 | 国产明星裸体无码xxxx视频 | 国产精品丝袜黑色高跟鞋 | 水蜜桃亚洲一二三四在线 | 激情爆乳一区二区三区 | 欧美亚洲国产一区二区三区 | 无码人妻精品一区二区三区下载 | 在教室伦流澡到高潮hnp视频 | 中文字幕无码视频专区 | 国产精品人妻一区二区三区四 | 国产精品多人p群无码 | 久久久久免费看成人影片 | 久久久婷婷五月亚洲97号色 | 伦伦影院午夜理论片 | 亚洲一区二区三区在线观看网站 | 国内揄拍国内精品少妇国语 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲欧美综合区丁香五月小说 | 免费观看又污又黄的网站 | 国产真实乱对白精彩久久 | 东京热无码av男人的天堂 | 欧美三级a做爰在线观看 | 奇米影视7777久久精品人人爽 | 色婷婷综合中文久久一本 | 国产色视频一区二区三区 | 东京热男人av天堂 | 在线天堂新版最新版在线8 | 全黄性性激高免费视频 | 亚洲精品久久久久久一区二区 | 国内揄拍国内精品少妇国语 | 中文字幕中文有码在线 | 九九久久精品国产免费看小说 | 精品国偷自产在线 | 午夜精品一区二区三区的区别 | 亚洲乱码中文字幕在线 | 精品无码一区二区三区的天堂 | 亚洲の无码国产の无码步美 | 国内少妇偷人精品视频免费 | 人妻插b视频一区二区三区 | 国色天香社区在线视频 | 亚洲成av人影院在线观看 | 亚洲精品中文字幕 | 国产av剧情md精品麻豆 | 少妇激情av一区二区 | 人人妻人人澡人人爽欧美一区九九 | 51国偷自产一区二区三区 | 狂野欧美性猛交免费视频 | 久久午夜无码鲁丝片 | 中文精品无码中文字幕无码专区 | 超碰97人人做人人爱少妇 | 亚洲中文字幕成人无码 | 亚洲日韩精品欧美一区二区 | 欧美国产亚洲日韩在线二区 | 麻豆国产丝袜白领秘书在线观看 | 成人精品视频一区二区三区尤物 | 无码乱肉视频免费大全合集 | 成人毛片一区二区 | 色五月丁香五月综合五月 | 午夜福利电影 | 日韩精品成人一区二区三区 | 西西人体www44rt大胆高清 | 国产色xx群视频射精 | 亚洲精品一区二区三区大桥未久 | 欧美日韩久久久精品a片 | 玩弄中年熟妇正在播放 | 国产人妻精品午夜福利免费 | 欧美丰满少妇xxxx性 | 国产特级毛片aaaaaaa高清 | 国产免费观看黄av片 | 久久国产36精品色熟妇 | 久久久精品国产sm最大网站 | 欧美人与动性行为视频 | 国产精品久久久久久亚洲毛片 | 国产亲子乱弄免费视频 | 无码av最新清无码专区吞精 | 国产无遮挡又黄又爽又色 | 两性色午夜视频免费播放 | 女人高潮内射99精品 | 亚洲国产欧美国产综合一区 | 久久精品中文字幕大胸 | 18禁黄网站男男禁片免费观看 | 天天av天天av天天透 | 久久久www成人免费毛片 | 正在播放东北夫妻内射 | 亚洲一区二区三区香蕉 | 免费乱码人妻系列无码专区 | 久久天天躁狠狠躁夜夜免费观看 | 天天综合网天天综合色 | 国产舌乚八伦偷品w中 | 色综合久久久无码网中文 | 国产人妖乱国产精品人妖 | 精品熟女少妇av免费观看 | 久久午夜无码鲁丝片午夜精品 | 色综合久久久无码中文字幕 | 人妻体内射精一区二区三四 | 欧美阿v高清资源不卡在线播放 | 亚洲第一网站男人都懂 | 久久精品人妻少妇一区二区三区 | 亚洲精品中文字幕久久久久 | 欧美午夜特黄aaaaaa片 | 一本大道伊人av久久综合 | 国产xxx69麻豆国语对白 | 国内综合精品午夜久久资源 | 国产精品人人妻人人爽 | 久久精品国产一区二区三区 | 欧美熟妇另类久久久久久不卡 | 国产超级va在线观看视频 | 欧美熟妇另类久久久久久不卡 | 日本免费一区二区三区最新 | 无码精品人妻一区二区三区av | 国产三级精品三级男人的天堂 | 亚洲男人av天堂午夜在 | 精品国产av色一区二区深夜久久 | 久久精品人妻少妇一区二区三区 | 玩弄人妻少妇500系列视频 | 亚洲日韩av一区二区三区四区 | 欧美老熟妇乱xxxxx | 奇米影视888欧美在线观看 | 国产精品永久免费视频 | 中文字幕乱码亚洲无线三区 | 国产黄在线观看免费观看不卡 | 亚洲国产午夜精品理论片 | 成 人 网 站国产免费观看 | 午夜无码区在线观看 | 欧美喷潮久久久xxxxx | 国产精品无码永久免费888 | 日本高清一区免费中文视频 | 国产精品亚洲а∨无码播放麻豆 | 色偷偷人人澡人人爽人人模 | 97夜夜澡人人爽人人喊中国片 | 乱码午夜-极国产极内射 | 日本在线高清不卡免费播放 | 国产suv精品一区二区五 | 东京一本一道一二三区 | 人人妻人人澡人人爽精品欧美 | 国内揄拍国内精品人妻 | 中文字幕色婷婷在线视频 | 内射巨臀欧美在线视频 | 久久午夜夜伦鲁鲁片无码免费 | 午夜福利电影 | 亚洲精品久久久久avwww潮水 | 国产 浪潮av性色四虎 | 亚洲日本一区二区三区在线 | 澳门永久av免费网站 | 夫妻免费无码v看片 | 欧洲欧美人成视频在线 | 日本一区二区三区免费播放 | 无码人妻黑人中文字幕 | 久久综合给久久狠狠97色 | 国产精华av午夜在线观看 | 国产成人精品一区二区在线小狼 | 伊在人天堂亚洲香蕉精品区 | 国产精品va在线观看无码 | 久久精品人人做人人综合 | 中文亚洲成a人片在线观看 | 免费无码一区二区三区蜜桃大 | 少妇性荡欲午夜性开放视频剧场 | 国产另类ts人妖一区二区 | 99riav国产精品视频 | 男人的天堂2018无码 | 欧美放荡的少妇 | 夜夜影院未满十八勿进 | 亚洲日韩中文字幕在线播放 | 精品人妻人人做人人爽夜夜爽 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲色欲久久久综合网东京热 | 男女超爽视频免费播放 | 欧美老熟妇乱xxxxx | 女人被爽到呻吟gif动态图视看 | 国产精品美女久久久久av爽李琼 | 亚洲天堂2017无码中文 | 免费乱码人妻系列无码专区 | 成人免费视频在线观看 | 伊在人天堂亚洲香蕉精品区 | 色欲av亚洲一区无码少妇 | 综合激情五月综合激情五月激情1 | 无码乱肉视频免费大全合集 | 图片小说视频一区二区 | 少妇愉情理伦片bd | 狠狠色丁香久久婷婷综合五月 | 精品少妇爆乳无码av无码专区 | 伦伦影院午夜理论片 | 精品偷自拍另类在线观看 | 精品久久8x国产免费观看 | 中文字幕无码av激情不卡 | 天堂无码人妻精品一区二区三区 | 97久久超碰中文字幕 | 亚洲日韩精品欧美一区二区 | 无码人妻丰满熟妇区五十路百度 | 国产69精品久久久久app下载 | 2020久久超碰国产精品最新 | 综合网日日天干夜夜久久 | 国产97人人超碰caoprom | 国产97在线 | 亚洲 | 久久精品国产亚洲精品 | 精品水蜜桃久久久久久久 | 久久精品99久久香蕉国产色戒 | 性做久久久久久久免费看 | 国产精品第一国产精品 | 亚洲精品综合五月久久小说 | 久久国产精品偷任你爽任你 | 中文字幕乱码中文乱码51精品 | 51国偷自产一区二区三区 | 亚洲爆乳精品无码一区二区三区 | 天天摸天天透天天添 | 国产福利视频一区二区 | 老熟妇仑乱视频一区二区 | 在线а√天堂中文官网 | 色五月丁香五月综合五月 | 久久人人爽人人人人片 | 欧美一区二区三区视频在线观看 | 国语自产偷拍精品视频偷 | 99久久婷婷国产综合精品青草免费 | 亚洲区小说区激情区图片区 | 丰满少妇女裸体bbw | 女人高潮内射99精品 | 国产在线精品一区二区三区直播 | 草草网站影院白丝内射 | 久久久久亚洲精品中文字幕 | 欧美成人高清在线播放 | 亚洲无人区一区二区三区 | 久久久久人妻一区精品色欧美 | 精品无码成人片一区二区98 | 午夜理论片yy44880影院 | 激情国产av做激情国产爱 | 亚洲精品中文字幕久久久久 | 日日摸日日碰夜夜爽av | 99er热精品视频 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲午夜福利在线观看 | 久久久久国色av免费观看性色 | 国产真人无遮挡作爱免费视频 | 波多野结衣一区二区三区av免费 | 搡女人真爽免费视频大全 | 亚洲爆乳无码专区 | 自拍偷自拍亚洲精品被多人伦好爽 | 无码毛片视频一区二区本码 | 97se亚洲精品一区 | 四虎国产精品一区二区 | 亚洲人成影院在线观看 | 搡女人真爽免费视频大全 | а√资源新版在线天堂 | 欧美老人巨大xxxx做受 | 十八禁真人啪啪免费网站 | 欧美日韩综合一区二区三区 | 久青草影院在线观看国产 | 亚洲一区二区三区在线观看网站 | 色欲av亚洲一区无码少妇 | 高清国产亚洲精品自在久久 | 美女毛片一区二区三区四区 | 综合激情五月综合激情五月激情1 | 国产亚洲精品久久久闺蜜 | 99麻豆久久久国产精品免费 | 国语自产偷拍精品视频偷 | 色老头在线一区二区三区 | 久久久无码中文字幕久... | 欧美怡红院免费全部视频 | 久久久精品人妻久久影视 | 国产亚洲精品久久久久久久久动漫 | 国内精品人妻无码久久久影院蜜桃 | 国产精品多人p群无码 | 中文字幕亚洲情99在线 | 国产av久久久久精东av | 国色天香社区在线视频 | 久久99热只有频精品8 | 欧美zoozzooz性欧美 | 久久久久久久久蜜桃 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲精品美女久久久久久久 | 两性色午夜视频免费播放 | 久久精品国产一区二区三区 | 国产网红无码精品视频 | 久久99精品国产.久久久久 | 强开小婷嫩苞又嫩又紧视频 | 98国产精品综合一区二区三区 | 3d动漫精品啪啪一区二区中 | аⅴ资源天堂资源库在线 | www一区二区www免费 | 全黄性性激高免费视频 | 亚洲精品午夜无码电影网 | 亚洲乱亚洲乱妇50p | 熟妇人妻无码xxx视频 | 亚洲区欧美区综合区自拍区 | 日韩少妇内射免费播放 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产熟妇另类久久久久 | 亚洲男人av天堂午夜在 | 久久视频在线观看精品 | 18禁黄网站男男禁片免费观看 | 97夜夜澡人人爽人人喊中国片 | 成在人线av无码免观看麻豆 | 99久久婷婷国产综合精品青草免费 | av香港经典三级级 在线 | 日日天日日夜日日摸 | 激情综合激情五月俺也去 | 亚洲成av人片在线观看无码不卡 | 欧美35页视频在线观看 | 日日碰狠狠丁香久燥 | 成人一在线视频日韩国产 | 无码一区二区三区在线观看 | 久久亚洲中文字幕精品一区 | 窝窝午夜理论片影院 | 99久久久无码国产aaa精品 | 免费观看激色视频网站 | 老熟女乱子伦 | 老头边吃奶边弄进去呻吟 | 中文字幕无码免费久久9一区9 | 2020久久超碰国产精品最新 | 日韩精品无码一本二本三本色 | 国产亚洲视频中文字幕97精品 | 粉嫩少妇内射浓精videos | 日韩精品无码免费一区二区三区 | 76少妇精品导航 | 久久久精品成人免费观看 | 最近中文2019字幕第二页 | 国产三级久久久精品麻豆三级 | 少妇性俱乐部纵欲狂欢电影 | 任你躁在线精品免费 | 天天燥日日燥 | 日本护士毛茸茸高潮 | 激情人妻另类人妻伦 | 鲁鲁鲁爽爽爽在线视频观看 | 国产乱人伦偷精品视频 | 欧美日韩精品 | 久久综合久久自在自线精品自 | 亚洲gv猛男gv无码男同 | 亚洲天堂2017无码中文 | а√天堂www在线天堂小说 | 国产成人无码区免费内射一片色欲 | 无码中文字幕色专区 | 99精品无人区乱码1区2区3区 | 熟女少妇人妻中文字幕 | 中文亚洲成a人片在线观看 | av人摸人人人澡人人超碰下载 | 天堂久久天堂av色综合 | 中国大陆精品视频xxxx | 四虎永久在线精品免费网址 | 99国产欧美久久久精品 | 国产99久久精品一区二区 | 国产两女互慰高潮视频在线观看 | 久久无码中文字幕免费影院蜜桃 | 99久久精品日本一区二区免费 | 久久久久久a亚洲欧洲av冫 | 女人高潮内射99精品 | 亚洲精品午夜国产va久久成人 | 免费网站看v片在线18禁无码 | 国产色精品久久人妻 | 久久久久成人片免费观看蜜芽 | 亚洲成av人在线观看网址 | 人人澡人人透人人爽 | 无码人妻av免费一区二区三区 | 国产亚洲精品久久久久久国模美 | 捆绑白丝粉色jk震动捧喷白浆 | 国色天香社区在线视频 | 伊在人天堂亚洲香蕉精品区 | 青春草在线视频免费观看 | 久久亚洲a片com人成 | 99久久精品日本一区二区免费 | 色情久久久av熟女人妻网站 | 夫妻免费无码v看片 | 一本大道久久东京热无码av | 乱中年女人伦av三区 | 正在播放老肥熟妇露脸 | 精品午夜福利在线观看 | 久久精品视频在线看15 | 精品国偷自产在线视频 | 日日天干夜夜狠狠爱 | 国内少妇偷人精品视频免费 | 午夜免费福利小电影 | 久久久久亚洲精品男人的天堂 | 天堂在线观看www | 中文字幕无码乱人伦 | 纯爱无遮挡h肉动漫在线播放 | 国产精品久久久一区二区三区 | 成人综合网亚洲伊人 | 成人精品视频一区二区三区尤物 | 久久久精品欧美一区二区免费 | 久久99精品国产麻豆 | 一本大道久久东京热无码av | 久久精品女人天堂av免费观看 | 国产又爽又黄又刺激的视频 | 欧洲vodafone精品性 | 乌克兰少妇xxxx做受 | 国产肉丝袜在线观看 | 玩弄少妇高潮ⅹxxxyw | 亚洲精品一区二区三区大桥未久 | 蜜桃av抽搐高潮一区二区 | 色综合久久久无码中文字幕 | 波多野结衣乳巨码无在线观看 | 精品人妻中文字幕有码在线 | 亚洲第一无码av无码专区 | 欧美真人作爱免费视频 | 青青草原综合久久大伊人精品 | 无码av岛国片在线播放 | 亚洲伊人久久精品影院 | 极品尤物被啪到呻吟喷水 | www国产亚洲精品久久久日本 | 精品一二三区久久aaa片 | 7777奇米四色成人眼影 | 国产又爽又黄又刺激的视频 | 国产精品亚洲专区无码不卡 | 成在人线av无码免观看麻豆 | 真人与拘做受免费视频 | 熟妇人妻无乱码中文字幕 | 黑森林福利视频导航 | 亚洲国产精品一区二区第一页 | 精品人人妻人人澡人人爽人人 | 一本一道久久综合久久 | 装睡被陌生人摸出水好爽 | 18禁止看的免费污网站 | aa片在线观看视频在线播放 | 国产亚洲精品久久久ai换 | 高清国产亚洲精品自在久久 | 久久99热只有频精品8 | 久久综合狠狠综合久久综合88 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲综合久久一区二区 | 免费国产成人高清在线观看网站 | 色婷婷综合激情综在线播放 | 99在线 | 亚洲 | 亚洲春色在线视频 | 久久综合激激的五月天 | 国产精品理论片在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 国产超级va在线观看视频 | 国产成人综合在线女婷五月99播放 | 亚洲 a v无 码免 费 成 人 a v | 天天躁日日躁狠狠躁免费麻豆 | 激情五月综合色婷婷一区二区 | 曰韩无码二三区中文字幕 | 色婷婷欧美在线播放内射 | 国产激情无码一区二区 | 国产女主播喷水视频在线观看 | 国产手机在线αⅴ片无码观看 | 天天躁日日躁狠狠躁免费麻豆 | 欧美国产日韩久久mv | 小sao货水好多真紧h无码视频 | 成人精品视频一区二区三区尤物 | 欧美人与动性行为视频 | 国产97人人超碰caoprom | 人人爽人人澡人人人妻 | 中文无码伦av中文字幕 | 亚洲日韩一区二区三区 | 国产精品理论片在线观看 | 成人试看120秒体验区 | 欧美三级不卡在线观看 | 香蕉久久久久久av成人 | 午夜嘿嘿嘿影院 | 强伦人妻一区二区三区视频18 | 久久无码专区国产精品s | 亚洲一区二区三区在线观看网站 | 人人澡人人透人人爽 | 亚洲色大成网站www | av无码久久久久不卡免费网站 | 国产精品久久精品三级 | 国产午夜视频在线观看 | 少妇愉情理伦片bd | 国产精品人妻一区二区三区四 | 亚洲中文字幕va福利 | 少妇无码一区二区二三区 | 欧美国产日产一区二区 | 无码人妻出轨黑人中文字幕 | 亚洲成在人网站无码天堂 | 国产人妻精品午夜福利免费 | 骚片av蜜桃精品一区 | 亚洲一区二区三区 | 日产精品99久久久久久 | 99久久精品日本一区二区免费 | 久久久久成人片免费观看蜜芽 | 巨爆乳无码视频在线观看 | 久热国产vs视频在线观看 | 无码av免费一区二区三区试看 | 成 人影片 免费观看 | 久久久久成人片免费观看蜜芽 | 亚洲国产av精品一区二区蜜芽 | 人人澡人人妻人人爽人人蜜桃 | 欧美成人免费全部网站 | 亚洲男人av天堂午夜在 | 天干天干啦夜天干天2017 | 无码国产色欲xxxxx视频 | 少女韩国电视剧在线观看完整 | 熟妇女人妻丰满少妇中文字幕 | 亚洲国产精品久久久久久 | 日日天干夜夜狠狠爱 | 人人澡人人透人人爽 | 青青久在线视频免费观看 | 玩弄少妇高潮ⅹxxxyw | 国产suv精品一区二区五 | 久久精品中文闷骚内射 | 久久精品国产大片免费观看 | 国产精品久久久久影院嫩草 | 国产亚洲精品久久久久久 | 亚洲一区二区三区在线观看网站 | 亚洲精品久久久久avwww潮水 | 精品欧洲av无码一区二区三区 | 内射巨臀欧美在线视频 | 精品久久综合1区2区3区激情 | 中文字幕日韩精品一区二区三区 | 搡女人真爽免费视频大全 | 欧美日本精品一区二区三区 | 性欧美大战久久久久久久 | 亚洲精品国产第一综合99久久 | 亚洲中文字幕乱码av波多ji | 性色欲网站人妻丰满中文久久不卡 | 人妻人人添人妻人人爱 | 色综合天天综合狠狠爱 | 久久久精品人妻久久影视 | 亚洲国产高清在线观看视频 | 久久国产36精品色熟妇 | 精品一二三区久久aaa片 | 精品久久久久香蕉网 | 国产精品igao视频网 | 精品人妻av区 | 97夜夜澡人人双人人人喊 | 女人被男人爽到呻吟的视频 | 粗大的内捧猛烈进出视频 | 免费人成在线视频无码 | 国精产品一品二品国精品69xx | aa片在线观看视频在线播放 | 亚洲欧美国产精品专区久久 | 国产精品毛多多水多 | 国产在线一区二区三区四区五区 | 国产福利视频一区二区 | 午夜精品一区二区三区在线观看 | 天天躁夜夜躁狠狠是什么心态 | √天堂中文官网8在线 | 噜噜噜亚洲色成人网站 | 人人妻人人澡人人爽欧美一区九九 | 成人无码精品一区二区三区 | 国产无av码在线观看 | 97夜夜澡人人爽人人喊中国片 | 亚洲中文字幕无码中文字在线 | 亚洲欧美日韩综合久久久 | 全黄性性激高免费视频 | 国产午夜无码精品免费看 | 午夜精品久久久内射近拍高清 | 夜夜夜高潮夜夜爽夜夜爰爰 | 日韩精品无码一区二区中文字幕 | 极品嫩模高潮叫床 | 国产精华av午夜在线观看 | 麻豆蜜桃av蜜臀av色欲av | 日本大乳高潮视频在线观看 | 好屌草这里只有精品 | v一区无码内射国产 | 久久久www成人免费毛片 | 精品夜夜澡人妻无码av蜜桃 | 国产高清不卡无码视频 | 狠狠综合久久久久综合网 | 久久99久久99精品中文字幕 | 无码av免费一区二区三区试看 | 中文字幕av日韩精品一区二区 | 日日橹狠狠爱欧美视频 | 97资源共享在线视频 | 国产精华av午夜在线观看 | 日韩成人一区二区三区在线观看 | 成人女人看片免费视频放人 | 国产精品国产自线拍免费软件 | 久久久国产精品无码免费专区 | 18无码粉嫩小泬无套在线观看 | 色妞www精品免费视频 | 久久精品人人做人人综合试看 | 人人妻人人澡人人爽人人精品 | 欧洲vodafone精品性 | 麻豆国产人妻欲求不满谁演的 | 97se亚洲精品一区 | 精品午夜福利在线观看 | 蜜桃视频插满18在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 四十如虎的丰满熟妇啪啪 | 亚洲中文字幕无码中文字在线 | 5858s亚洲色大成网站www | 狠狠色欧美亚洲狠狠色www | 无码人妻久久一区二区三区不卡 | 久久五月精品中文字幕 | 亚洲成熟女人毛毛耸耸多 | 人人爽人人澡人人人妻 | 欧美兽交xxxx×视频 | 青草视频在线播放 | 亚洲精品国产第一综合99久久 | 小泽玛莉亚一区二区视频在线 | 天天拍夜夜添久久精品 | 亚洲成色www久久网站 | 樱花草在线播放免费中文 | 台湾无码一区二区 | 无码一区二区三区在线观看 | 亚洲精品一区二区三区婷婷月 | 亚洲aⅴ无码成人网站国产app | 亚洲日韩乱码中文无码蜜桃臀网站 | 色综合久久久无码网中文 | aⅴ亚洲 日韩 色 图网站 播放 | 丰满少妇熟乱xxxxx视频 | 亚洲精品久久久久久久久久久 | 日本www一道久久久免费榴莲 | 国产精品资源一区二区 | 一本久道久久综合婷婷五月 | 欧美性猛交内射兽交老熟妇 | av无码电影一区二区三区 | 亚洲精品一区二区三区在线观看 | 日本一区二区三区免费高清 | 国产极品美女高潮无套在线观看 | 天堂无码人妻精品一区二区三区 | 国产精品无码一区二区三区不卡 | 欧美老妇与禽交 | 国产精品成人av在线观看 | 国产精品手机免费 | 亚洲色无码一区二区三区 | 日本www一道久久久免费榴莲 | 亚洲gv猛男gv无码男同 | 国产午夜手机精彩视频 | 98国产精品综合一区二区三区 | 美女扒开屁股让男人桶 | 99视频精品全部免费免费观看 | 中文字幕精品av一区二区五区 | 国产免费久久精品国产传媒 | 国产精品无套呻吟在线 | 国产精品无码久久av | 色婷婷av一区二区三区之红樱桃 | 小泽玛莉亚一区二区视频在线 | 少妇激情av一区二区 | 欧美日本免费一区二区三区 | 自拍偷自拍亚洲精品被多人伦好爽 |