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

Java和C++在細節上的差異:泛型程序設計

開發 后端
本文主要從泛型程序設計方面講解了Java和C++在細節上的差異。

繼上篇文章:Java和C++在細節上的差異:接口與內部類

 八、泛型程序設計:

1. 泛型類的定義,見如下代碼:

  1. public class Pair<T,U> { 
  2. public Pair() { first = null; second = null; } 
  3. public Pair(T first,U second) { this.first = first; this.second = second; } 
  4.  
  5. public T getFirst() { return first; } 
  6. public U getSecond() { return second; } 
  7. public void setFirst(T first) { this.first = first; } 
  8. public void setSecond(U second) { this.second = second; } 
  9.  
  10. private T first; 
  11. private U second; 

以上代碼中的T,U都是泛型類Pair的類型參數。以下為C++中模板類的定義方式:

  1. template<typename T,typename U> 
  2. class Pair { 
  3. public
  4. Pair(T first,U second): _first(first),_second(second) {} 
  5. ~Pair() {} 
  6. public
  7. T getFirst() { return _first; } 
  8. U getSecond() { return _second; } 
  9. void setFirst(T frist) { _first = first; } 
  10. void setSecond(U second) { _second = second; } 
  11. private
  12. T _first; 
  13. U _second; 

2. 泛型方法的定義,在Java中泛型方法不一定聲明在泛型類中,可以聲明在普通類中,見如下代碼:

  1. public class MyFirst { 
  2. public static void main(String[] args) throws Exception {  
  3. String[] names = {"john","Q.","Public"}; 
  4. String middle = ArrayAlgo.<String>getMiddle(names); 
  5. System.out.println(middle); 
  6. }  
  7.  
  8. class ArrayAlgo { 
  9. public static <T> T getMiddle(T[] a) { 
  10. return a[a.length/2]; 

在以上代碼中可以看出getMiddle方法為靜態泛型方法,類型變量位于修飾符"public static" 的后面,返回值的前面。調用的時候在方法名的前面給出了參數類型。由于Java的編譯器提供類型推演的功能,既類型參數可以通過函數參數的類型進行推演,因此也可以直接調用泛型函數,如String middle = ArrayAlgo.getMiddle(names)。如果編譯器無法通過函數參數的類型推演出類型參數的實際類型,這樣將會導致編譯錯誤。在C++中同樣存在模板函數,也同樣存在模板函數的類型推演,在這一點上主要的差異來自于函數聲明的語法,見如下C++代碼:

  1. class ArrayAlgo { 
  2. public
  3. template<typename T> 
  4. static T getMiddle(T* a,size_t len) { 
  5. return a[len/2]; 
  6. }; 
  7.  
  8. int main() 
  9. int v[] = {1,2,3}; 
  10. int ret = ArrayAlgo::getMiddle(v,3); 
  11. printf("This value is %d.\n",ret); 
  12. return 0

3. 類型參數的限定:有些泛型函數在使用類型參數變量時,經常會用到該類型的特殊方法,如在進行數組元素比較時,要求數組中的元素必須是Comparable接口的實現類,見如下代碼:

  1. public static <T> T min(T[] a) { 
  2. if (a == null || a.length == 0
  3. return null
  4. T smallest = a[0]; 
  5. for (int i = 0; i < a.length; ++i) { 
  6. if (smallest.compareTo(a[i]) > 0
  7. smallest = a[i]; 
  8. return smallest; 

在以上代碼中,數組元素的類型為T,如果該類型并未提供compareTo域方法,將會導致編譯錯誤,如何確保類型參數確實提供了compareTo方法呢?如果T是Comparable接口的實現類,那么該方法一定會被提供,因此可以通過Java語法中提供的類型參數限定的方式來確保這一點。見如下修訂代碼:

  1. public static <T extends Comparable> T min(T[] a) { 
  2. if (a == null || a.length == 0
  3. return null
  4. T smallest = a[0]; 
  5. for (int i = 0; i < a.length; ++i) { 
  6. if (smallest.compareTo(a[i]) > 0
  7. smallest = a[i]; 
  8. return smallest; 

其中的<T extends Comparable>語法保證了類型參數必須是Comparable接口的實現類,否則將會導致編譯錯誤。Java中可以支持多接口的限定,之間用&分隔,如<T extends Comparable & Serializable>和之前的例子一樣,盡管同樣都會導致編譯錯誤,但是后者不僅會產生更為明確的編譯錯誤信息,同樣也使使用者能夠更加清晰的看到該方法的使用規則。在標準C++中并未提供這樣的限定,但是在C++中對該種方式有另外一種稱謂,叫做"類型綁定",在Boost等開源庫中通過更復雜的模板技巧模仿了該功能的實現。然而,就泛型的該功能而言,C#的支持也是相當不錯的,可參考C#泛型中的which關鍵字。
在標準C++中,其模板的實現較Java而言更為靈活和強大。對于***個例子中的代碼,只是要求模參必須提供compareTo方法即可通過編譯。

  1. template<typename T> 
  2. static T min(T* a,size_t len) { 
  3. T smallest = a[0]; 
  4. for (int i = 0; i < len; ++i) { 
  5. if (smallest.compareTo(a[i]) > 0) 
  6. smallest = a[i]; 
  7. return smallest; 

注:C++中的模板是在引用時才編譯的,因此如果在模板類型中出現任何語法錯誤,但此時尚未有任何引用時,編譯器是不會報錯的。
4. 泛型代碼中的類型擦除:記得在我閱讀Thinking in Java 4th 的時候,書中給出了一些比較明確的解釋,為什么Java會這樣實現泛型,其最主要的原因是為了考慮向前兼容,也承認這樣的實現方式有著很多的缺陷和弊病,希望Java在今后的版本中予以補足。
簡單的說類型擦除,就是幾乎所有的泛型相關的行為都是由編譯器通過暗插各種各樣的代碼,或者是暗自修訂部分代碼的聲明,然后再將修訂后的代碼(基本不再包含泛型信息)生成字節碼后交給JVM去執行,因此可以據此判斷在JVM中對我們的泛型類型是一無所知的。C++也是同樣的道理,只是編譯器完成的工作被定義為類型展開或類型實例化,因此,同樣的模板類,如果實例化的類型參數不同,那么用他們聲明出來的類對象也同樣不屬于相同類型的對象,其限制主要表現為,不能通過缺省copy constructor或者缺省賦值操作符來完成對象之間的復制,除非其中某個類型實例化后的對象專門針對另外一種類型實例化后的類型進行了copy constructor和賦值等于的重載。

1) 類型擦除:將類型參數替換為限定類型,如果沒有限定類型則替換為Object,見如下代碼:

  1. public class Pair<T> { 
  2. public Pair(T first,T second) { this.first = first; this.second = second; } 
  3. public T getFirst() { return first; } 
  4. public T getSecond() { return second; } 
  5. public void setFirst(T first) { this.first = first; } 
  6. public void setSecond(T second) { this.second = second; } 
  7. private T first; 
  8. private T second; 

由于Pair中的類型參數T沒有限定類型,因此類型擦除后將會變成如下代碼:

  1. public class Pair { 
  2. public Pair(Object first,Object second) { this.first = first; this.second = second; } 
  3. public Object getFirst() { return first; } 
  4. public Object getSecond() { return second; } 
  5. public void setFirst(Object first) { this.first = first; } 
  6. public void setSecond(Object second) { this.second = second; } 
  7. private Object first; 
  8. private Object second; 

因此盡管在調用Pair時,傳遞的類型參數有所不同,如String、Date,但是在類型擦除之后,他們將成為相同的類型。如果類型參數存在多個限定類型,則取***個限定類型作為擦除后的類型參數,見如下代碼:

  1. public class Interval<T extends Comparable & Serializable> implements Serializable { 
  2. public Interval(T first, T second) { 
  3. if (first.compareTo(second) <= 0) { 
  4. lower = first; 
  5. upper = second; 
  6. else { 
  7. lower = second; 
  8. uppper = first; 
  9. private T lower; 
  10. private T upper; 

擦除類型信息后的原始類型如下:

  1. public class Interval implements Serializable { 
  2. public Interval(Comparable first, Comparable second) { 
  3. if (first.compareTo(second) <= 0) { 
  4. lower = first; 
  5. upper = second; 
  6. else { 
  7. lower = second; 
  8. uppper = first; 
  9. private Comparable lower; 
  10. private Comparable upper; 

5. 泛型類向遺留代碼的兼容:由于編譯器自動完成了類型信息的擦除,因此在原有調用原始類型的地方,可以直接傳入等價的泛型類,只要保證該泛型類在類型擦除后可以符合被調用函數參數的語法要求即可,見如下代碼:

  1. public class TestMain { 
  2. public static void test(MyClass t) { 
  3. System.out.println(t.getValue()); 
  4.  
  5. public static void main(String[] args) { 
  6. MyClass<Integer> v = new MyClass<Integer>(5); 
  7. test(v); 
  8. class MyClass<T> { 
  9. public MyClass(T t) { 
  10. this.t = t; 
  11. public T getValue() { return t;} 
  12. private T t; 

6. 約束與局限性:

1) 不能使用原始類型作為類型參數,如int、double等,因為他們和Object之間沒有直接的繼承關系,因此在需要時只能使用包裝類,如Integer、Double分別予以替換,不能這樣的替換確實也帶來了效率上的折損,C++中沒有這樣的限制,因此模板類的增多只會影響編譯的效率和不會影響運行時的效率。

2) 運行時的類型查詢只適用于原始類型,即if (a instanceof Pair<String>) 等價于 if (a instanceof Pair)。

3) 泛型類對象調用getClass()方法返回的Class對象都是擦除類型信息的原始Class類型,因此在做比較時,他們將為真,見如下代碼:

  1. public class TestMain { 
  2. public static void main(String[] args) { 
  3. MyClass<Integer> i = new MyClass<Integer>(5); 
  4. MyClass<Double> d = new MyClass<Double>(5.0); 
  5. //返回的均為MyClass.Class 
  6. if (d.getClass() == i.getClass())  
  7. System.out.println("Type info will be ignored here"); 
  8. class MyClass<T> { 
  9. public MyClass(T t) { 
  10. this.t = t; 
  11. public T getValue() { return t;} 
  12. private T t; 
  13. /* 輸入結果: 
  14. Type info will be ignored here 
  15. */ 

4) 泛型類不能實現Throwable接口,換言之泛型類不能成為異常類,否則會導致編譯錯誤。

5) 不能聲明參數化類型的數組,如Pair<String>[] table = new Pair<String>[10]; 在擦除類型后將會變為Pair[] table = new Pair[10]; 因此可以執行該轉換:Objec[] objarray = table; 由于數組可以記住元素的類型,如果此時試圖插入錯誤的類型元素,將會導致異常ArrayStoreException的拋出。C++中沒有該限制。

6) 不能實例化泛型類型的變量,如public Pair() { first = new T(); second = new T();},C++中不存在這樣的限制,針對以上寫法,類型T只要存在缺省的構造函數即可。如果確實需要實例化類型參數的對象,見如下代碼:

  1. public static <T> Pair<T> makePair(Class<T> c1) { 
  2. return new Pair<T>(c1.newInstance(),c1.newInstance()); 
  3. public static void main(String[] args) { 
  4. //String.class的類型為Class<String> 
  5. Pair<String> p = Pair.makePair(String.class); 

這里主要是利用Class類型本身也是泛型類型,可以利用Class<T>的類型參數推演出Pair<T>中T的類型。同樣的道理帶有類型參數的數組對象也不能直接創建,需要利用Array的反射機制來輔助完成,見如下代碼:

  1. public static <T extends Comparable> T[] minmax(T[] a) { 
  2. T[] mm = (T[])Array.newInstance(a.getClass().getComponentType(),a.length); 
  3. //do something here based on mm 
  4. return mm; 

7) 泛型類不能應用于靜態上下文中,見如下代碼:

  1. public class Singleton<T> { 
  2. public static T getInstance() { //Compilation ERROR 
  3. return singleInstance; 
  4. private T singleInstance; //Compilation ERROR 

因為這樣的寫法在定義Singleton<String>和Singleton<Date>之后,由于類型擦除,將會生成唯一一個Singleton原始共享對象,事實上這并不是我們所期望的結果,在C++中沒有這樣的限制,甚至有的時候還可以利用這樣的機制針對不同類型的對象作聲明計數器用,見如下代碼:

  1. template<typename T> 
  2. class MyClassCounter { 
  3. public
  4. MyClassCounter(T t) { 
  5. _t = t; 
  6. _counter++; 
  7.  
  8. operator T() { 
  9. return _t; 
  10.  
  11. T* operator->() { 
  12. return &_t; 
  13. int getCount() const { return _counter; } 
  14. private
  15. T _t; 
  16. static int _counter; 

8) 泛型類不能同時繼承或實現只是擁有不同參數類型的同一泛型類,如 public class MyClass implements Comparable<String>, Comparable<Date> {}

7. 泛型類型的繼承規則:

1) 如果 public class Manager extends Employee {},那么Pair<Employee> pe = new Pair<Manager>()將會是非常的賦值操作,會導致編譯錯誤。試想如下代碼引發的運行時問題。在C++中這種賦值方式同樣會導致編譯錯誤,因為他們在類型實例化之后就被視為完全無關的兩個類型。

  1. public void test() { 
  2. Pair<Manager> manager = new Pair<Manager>(); 
  3. Pair<Employee> employee = manager; //compilation error 
  4. employee.setFirst(otherEmployeeButNotManager); //employee的另外一個子類,但不是Manager。 

2) 數組由于在運行時會記住元素的類型,因此數組可以完成這樣的賦值,如Manager[] manager = {}; Employee[] employee = manager;如果賦值之后出現錯誤的元素賦值將會引發ArrayStoreException異常。

3) 泛型類型可以直接賦值給擦除類型后的原始類型,但是同樣也會出現2)中數組賦值的問題,只是觸發的異常改為ClassCastException,見如下代碼:

  1. public void test() { 
  2. Pair<Manager> manager = new Pair<Manager>(); 
  3. Pair rawType = manager; 
  4. rawType.setFirst("Hello"); //only compilation warning, but will encounter runtime error. 

4) 如果 public class ArrayList<Manager> extends List<Manager> {}, 那么從ArrayList<Manager>到List<Manager>的賦值是允許的,這一點和普通類型是一致的,該規則同樣適用于C++。

8. 泛型類型的通配符類型:該泛型特征在標準C++中完全不被支持,C#中存在類似的特征。見以下代碼:

1) 子類型限定:

  1. public class Manager extends Employee {} 
  2.  
  3. public static void printBuddies(Pair<Employee> p) { 
  4.  
  5. public static void main(String[] args) { 
  6. printBuddies(new Pair<Employee>()); //legal 
  7. printBuddies(new Pair<Manager>()); //illegal; 

但是如果將printBuddies改為:void printBuddies(Pair<? extends Employee> p),上例中main函數將可以通過編譯。<? extends Employee>的語義為所有Employee的子類都可以做printBuddies函數參數的類型參數。對于7-1)中的示例代碼,如果改為通配符類型將可以通過編譯并正常運行,但是仍然存在一定的限制,見如下代碼:

  1. public void test() { 
  2. Pair<Manager> manager = new Pair<Manager>(); 
  3. Pair<? extends Employee> employee = manager; //legal here. 
  4. //由于otherEmployeeButNotManager雖為Employee子類,但可能并非Manager類, 
  5. //由于setFirst的參數將會聲明為void setFirst(? extends Employee),由于 
  6. //編譯器無法確定setFirst參數的實際類型,因此將會直接報告編譯錯誤。 
  7. employee.setFirst(otherEmployeeButNotManager); //compilation error 

和setFirst相比,getFirst將會正常編譯并運行,因為返回值無論是什么子類型,都不會帶來影響和破壞。

2) 超類型限定:Pair<? super Manager>表示參數類型一定是Manager的超類。因此和子類型限定剛好相反,setFirst將是合法的,而getFirst將會產生編譯錯誤。

3) 無限定通配符,如Pair<?>,該泛型類型的setFirst(?)方法不能被調用,即便傳入的參數是Object,這樣是Pair<?>和Pair之間***的差異。該方法還有一個比較重要的作用就是用于提示泛型函數的調用者,該泛型函數更期望參數是帶有類型參數的泛型類型,而不是原始類型,即便原始類型也可能正常的工作,見如下代碼:

  1. public class TestMain {  
  2. @SuppressWarnings("unchecked"
  3. //public static <T> T print(MyClass myclass),同樣可以正常的工作, 
  4. //但是會有編譯警告產生。 
  5. public static <T> T print(MyClass<?> myclass) { 
  6. myclass.print(); 
  7. return (T)myclass.get(); 
  8.  
  9. public static void main(String[] args) { 
  10. Integer ii = new Integer(5); 
  11. print(new MyClass<Integer>(ii)); 
  12.  
  13. class MyClass<T> { 
  14. public MyClass(T t) { 
  15. _t = t; 
  16. T get() { return _t;} 
  17.  
  18. public void print() { 
  19. System.out.println(_t); 
  20. private T _t; 

原文鏈接:http://www.cnblogs.com/stephen-liu74/archive/2011/08/15/2136859.html

【系列文章】

  1. Java和C++在細節上的差異:程序設計結構
  2. Java和C++在細節上的差異:枚舉與反射
  3. Java和C++在細節上的差異:接口與內部類
責任編輯:林師授 來源: Stephen_Liu的博客
相關推薦

2011-12-06 09:42:51

Java

2011-12-06 10:48:32

Java

2011-12-06 11:12:59

Java

2010-01-28 09:54:27

C++程序設計

2010-01-13 18:30:18

CC++程序設計

2009-06-01 08:48:19

作用域變量作用域對象作用域

2012-11-08 09:49:30

C++Java程序員

2010-01-27 14:24:15

C++程序設計

2011-07-10 15:36:54

C++

2010-01-11 17:43:23

C++程序設計

2020-12-28 08:36:30

C語言編程泛型

2010-01-11 10:34:22

C++程序

2016-03-22 16:51:13

C++泛型膨脹

2010-01-08 16:10:59

C++語言

2011-04-11 10:44:53

對象編程C++

2010-01-11 17:22:02

2009-10-12 13:10:58

馬爾可夫鏈

2011-08-05 15:46:32

Objective-C 程序設計

2009-08-26 18:02:05

C#泛型問題

2024-01-22 09:00:00

編程C++代碼
點贊
收藏

51CTO技術棧公眾號

av人人综合网| 国产情侣自拍av| 少妇淫片在线影院| 黄网站免费久久| 亚洲国产清纯| 欧美色网站导航| 一区二区三区四区视频在线观看 | 欧美成人精品一区二区三区| 四虎1515hh.com| av资源中文在线天堂| 91蜜桃免费观看视频| 国产精品精品久久久| 91麻豆制片厂| 国产乱色精品成人免费视频| 亚洲色图网站| 色成人在线视频| 午夜免费电影一区在线观看| 国产精品久久久国产盗摄| 欧美精品网站| 在线观看久久久久久| 蜜臀一区二区三区精品免费视频| 不卡在线一区二区| 欧美性开放视频| 最新av在线免费观看| 青青草在线免费观看| 国产在线视频不卡二| 亚洲欧美在线免费观看| 91丝袜超薄交口足| 日韩国产网站| 欧美日韩国产精品| 真实国产乱子伦对白视频| 3d成人动漫在线| 26uuu久久综合| 国产美女精品在线观看| 国产一区二区三区三州| 久久中文在线| 欧美性在线视频| 国产福利久久久| 中文视频一区| 国产精品女主播一区二区三区| 欧美精品一区二区久久久| 亚洲AV无码成人精品一区| 香蕉视频国产在线| 国产.欧美.日韩| 91在线观看免费高清| 中文字幕av网站| 石原莉奈一区二区三区在线观看 | 久久免费手机视频| 杨幂一区二区三区免费看视频| 精品国产伦一区二区三区观看体验 | 国产成人在线综合| yy6080久久伦理一区二区| 久久亚洲一区二区三区四区| 国产精品对白刺激久久久| 国产精品一区二区三区在线播放| 欧美三级视频网站| 粉嫩一区二区三区在线观看| 欧美亚洲尤物久久| 99热手机在线| 欧美不卡高清一区二区三区| 色婷婷狠狠综合| 成人午夜视频免费在线观看| av资源亚洲| 色婷婷久久久久swag精品| 久久精品国产sm调教网站演员| 国产经典三级在线| 久久综合九色综合97婷婷女人| 国产精品手机在线| 女人18毛片一区二区三区| 成人免费视频免费观看| 国产精品二区在线| 婷婷av一区二区三区| 日产欧产美韩系列久久99| 国产成人在线一区| 伊人色综合久久久| 国精品**一区二区三区在线蜜桃| 欧美日韩在线视频一区| 欧美在线一二三区| 成年在线电影| 亚洲欧美国产三级| 久久久久99精品成人片| 国产99在线| 欧美性猛交xxxx乱大交蜜桃| 99视频在线视频| 精品中文字幕一区二区三区| 精品国产三级电影在线观看| aa片在线观看视频在线播放| 99久久久成人国产精品| 欧美精品日韩一本| 国产艳妇疯狂做爰视频| 欧美大胆a级| 在线综合亚洲欧美在线视频| 97超碰免费在线观看| 动漫3d精品一区二区三区乱码| 欧美三级xxx| 欧美婷婷精品激情| 精品国产一区二区三区2021| 日韩成人在线免费观看| 日韩免费成人av| 欧美日本一区二区高清播放视频| 欧洲成人在线观看| 国产理论片在线观看| 成人av免费观看| 亚洲不卡1区| 美女隐私在线观看| 一区二区三区欧美久久| 国产在线观看福利| 久久av网站| 国产亚洲精品日韩| 麻豆成人在线视频| 青娱乐精品视频| 国产一区二区三区高清| 香蕉视频网站在线观看| 五月婷婷激情综合网| 涩多多在线观看| 一区二区三区韩国免费中文网站| 美女久久久久久久久久久| 三级视频在线观看| 高清在线不卡av| 亚洲午夜高清视频| 在线天堂资源| 欧美xxxx在线观看| 久艹在线观看视频| 日日嗨av一区二区三区四区| 欧美日韩另类视频| 无码中文字幕色专区| 成人影院网站ww555久久精品| 亚洲男人天堂手机在线| 免费麻豆国产一区二区三区四区| 蜜桃久久久久久久| 日本不卡一区| a一区二区三区| 亚洲国产高清高潮精品美女| 欧美精品xxxxx| 三级精品在线观看| 欧美极品视频一区二区三区| 色一情一乱一乱一区91av| 国产精品久久一卡二卡| 丁香啪啪综合成人亚洲| 国产精品高潮呻吟久久久久| 欧美成人亚洲成人| 无码人妻丰满熟妇精品区| av亚洲精华国产精华| 人妻无码一区二区三区四区| 99er精品视频| 精品久久久91| 91精品在线视频观看| 国产目拍亚洲精品99久久精品| 亚洲成熟丰满熟妇高潮xxxxx| 窝窝社区一区二区| 欧美一级高清免费| 午夜成人鲁丝片午夜精品| 亚洲福利国产精品| 国产精品成人99一区无码| 极品裸体白嫩激情啪啪国产精品| 999国内精品视频在线| 69成人在线| 欧美第一区第二区| 九九视频免费在线观看| 福利视频网站一区二区三区| 欧美成人精品免费| 日本韩国欧美超级黄在线观看| 538国产精品视频一区二区| 熟妇人妻av无码一区二区三区| 亚洲成人激情av| 波多野结衣a v在线| 日韩国产欧美在线视频| 亚洲视频在线二区| 日韩精品中文字幕一区二区| 欧美高清视频免费观看| 五月婷婷免费视频| 色狠狠桃花综合| 国产性猛交xx乱| 狠狠v欧美v日韩v亚洲ⅴ| 欧美精品久久96人妻无码| 国产又粗又硬又长又爽| 欧美ab在线视频| 国产精品初高中精品久久| 亚洲私拍视频| 中文字幕在线看视频国产欧美在线看完整| 在线亚洲欧美日韩| 亚洲自拍欧美精品| 日韩一级视频在线观看| 中文无码久久精品| 国产精品乱码视频| 在线日韩影院| 久久久国产精品x99av| 免费国产精品视频| 91国产成人在线| 黑鬼狂亚洲人videos| 日本女人一区二区三区| 一区二区三区四区国产| 成人av地址| 国产精品久久久久一区二区| 2024最新电影免费在线观看| 日韩精品欧美国产精品忘忧草| 亚洲精品国产欧美在线观看| 亚洲免费电影在线| 成人免费毛片糖心| 国产精品一区三区| 999香蕉视频| 国内精品99| 亚洲国产精品一区二区第四页av| 国产亚洲久久| 国产精品成久久久久三级| 在线看三级电影| 一区二区三区四区在线观看视频| 亚洲乱码在线观看| 成人精品国产福利| 欧美伦理视频在线观看| 狠狠噜噜久久| 一区在线电影| 亚洲人挤奶视频| 91在线免费看片| a成人v在线| 1769国产精品| 深夜国产在线播放| 一区二区三区日韩在线| 视频一区二区三区在线看免费看| 欧美一区二区免费视频| 午夜69成人做爰视频| 久久国产人妖系列| 乱妇乱女熟妇熟女网站| 欧美精品激情| 国产又粗又爽又黄的视频| 精品国产1区| 久久日韩精品| 成人福利一区| 91精品国产一区二区三区动漫 | 精品亚洲永久免费| 久久久亚洲欧洲日产国码αv| 男女视频网站在线观看| 久久精品免费一区二区三区| 日韩欧美一区二区三区四区| 欧美日韩看看2015永久免费| 国产精品v欧美精品∨日韩| 国产精品视频一区视频二区| 国产精品麻豆va在线播放| 六月婷婷综合| 欧美专区在线播放| 久久青草伊人| 57pao成人国产永久免费| av剧情在线观看| 欧美激情影音先锋| 欧美xxxx黑人又粗又长| 欧美福利在线观看| 久久香蕉一区| 久久久久成人网| 2019中文字幕在线电影免费| 久久精品人人做人人爽| 精品黄色免费中文电影在线播放| 中文字幕亚洲欧美在线| www亚洲人| 日韩小视频在线观看| 国产 日韩 欧美 精品| 日韩欧美一区在线| 国内精品国产成人国产三级| 欧美一区二区三区四区高清| 国产手机视频在线| 日韩午夜激情电影| 日本特级黄色片| 好吊成人免视频| av大全在线观看| 欧美在线免费视屏| 在线免费观看av片| 欧美一级一区二区| 亚洲成人久久精品| 亚洲国产古装精品网站| 毛片免费在线观看| 中文字幕免费精品一区| 福利在线视频网站| 九九精品在线视频| а√在线天堂官网| 奇米影视亚洲狠狠色| 久久99国产精品二区高清软件| 91精品美女在线| 99re8这里有精品热视频免费 | 亚洲一级片av| 成人丝袜视频网| 中文字幕第4页| 一色屋精品亚洲香蕉网站| 成人免费毛片东京热| 黄网站色欧美视频| 中文字幕激情视频| 欧美mv日韩mv| 爱爱爱免费视频在线观看| 麻豆国产精品va在线观看不卡 | 精品美女视频在线观看免费软件 | 成人免费观看在线观看| 国产91免费看片| crdy在线观看欧美| 精品视频在线观看| 午夜免费欧美电影| 精品免费视频123区| 日韩av免费大片| 亚洲中文字幕无码av永久| 首页亚洲欧美制服丝腿| 伊人五月天婷婷| 久久一区二区视频| 欧美 日韩 国产 一区二区三区| 精品久久久视频| 国产av精国产传媒| 亚洲天堂男人天堂| 久草免费在线色站| 欧洲成人午夜免费大片| 国产一区二区三区四区五区3d | 中文视频一区视频二区视频三区| 欧美日韩精选| 久久久久免费精品| 成人精品小蝌蚪| 成人做爰69片免网站| 亚洲欧美色图小说| 中文字幕 人妻熟女| 精品国产凹凸成av人导航| 日本www在线观看| 欧美在线xxx| 日本精品在线观看| 国产又爽又黄ai换脸| 国产精品呻吟| 国产一卡二卡三卡四卡| 国产精品卡一卡二卡三| 黄色av一级片| 亚洲成av人影院| 亚洲性猛交富婆| 亚洲男人天堂网| xxxx视频在线| 97视频热人人精品| 99国产**精品****| 成年人视频在线免费| av电影在线观看完整版一区二区| 免费中文字幕日韩| 日本久久一区二区三区| 神马久久精品| 欧美精品aaa| 一区二区三区四区视频免费观看| 亚洲激情一区二区| 免费看黄裸体一级大秀欧美| 午夜不卡久久精品无码免费| 亚洲免费av观看| www.狠狠干| 久久精品视频免费播放| 素人一区二区三区| 日韩久久精品一区二区三区| 亚洲一区黄色| bl动漫在线观看| 一区二区三区四区视频精品免费 | 性欧美丰满熟妇xxxx性久久久| 国产精品高潮久久久久无| 蜜臀尤物一区二区三区直播| 亚洲精品二三区| 欧美性爽视频| 亚洲iv一区二区三区| 国产精品久久久久久久久久10秀| 美女一区二区三区视频| 久久久久久99久久久精品网站| 国产精品xxxx喷水欧美| 亚洲国产精品视频在线观看| 麻豆蜜桃在线| 成人动漫视频在线观看完整版| 亚洲精品一二三**| 一级做a爰片久久| 国内久久婷婷综合| av最新在线观看| 欧美日韩亚洲综合一区| 亚洲s色大片| 国产日韩在线精品av| 欧美伊人影院| 911亚洲精选| 福利微拍一区二区| 蝌蚪视频在线播放| 日韩免费黄色av| 欧美自拍偷拍| 日本一本二本在线观看| 国产女主播一区| 91久久久久国产一区二区| 欧美夫妻性生活视频| 成人资源在线| 成人精品视频一区二区| 国产欧美精品在线观看| 五月天综合在线| 日韩免费视频线观看| 日本中文字幕在线观看| 成人在线免费网站| 日韩视频在线一区二区三区| 国产jjizz一区二区三区视频| 欧美午夜不卡视频| 欧美人与性动交α欧美精品济南到 | 欧美在线观看在线观看| 国产精品自产拍在线观看| 国产成人ay| 艹b视频在线观看| 亚洲精品国产品国语在线app| 国产自产一区二区| 日本欧美在线视频| 国产精品观看| 免费看黄色av| 精品剧情v国产在线观看在线| 在线男人天堂| 四虎影院一区二区三区| 国产福利91精品|