精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從Java走進(jìn)Scala:包和訪問修飾符

開發(fā) 后端
在現(xiàn)實(shí)生活中,代碼一定要引用并打包,在本文中,Ted Neward 介紹了 Scala 的包(package)和訪問修飾符功能,糾正了以前的疏忽。然后,他繼續(xù)探討了 Scale 中的函數(shù)內(nèi)容:“apply” 機(jī)制。

最近,讀者的反饋?zhàn)屛乙庾R到在制作本系列的過程中我遺漏了 Scala 的語言的一個重要方面:Scala 的包和訪問修飾符功能。所以在研究該語言的函數(shù)性元素 apply 機(jī)制前,我將先介紹包和訪問修飾符。

打包

為了有助于隔離代碼,使其不會相互沖突,Java 代碼提供了 package 關(guān)鍵詞,由此創(chuàng)建了一個詞法命名空間,用以聲明類。本質(zhì)上,將類 Foo 放置到名為 com.tedneward.util 包中就將正式類名修改成了 com.tedneward.util.Foo;同理,必須按該方法引用類。如果沒有,Java 編程人員會很快指出,他們會 import 該包,避免鍵入正式名的麻煩。的確如此,但這僅意味著根據(jù)正式名引用類的工作由編譯器和字節(jié)碼完成??焖贋g覽一下 javap 的輸出,這點(diǎn)就會很明了。

然而,Java 語言中的包還有幾個特殊的要求:一定要在包所作用的類所在的 .java 文件的頂端聲明包(在將注釋應(yīng)用于包時,這一點(diǎn)會引發(fā)很嚴(yán)重的語言問題);該聲明的作用域?yàn)檎麄€文件。這意味著兩個跨包進(jìn)行緊密耦合的類一定要在跨文件時分離,這會致使兩者間的緊密耦合很容易被忽略。

Scala 在打包方面所采取的方法有些不同,它結(jié)合使用了 Java 語言的 declaration 方法和 C# 的 scope(限定作用域)方法。了解了這一點(diǎn),Java 開發(fā)人員就可以使用傳統(tǒng)的 Java 方法并將 package 聲明放在 .scala 文件的頂部,就像普通的 Java 類一樣;包聲明的作用域?yàn)檎麄€文件,就像在 Java 代碼中一樣。而 Scala 開發(fā)人員則可以使用 Scala 的包 “(scoping)限定作用域” 方法,用大括號限制 package 語句的作用域,如清單 1 所示:

清單 1. 簡化的打包

  1. package com  
  2. {  
  3.   package tedneward  
  4.   {  
  5.     package scala  
  6.     {  
  7.       package demonstration  
  8.       {  
  9.         object App  
  10.         {  
  11.           def main(args : Array[String]) : Unit =  
  12.           {  
  13.             System.out.println("Howdy, from packaged code!")  
  14.             args.foreach((i) => System.out.println("Got " + i) )  
  15.           }  
  16.         }  
  17.       }  
  18.     }  
  19.   }  

這個代碼有效地聲明了類 App,或者更確切的說是一個稱為 com.tedneward.scala.demonstration.App 的單個類。注意 Scala 還允許用點(diǎn)分隔包名,所以清單 1 中的代碼可以更簡潔,如清單 2 所示:

清單 2. 簡化了的打包(redux)

  1. package com.tedneward.scala.demonstration  
  2. {  
  3.   object App  
  4.   {  
  5.       def main(args : Array[String]) : Unit =  
  6.       {  
  7.         System.out.println("Howdy, from packaged code!")  
  8.         args.foreach((i) => System.out.println("Got " + i) )  
  9.       }  
  10.   }  

用哪一種樣式看起來都比較合適,因?yàn)樗鼈兌季幾g出一樣的代碼構(gòu)造(Scala 將繼續(xù)編譯并和 javac 一樣在聲明包的子目錄中生成 .class 文件)。

#p#

導(dǎo)入

與包相對的當(dāng)然就是 import 了,Scala 使用它將名稱放入當(dāng)前詞法名稱空間。本系列的讀者已經(jīng)在此前的很多例子中見到過 import 了,但現(xiàn)在我將指出一些讓 Java 開發(fā)人員大吃一驚的 import 的特性。

首先,import 可以用于客戶機(jī) Scala 文件內(nèi)的任何地方,并非只可以用在文件的頂部,這樣就有了作用域的關(guān)聯(lián)性。因此,在清單 3 中,java.math.BigInteger 導(dǎo)入的作用域被完全限定到了在 App 對象內(nèi)部定義的方法,其他地方都不行。如果 mathfun 內(nèi)的其他類或?qū)ο笠胧褂?java.math.BigInteger,就需要像 App 一樣導(dǎo)入該類。如果 mathfun 的幾個類都想使用 java.math.BigInteger,可以在 App 的定義以外的包級別導(dǎo)入該類,這樣在包作用域內(nèi)的所有類就都導(dǎo)入 BigInteger 了。

清單 3. 導(dǎo)入的作用域

  1. package com  
  2. {  
  3.   package tedneward  
  4.   {  
  5.     package scala  
  6.     {  
  7.         // ...  
  8.         
  9.       package mathfun  
  10.       {  
  11.         object App  
  12.         {  
  13.           import java.math.BigInteger  
  14.           
  15.           def factorial(arg : BigInteger) : BigInteger =  
  16.           {  
  17.             if (arg == BigInteger.ZERO) BigInteger.ONE  
  18.             else arg multiply (factorial (arg subtract BigInteger.ONE))  
  19.           }  
  20.           
  21.           def main(args : Array[String]) : Unit =  
  22.           {  
  23.             if (args.length > 0)  
  24.               System.out.println("factorial " + args(0) +  
  25.                 " = " + factorial(new BigInteger(args(0))))  
  26.             else 
  27.               System.out.println("factorial 0 = 1")  
  28.           }  
  29.         }  
  30.       }  
  31.     }  
  32.   }  

不只如此,Scala 還不區(qū)分高層成員和嵌套成員,所以您不僅可以使用 import 將嵌套類型的成員置于詞法作用域中,其他任何成員均可;例如,您可以通過導(dǎo)入 java.math.BigInteger 內(nèi)的所有名稱,使對 ZERO 和 ONE 的限定了作用域的引用縮小為清單 4 中的名稱引用:

清單 4. 靜態(tài)導(dǎo)入

  1. package com  
  2. {  
  3.   package tedneward  
  4.   {  
  5.     package scala  
  6.     {  
  7.         // ...  
  8.    
  9.       package mathfun  
  10.       {  
  11.         object App  
  12.         {  
  13.           import java.math.BigInteger  
  14.           import BigInteger._  
  15.           
  16.           def factorial(arg : BigInteger) : BigInteger =  
  17.           {  
  18.             if (arg == ZERO) ONE  
  19.             else arg multiply (factorial (arg subtract ONE))  
  20.           }  
  21.           
  22.           def main(args : Array[String]) : Unit =  
  23.           {  
  24.             if (args.length > 0)  
  25.               System.out.println("factorial " + args(0) +  
  26.                 " = " + factorial(new BigInteger(args(0))))  
  27.             else 
  28.               System.out.println("factorial 0 = 1")  
  29.           }  
  30.         }  
  31.       }  
  32.     }  
  33.   }  

您可以使用下劃線(還記得 Scala 中的通配符吧?)有效地告知 Scala 編譯器 BigInteger 內(nèi)的所有成員都需要置入作用域。由于 BigInteger 已經(jīng)被先前的導(dǎo)入語句導(dǎo)入到作用域中,因此無需顯式地使用包名限定類名。實(shí)際上,可以將所有這些都結(jié)合到一個語句中,因?yàn)?import 可以同時導(dǎo)入多個目標(biāo),目標(biāo)間用逗號隔開(如清單 5 所示):

清單 5. 批量導(dǎo)入

  1. package com  
  2. {  
  3.   package tedneward  
  4.   {  
  5.     package scala  
  6.     {  
  7.         // ...  
  8.    
  9.       package mathfun  
  10.       {  
  11.         object App  
  12.         {  
  13.           import java.math.BigInteger, BigInteger._  
  14.           
  15.           def factorial(arg : BigInteger) : BigInteger =  
  16.           {  
  17.             if (arg == ZERO) ONE  
  18.             else arg multiply (factorial (arg subtract ONE))  
  19.           }  
  20.           
  21.           def main(args : Array[String]) : Unit =  
  22.           {  
  23.             if (args.length > 0)  
  24.               System.out.println("factorial " + args(0) +  
  25.                 " = " + factorial(new BigInteger(args(0))))  
  26.             else 
  27.               System.out.println("factorial 0 = 1")  
  28.           }  
  29.         }  
  30.       }  
  31.     }  
  32.   }  

這樣您可以節(jié)省一兩行代碼。注意這兩個導(dǎo)入過程不能結(jié)合:先導(dǎo)入 BigInteger 類本身,再導(dǎo)入該類中的各種成員。

也可以使用 import 來引入其他非常量的成員。例如,考慮一下清單 6 中的數(shù)學(xué)工具庫(或許不一定有什么價值):

清單 6. Enron 的記帳代碼

  1. package com  
  2. {  
  3.   package tedneward  
  4.   {  
  5.     package scala  
  6.     {  
  7.         // ...  
  8.         
  9.       package mathfun  
  10.       {  
  11.         object BizarroMath  
  12.         {  
  13.           def bizplus(a : Int, b : Int) = { a - b }  
  14.           def bizminus(a : Int, b : Int) = { a + b }  
  15.           def bizmultiply(a : Int, b : Int) = { a / b }  
  16.           def bizdivide(a : Int, b : Int) = { a * b }  
  17.         }  
  18.       }  
  19.     }  
  20.   }  

使用這個庫會越來越覺得麻煩,因?yàn)槊空埱笏囊粋€成員,都需要鍵入 BizarroMath,但是 Scala 允許將 BizarroMath 的每一個成員導(dǎo)入最高層的詞法空間,因此簡直就可以把它們當(dāng)成全局函數(shù)來使用(如清單 7所示):

清單 7. 計算 Enron的開支

  1. package com  
  2. {  
  3.   package tedneward  
  4.   {  
  5.     package scala  
  6.     {  
  7.       package demonstration  
  8.       {  
  9.         object App2  
  10.         {  
  11.           def main(args : Array[String]) : Unit =  
  12.           {  
  13.             import com.tedneward.scala.mathfun.BizarroMath._  
  14.               
  15.             System.out.println("2 + 2 = " + bizplus(2,2))  
  16.           }  
  17.         }  
  18.       }  
  19.     }  
  20.   }  

還有其他的一些構(gòu)造很有趣,它們允許 Scala 開發(fā)人員寫出更自然的 2 bizplus 2,但是這些內(nèi)容本文不予討論(想了解 Scala 潛在的可以用于其他用途的特性的讀者可以看一下 Odersky、Spoon 和 Venners 所著的 Programming in Scala 中談到的 Scala implicit 構(gòu)造)。

#p#

訪問

打包(和導(dǎo)入)是 Scala 封裝的一部分,和在 Java 代碼中一樣,在 Scala 中,打包很大一部分在于以選擇性方式限定訪問特定成員的能力 — 換句話說,在于 Scala 將特定成員標(biāo)記為 “公有(public)”、“private(私有)” 或介于兩者之間的成員的能力。

Java 語言有四個級別的訪問:公有(public)、私有(private)、受保護(hù)的(protected )和包級別(它沒有任何關(guān)鍵詞)訪問。Scala:

廢除了包級別的限制(在某種程度上)

默認(rèn)使用 “公有”

指定 “私有” 表示 “只有此作用域可訪問”

相反,Scala 定義 “protected” 的方式與在 Java 代碼中不同;Java protected 成員對于子類和在其中定義成員的包來說是可訪問的,Scala 中則僅有子類可訪問。這意味著 Scala 版本的 protected 限制性要比 Java 版本更嚴(yán)格(雖然按理說更加直觀)。

然而,Scala 真正區(qū)別于 Java 代碼的地方是 Scala 中的訪問修飾符可以用包名來 “限定”,用以表明直到 哪個訪問級別才可以訪問成員。例如,如果 BizarroMath 包要將成員訪問權(quán)限授權(quán)給同一包中的其他成員(但不包括子類),可以用清單 8 中的代碼來實(shí)現(xiàn):

清單 8. Enron 的記帳代碼

  1. package com  
  2. {  
  3.   package tedneward  
  4.   {  
  5.     package scala  
  6.     {  
  7.         // ...  
  8.         
  9.       package mathfun  
  10.       {  
  11.         object BizarroMath  
  12.         {  
  13.           def bizplus(a : Int, b : Int) = { a - b }  
  14.           def bizminus(a : Int, b : Int) = { a + b }  
  15.           def bizmultiply(a : Int, b : Int) = { a / b }  
  16.           def bizdivide(a : Int, b : Int) = { a * b }  
  17.       
  18.               private[mathfun] def bizexp(a : Int, b: Int) = 0 
  19.         }  
  20.       }  
  21.     }  
  22.   }  

注意此處的 private[mathfun] 表達(dá)。本質(zhì)上,這里的訪問修飾符是說該成員直到 包 mathfun 為止都是私有的;這意味著包 mathfun 的任何成員都有權(quán)訪問 bizexp,但任何包以外的成員都無權(quán)訪問它,包括子類。

這一點(diǎn)的強(qiáng)大意義就在于任何包都可以使用 “private” 或者 “protected” 聲明甚至 com(乃至 _root_,它是根名稱空間的別名,因此本質(zhì)上 private[_root_] 等效于 “public” 同)進(jìn)行聲明。這使得 Scala 能夠?yàn)樵L問規(guī)范提供一定程度的靈活性,遠(yuǎn)遠(yuǎn)高于 Java 語言所提供的靈活性。

實(shí)際上,Scala 提供了一個更高程度的訪問規(guī)范:對象私有 規(guī)范,用 private[this] 表示,它規(guī)定只有被同一對象調(diào)用的成員可以訪問有關(guān)成員,其他對象里的成員都不可以,即使對象的類型相同(這彌合了 Java 訪問規(guī)范系統(tǒng)中的一個缺口,這個缺口除對 Java 編程問題有用外,別無他用。)

注意訪問修飾符必須在某種程度上在 JVM 之上映射,這致使定義中的細(xì)枝末節(jié)會在從正規(guī) Java 代碼中調(diào)用或編譯時丟失。例如,上面的 BizarroMath 示例(用 private[mathfun] 聲明的成員 bizexp)將會生成清單 9 中的類定義(當(dāng)用 javap 來查看時):

Listing 9. Enron 的記帳庫,JVM 視圖

  1. Compiled from "packaging.scala" 
  2. public final class com.tedneward.scala.mathfun.BizarroMath  
  3.    extends java.lang.Object  
  4. {  
  5.     public static final int $tag();  
  6.     public static final int bizexp(intint);  
  7.     public static final int bizdivide(intint);  
  8.     public static final int bizmultiply(intint);  
  9.     public static final int bizminus(intint);  
  10.     public static final int bizplus(intint);  

在編譯的 BizarroMath 類的第二行很容易看出,bizexp() 方法被賦予了 JVM 級別的 public 訪問修飾符,這意味著一旦 Scala 編譯器結(jié)束訪問檢查,細(xì)微的 private[mathfun] 區(qū)別就會丟失。因此,對于那些要從 Java 代碼使用的 Scala 代碼,我寧愿堅持傳統(tǒng)的 “private” 和 “public” 的定義(甚至 “protected” 的定義有時最終映射到 JVM 級別的 “public”,所有不確定的時候,請對照實(shí)際編譯的字節(jié)碼參考一下 javap,以確認(rèn)其訪問級別。)

#p#

應(yīng)用

在本系列上一期的文章中(“集合類型”),當(dāng)談及 Scala 中的數(shù)組時(確切地說是 Array[T])我說過:“獲取數(shù)組的第 i 個元素” 實(shí)際上是 “那些名稱很有趣的方法中的一種……”。盡管當(dāng)時是因?yàn)槲也幌肷钊爰?xì)節(jié),但不管怎么說事實(shí)證明這種說法嚴(yán)格來說 是不對的。

好吧,我承認(rèn),我說謊了。

技術(shù)上講,在 Array[T] 類上使用圓括號要比使用 “名稱有趣的方法” 復(fù)雜一點(diǎn);Scala 為特殊的字符序列(即那些有左右括號的序列)保留了一個特殊名稱關(guān)聯(lián),因?yàn)樗兄厥獾氖褂靡鈭D :“做”……(或按函數(shù)來說,將……“應(yīng)用” 到……)。

換句話說,Scala 有一個特殊的語法(更確切一些,是一個特殊的語法關(guān)系)來代替 “應(yīng)用” 操作符 “()”。更精確地說,當(dāng)用 () 作為方法調(diào)用來調(diào)用所述對象時,Scala 將稱為 apply() 的方法作為調(diào)用的方法。例如,一個想充當(dāng)仿函數(shù)(functor)的類(一個充當(dāng)函數(shù)的對象)可以定義一個 apply 方法來提供類似于函數(shù)或方法的語義:

清單 10. 使用 Functor!

  1. class ApplyTest  
  2. {  
  3.   import org.junit._, Assert._    
  4.     
  5.   @Test def simpleApply =  
  6.   {  
  7.     class Functor  
  8.     {  
  9.       def apply() : String =  
  10.       {  
  11.         "Doing something without arguments" 
  12.       }  
  13.         
  14.       def apply(i : Int) : String =  
  15.       {  
  16.         if (i == 0)  
  17.           "Done" 
  18.         else 
  19.           "Applying... " + apply(i - 1)  
  20.       }  
  21.     }  
  22.  
  23.     val f = new Functor  
  24.     assertEquals("Doing something without arguments", f() )  
  25.     assertEquals("Applying... Applying... Applying... Done", f(3))  
  26.   }  
  27. }  

好奇的讀者會想是什么使仿函數(shù)不同于匿名函數(shù)或閉包呢?事實(shí)證明,它們之間的關(guān)系相當(dāng)明顯:標(biāo)準(zhǔn) Scala 庫中的 Function1 類型(指包含一個參數(shù)的函數(shù))在其定義上有一個 apply 方法??焖贋g覽一些為 Scala 匿名函數(shù)生成的 Scala 匿名類,您就會明白生成的類是 Function1(或者 Function2 或 Function3,這要看該函數(shù)使用了幾個參數(shù))的后代。

這意味著當(dāng)匿名的或者命名的函數(shù)不一定適合期望設(shè)計方法時,Scala 開發(fā)人員可以創(chuàng)建一個 functor 類,提供給它一些初始化數(shù)據(jù),保存在字段中,然后通過 () 執(zhí)行它,無需任何通用基類(傳統(tǒng)的策略模式實(shí)現(xiàn)需要這個類):

清單 11. 使用 Functor!

  1. class ApplyTest  
  2. {  
  3.   import org.junit._, Assert._    
  4.  
  5.   // ...  
  6.     
  7.   @Test def functorStrategy =  
  8.   {  
  9.     class GoodAdder  
  10.     {  
  11.       def apply(lhs : Int, rhs : Int) : Int = lhs + rhs  
  12.     }  
  13.     class BadAdder(inflateResults : Int)  
  14.     {  
  15.       def apply(lhs : Int, rhs : Int) : Int = lhs + rhs * inflateResults  
  16.     }  
  17.  
  18.     val calculator = new GoodAdder  
  19.     assertEquals(4, calculator(22))  
  20.     val enronAccountant = new BadAdder(50)  
  21.     assertEquals(102, enronAccountant(22))  
  22.   }  
  23. }  

任何提供了被適當(dāng)賦予了參數(shù)的 apply 方法的類,只要這些參數(shù)都按數(shù)字和類型排列了起來,它們都會在被調(diào)用時運(yùn)行。

結(jié)束語

Scala 的打包、導(dǎo)入和訪問修飾符機(jī)制提供了傳統(tǒng) Java 編程人員從未享受過的更高級的控制和封裝。例如,它們提供了導(dǎo)入一個對象的選擇方法的能力,使它們看起來就像全局方法一樣,而且還克服了全局方法的傳統(tǒng)的缺點(diǎn);它們使得使用那些方法變得極其簡單,尤其是當(dāng)這些方法提供了諸如本系列早期文章(“Scala 控制結(jié)構(gòu)內(nèi)部揭密”)引入的虛構(gòu)的 tryWithLogging 函數(shù)這樣的高級功能時。

同樣,“應(yīng)用” 機(jī)制允許 Scala 隱藏函數(shù)部分的執(zhí)行細(xì)節(jié),這樣,編程人員可能會不知道(或不在乎)他們正調(diào)用的東西 事實(shí)上不是一個函數(shù),而是一個非常復(fù)雜的對象。該機(jī)制為 Scala 機(jī)制的函數(shù)特性提供了另一個方面,當(dāng)然 Java 語言(或者 C# 或 C++)也提供了這個方面,但是它們提供的語法純度沒有 Scala 的高。

【相關(guān)閱讀】

  1. Scala編程語言專題
  2. 面向Java開發(fā)人員的Scala指南:使用元組、數(shù)組和列表
  3. 面向Java開發(fā)人員的Scala指南:當(dāng)繼承中的對象遇到函數(shù)
  4. 面向Java開發(fā)人員的Scala指南:使用Scala版本的Java接口
  5. 面向Java開發(fā)人員的Scala指南:Scala控制結(jié)構(gòu)內(nèi)部揭密
責(zé)任編輯:yangsai 來源: IBMDW
相關(guān)推薦

2009-08-24 16:49:39

C#修飾符

2009-06-12 13:37:47

訪問權(quán)限修飾符Java教程

2009-09-04 11:06:40

C#訪問修飾符

2020-09-02 07:03:04

虛擬機(jī)HotSpotJava

2009-09-28 11:01:39

從Java走進(jìn)Scal

2009-08-21 16:17:25

ScalaTwitter API

2009-07-22 08:45:35

Scala超類構(gòu)造器override修飾符

2009-06-16 17:54:38

Scala類語法語義

2011-06-02 14:51:07

JAVA修飾符

2009-06-17 13:57:25

Scala元組數(shù)組

2009-06-17 11:44:22

Scala控制結(jié)構(gòu)

2015-08-18 09:25:11

Java修飾符關(guān)鍵詞

2009-07-15 10:14:25

Scala并發(fā)性

2009-12-09 09:15:47

從Java走進(jìn)ScalTwitter API

2009-02-04 17:32:03

ibmdwJavaScala

2021-11-21 22:36:18

Java修飾符開發(fā)

2009-08-27 11:12:03

C# abstract

2009-08-21 13:58:06

C# virtual修

2023-12-29 09:01:27

SwiftUI視圖修飾符

2009-09-02 17:14:28

C#修飾符
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

动漫一区二区在线| 欧美激情aaaa| 国产毛片久久久久久| 黄色成人在线| 99精品一区二区三区| 国产精品第3页| 国产天堂av在线| 另类在线视频| 欧美猛男男办公室激情| 欧美在线一区视频| 午夜毛片在线| 久久综合一区二区| 91在线精品视频| 国产精品男女视频| 希岛爱理av一区二区三区| 亚洲国产成人久久| 天天干天天玩天天操| 第一福利在线视频| 中文字幕日韩一区二区| 精品免费视频123区| 一区二区三区免费在线| 国产亚洲激情| 欧美乱妇40p| www.涩涩爱| 日韩av午夜| 日韩欧美国产精品一区| 一本一道久久a久久综合蜜桃| 国产深夜视频在线观看| 中文字幕在线播放不卡一区| 欧美日韩最好看的视频| 蜜臀久久99精品久久久| 国产一区二区在线电影| 国产精品视频一区国模私拍| 欧美另类一区二区| 欧美日本国产| 久久伊人精品天天| 欧美xxxx精品| 久久99高清| 亚洲激情视频网站| 亚洲成年人av| 视频一区在线| 日韩视频一区在线观看| 在线观看免费不卡av| jvid一区二区三区| 在线观看国产一区二区| 国产suv精品一区二区三区88区| 免费看一级大片| 久久综合av| 中文国产亚洲喷潮| 久久久久久久久久久久| 日韩精品导航| 精品1区2区在线观看| 中文字幕一二三| 99久久99九九99九九九| 8v天堂国产在线一区二区| 五月婷婷六月丁香激情| 成人在线不卡| 欧美日韩一区精品| 最新天堂在线视频| 91视频成人| 91精品国产麻豆国产自产在线| 亚洲欧美偷拍另类| 99视频有精品高清视频| 日韩欧美成人午夜| 无码人妻丰满熟妇区毛片蜜桃精品 | 日本韩国欧美中文字幕| 亚洲一区二区三区高清不卡| 51色欧美片视频在线观看| 日本熟女毛茸茸| 久久先锋影音| 国产欧美精品在线播放| 国产wwwwwww| 成人污视频在线观看| 国产免费高清一区| 久久免费看视频| 中文子幕无线码一区tr | 欧美国产91| 欧美精品999| 国产性猛交╳xxx乱大交| 久久三级福利| 国产日韩精品视频| 亚洲精品久久久久久久久久| 成人18精品视频| 日本成人黄色| gogo在线观看| 黑人精品xxx一区一二区| 亚洲五月天综合| 2020国产精品小视频| 精品国产一二三区| 调教驯服丰满美艳麻麻在线视频| 亚洲成人一区| 欧美亚洲国产成人精品| 一级爱爱免费视频| 成人小视频在线观看| 日韩欧美激情一区二区| 五月天激情在线| 欧美性xxxxxxxxx| 中文字幕 欧美日韩| 欧美交a欧美精品喷水| 久久精品99国产精品酒店日本| 国产无码精品视频| 蜜臀av在线播放一区二区三区| 成人自拍视频网站| aaa在线观看| 五月婷婷综合网| av中文字幕网址| 免费一区二区| 欧美日韩国产成人| 综合久久中文字幕| av激情综合网| 永久免费在线看片视频| gay欧美网站| 精品免费国产二区三区| avhd101老司机| 亚洲欧美日本日韩| 99re国产| 理论片午午伦夜理片在线播放| 欧美日韩亚洲系列| 国偷自产av一区二区三区麻豆| 国产欧美日韩免费观看 | 秋霞国产精品| 亚洲第一区中文字幕| 午夜精品一区二区三级视频| 久久国产日本精品| 国模一区二区三区私拍视频| 国产原创精品视频| 欧美日韩国产综合一区二区三区 | 欧美精品18videosex性欧美| 伊人成人在线观看| 国产亚洲一二三区| 欧美亚洲精品一区二区| 99这里只有精品视频| 久久视频这里只有精品| 中文字幕码精品视频网站| 91麻豆精品视频| www.日本少妇| 6080亚洲理论片在线观看| 欧美精品在线观看| 林心如三级全黄裸体| 亚洲黄色影片| 成人片在线免费看| 女囚岛在线观看| 日韩午夜激情电影| 欧洲第一无人区观看| 久久国产精品99精品国产| 日韩欧美在线电影| 日韩免费小视频| 亚洲品质视频自拍网| 国产精品男女视频| 久久久久久综合| 欧美极品欧美精品欧美图片| 偷拍自拍亚洲色图| 欧美孕妇性xx| 国产九色在线| 欧美视频一区二区三区四区| av免费播放网站| 蜜乳av一区二区| 超碰免费在线公开| www 久久久| 欧美日韩国产999| 国产小视频一区| 26uuu亚洲综合色欧美| 久久久久免费看黄a片app| 久久久久97| 奇米影视亚洲狠狠色| 免费在线国产| 欧美亚洲免费在线一区| 天天操天天摸天天舔| 国产一区福利在线| 激情五月婷婷六月| 日本亚洲不卡| 国产精品女主播| 国产cdts系列另类在线观看| 欧美本精品男人aⅴ天堂| 日韩精品在线免费看| 91首页免费视频| 999精品视频在线| 91成人精品| 国产日韩欧美亚洲一区| 欧美成人h版| 俺也去精品视频在线观看| 国产黄色片免费| 福利一区视频在线观看| 国产三级aaa| 国产.欧美.日韩| 男女午夜激情视频| 久久精品国产www456c0m| www.久久爱.cn| 欧美电影免费观看网站| 超碰日本道色综合久久综合| 婷婷在线免费观看| 欧美三级资源在线| 久久精品国产av一区二区三区| 久久久精品人体av艺术| 日本国产一级片| a91a精品视频在线观看| 亚洲欧美久久久久一区二区三区| 2020国产精品极品色在线观看| 国产成+人+综合+亚洲欧洲| av网址在线看| 亚洲欧洲xxxx| 亚洲国产精品欧美久久| 欧美在线免费观看亚洲| 久久久久亚洲AV| 国产精品久线在线观看| 国产人妻人伦精品1国产丝袜| 韩国一区二区三区| 波多野结衣家庭教师视频| 午夜精品婷婷| 午夜精品一区二区三区在线观看| 果冻天美麻豆一区二区国产| 国产在线观看精品| 欧美xxx性| 午夜精品在线观看| gogo在线观看| 日日骚久久av| 精品美女视频在线观看免费软件 | 麻豆精品国产传媒| 日产国产高清一区二区三区| 日本欧美黄色片| 欧美黄色免费| 在线精品亚洲一区二区| 国产成人精品三级高清久久91| 国产精品对白刺激久久久| 福利一区三区| 国产精品永久在线| 欧美精选视频一区二区| 欧美亚洲国产精品| 麻豆国产在线| 97国产精品免费视频| 中中文字幕av在线| 久久精品2019中文字幕| 免费网站成人| 日韩有码在线电影| 午夜视频在线看| 中文字幕9999| 国产九色在线| 中文字幕亚洲欧美日韩2019| 国产午夜视频在线观看| 亚洲欧美综合另类中字| 日韩福利一区二区| 亚洲精品日韩丝袜精品| 亚洲av成人精品日韩在线播放| 亚洲国产成人91精品| 亚洲伦理在线观看| 精品少妇一区二区三区免费观看| www.xxx国产| 欧美不卡一区二区| 丰满熟妇乱又伦| 精品国产乱码久久久久久免费| 性生交大片免费看女人按摩| 日韩一二三四区| 亚洲精品18p| 欧美精品一区二区蜜臀亚洲| 色噜噜一区二区三区| 日韩成人中文字幕| 免费一级在线观看| 一区二区在线视频| 国产男男gay网站| 777a∨成人精品桃花网| 精品人妻一区二区三区换脸明星| 日韩久久久久久| 高潮毛片7777777毛片| 亚洲а∨天堂久久精品喷水| 偷拍精品一区二区三区| 亚洲欧洲美洲在线综合| 波多野结衣在线网站| 久久久999精品| 色呦呦在线观看视频| 91豆花精品一区| 国产精品videossex撒尿| 成人福利视频在线观看| ccyy激情综合| 欧美黑人3p| 欧美国产一区二区三区激情无套| 亚洲av综合色区| 国产精品久久久免费 | 黄色一级片在线| 天天综合色天天| 波多野结衣不卡| 在线成人免费观看| 黄色一级a毛片| 亚洲免费视频一区二区| 日韩黄色影院| 国内精品久久久久伊人av| 欧美一级大黄| 亚洲va欧美va国产综合久久| 里番精品3d一二三区| 日韩一区二区三区资源| 欧美黄色一区| 亚洲视频在线a| 国产99久久久国产精品免费看 | 日本高清不卡在线| 成年永久一区二区三区免费视频| 国产成人av一区二区三区| 国产精品欧美日韩一区| 国产精品无码电影在线观看 | 91香蕉视频在线观看视频| 91麻豆免费在线观看| 在线免费日韩av| 91黄色免费观看| 亚洲精品久久久久久久久久| 一区二区三区视频观看| av中文字幕在线看| 国产一区红桃视频| 蜜桃成人av| 国产91在线亚洲| 精一区二区三区| 亚欧洲乱码视频| 亚洲一区二区欧美日韩| 一级黄色片在线看| 日韩成人xxxx| 视频在线这里都是精品| 91精品久久久久久久久久| 亚洲理论电影| 国产二区视频在线| 国产一区二区福利| 色综合99久久久无码国产精品| 亚洲高清视频的网址| 国产女同91疯狂高潮互磨| 中文字幕亚洲一区在线观看 | 日韩欧美一区二区三区久久| 午夜精品久久久久久久99| 久久九九热免费视频| 另类中文字幕国产精品| 久久综合伊人77777麻豆| 欧美视频日韩| 亚洲精品在线网址| 中文字幕一区二区日韩精品绯色| 蜜臀精品一区二区三区| 日韩精品免费视频| 国产调教在线| 国产日韩欧美综合精品| 欧美色图首页| 久久久精品人妻一区二区三区| 亚洲天堂a在线| 97国产精品久久久| 日韩在线视频观看| 欧美97人人模人人爽人人喊视频| 日韩三级电影网站| 日精品一区二区三区| 久久国产柳州莫菁门| 日本韩国欧美国产| 户外极限露出调教在线视频| 国产91露脸中文字幕在线| 亚洲涩涩av| 成人三级视频在线播放| 久久精品欧美日韩精品| 久久影视中文字幕| 日韩电视剧在线观看免费网站 | 国产精品一区二区久久| 成人在线免费观看网站| 天美星空大象mv在线观看视频| 国产女人水真多18毛片18精品视频| 国产精品第6页| www.亚洲天堂| 精品国产亚洲一区二区三区大结局| 欧美 日韩 国产 在线观看| 精品一区二区免费看| 中文字幕五月天| 亚洲第一二三四五区| 免费亚洲电影| 伊人久久大香线蕉成人综合网| 狠狠久久亚洲欧美| 日干夜干天天干| 国产丝袜一区视频在线观看| 女生影院久久| 永久免费精品视频网站| 国产成人精品亚洲777人妖| 日本少妇久久久| 亚洲欧美在线第一页| 欧美美女被草| youjizz.com在线观看| 91在线精品一区二区| 国产91av在线播放| 久热精品视频在线免费观看 | 亚洲国产日韩欧美| 国产综合成人久久大片91| 久久久无码一区二区三区| 国产丝袜视频一区| 4438五月综合| 黄色成人在线看| 日本一区二区免费在线| 国产成人免费看一级大黄| 4444欧美成人kkkk| 91日韩视频| 人体私拍套图hdxxxx| 欧美日韩精品综合在线| 日本在线观看高清完整版| 欧美日韩国产高清视频| 国产一区欧美日韩| 蜜臀精品一区二区三区| 色综合久久88色综合天天看泰| 美女少妇全过程你懂的久久 | 中文字幕你懂的| 久久久久久久影院| 日韩精品一卡| 国产精品300页| 欧美一级淫片007| 日韩不卡免费高清视频|