·Object类& System类

第05天API

今日内容介绍

·Object类& System类

·日期相关类

·包装类&正则表达式

·Date对象.toLocaleString()返回时间!

·Object类& System类

1.Object

1.概述

Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。所有类在创建对象的时候,最终找的父类就是Object。

在Object类众多方法中,我们先学习equals方法与toString方法,其他方法后面课程中会陆续学到。

·toString()方法

由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。

1.案例代码一:

packagecom.itheima_01;

/*

* StringtoString():返回该对象的字符串表示

*return getClass().getName() +"@" + Integer.toHexString(hashCode());

*getClass():返回一个字节码对象

*Integer.toHexString():返回指定参数的十六进制字符串形式

*hashCode():返回该对象的哈希码值(内部地址)

*

*

*

* booleanequals(Objectobj)

*

*/

publicclassObjectDemo {

publicstaticvoidmain(String[] args) {

Student s =newStudent();

s.name="zhangsan";

s.age= 18;

System.out.println(s.toString());//com.itheima_01.Student@737951b0

System.out.println(s);//说明我们输出一个对象就是默认输出这个对象的toString()方法

}

}

classStudentextendsObject {

Stringname;

intage;

/*

public String toString() {

return name + "@" + age;

}

*/

@Override

publicString toString() {

return"Student

[name="+name+", age="+age+"]";

}

}

3.equals()方法

equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类中的equals方法内部使用的就是==比较运算符。

在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写equals方法根据对象的属性值进行比较。

1.案例代码二:

packagecom.itheima_01;

importjava.util.ArrayList;

/*

* booleanequals(Objectobj)

*使用==来比较两个对象是否相等,则比较地址值是否相等

*/

publicclassObjectDemo2 {

publicstaticvoidmain(String[] args) {

Person p =newPerson("zhangsan",18);

Personp2=newPerson("zhangsan",19);

//boolean flag = p.equals(p2);

booleanflag = p.equals(newArrayList());

System.out.println(flag);

}

}

classPerson {

Stringname;

intage;

publicPerson(String name,intage) {

this.name= name;

this.age= age;

}

@Override

publicbooleanequals(Object obj) {

//提高效率

if(this== obj)

returntrue;

if(obj ==null)

returnfalse;

//提高健壮性

if(getClass() != obj.getClass())

returnfalse;

//向下转型

Person other = (Person) obj;

if(age!= other.age)

returnfalse;

if(name==null) {

if(other.name!=null)

returnfalse;

}elseif(!name.equals(other.name))

returnfalse;

returntrue;

}

/*@Override

public boolean equals(Object o) {

//提高效率当前对象和传递进来的对象地址值一样,则不用比较成员

if(this == o) {

return true;

}

//提高代码的健壮性

if(this.getClass() != o.getClass()) {

return false;

}

//向下转型

Person other = (Person) o;

if(!this.name.equals(other.name)) {

return false;

}

if(this.age != other.age) {

return false;

}

return true;

}*/

}

2.System

System类包含一些有用的类字段和方法。它不能被实例化。

1.成员方法

static voidarraycopy(Object src, int srcPos, Object dest, int destPos, int length) :

从src源数组的srcPos索引开始,复制length个元素

从destPost位置开始将这些元素放至到dest数组中

static longcurrentTimeMillis()

返回以毫秒为单位的当前时间

static voidexit(int status)

终止当前正在运行的Java虚拟机

static voidgc()

运行垃圾回收器

2.案例代码三:

packagecom.itheima_02;

/*

* System:包含一些有用的类字段和方法。它不能被实例化

* staticvoidarraycopy(Objectsrc,intsrcPos, Objectdest,intdestPos,intlength)

* staticlong currentTimeMillis()

* staticvoid exit(intstatus)

staticvoidgc()

*

*/

publicclassSystemDemo {

publicstaticvoidmain(String[] args) {

//method();

//method2();

//method3();

//static voidgc()

//Demo d = new Demo();

newDemo();

System.gc();

}

privatestaticvoidmethod3(){

//static void exit(intstatus) :终止虚拟机

for(inti = 0; i < 100000;

i++) {

System.out.println(i);

if(i == 100) {

System.exit(0);

}

}

}

privatestaticvoidmethod2(){

/*

*static long currentTimeMillis() :以毫秒值返回当前系统时间

*这个毫秒的时间是相对时间,相对于1970-1-1 00:00:00:0

*1970-1-1 00:00:01 : 1000

*1970-1-1 00:01:00: 1000 * 60

*1970-1-1 01:00:00: 1000 * 60 * 60

*1000毫秒= 1秒

*

*/

//System.out.println(System.currentTimeMillis());

longstart = System.currentTimeMillis();

for(inti = 0; i < 100000;

i++) {

System.out.println(i);

}

longend = System.currentTimeMillis();

System.out.println(end - start);

}

privatestaticvoidmethod(){

/*

* staticvoidarraycopy(Objectsrc,intsrcPos, Objectdest,intdestPos,intlength)

*复制数组

*参数1:源数组

*参数2:源数组的起始索引位置

*参数3:目标数组

*参数4:目标数组的起始索引位置

*参数5:指定接受的元素个数

*/

int[] src = {1,2,3,4,5};

int[] dest =newint[5];

System.arraycopy(src, 2, dest, 4, 3);

for(inti = 0; i < dest.length; i++) {

System.out.print(dest[i]);

}

}

}

classDemo {

@Override

protectedvoidfinalize()throwsThrowable {

System.out.println("我被回收了");

}

}

2.日期相关类

1.Date

Date:表示特定的瞬间,精确到毫秒,他可以通过方法来设定自己所表示的时间,可以表示任意的时间

1.Date类的构造方法

Date():创建的是一个表示当前系统时间的Date对象

Date(long

date):根据"指定时间"创建Date对象

2.案例代码四:

packagecom.itheima_03;

importjava.util.Date;

/*

* Date:表示特定的瞬间,精确到毫秒,他可以通过方法来设定自己所表示的时间,可以表示任意的时间

*System.currentTimeMillis():返回的是当前系统时间,1970-1-1至今的毫秒数

*

*构造方法:

*Date():创建的是一个表示当前系统时间的Date对象

Date(long date):根据"指定时间"创建Date对象

*/

publicclassDateDemo {

publicstaticvoidmain(String[] args) {

//Date()

//Date d = new Date();

//System.out.println(d);//ThuAug26 14:17:28 CST 2049

//System.out.println(d.toLocaleString());

//Date(long date)

Date d2 =newDate(1000 * 60 * 60 *

24);//时区有时差

System.out.println(d2.toLocaleString());

}

}

3.Date类常用方法

void setTime(long time)

long getTime()

4.案例代码五:

packagecom.itheima_03;

importjava.util.Date;

/*

* Date的常用用方法

毫秒值--- Date

设置

返回值是void,参数long

void setTime(long time)

Date(long date)

Date ---毫秒值

获取

返回long,无参数

long getTime()

*/

publicclassDateDemo2 {

publicstaticvoidmain(String[] args) {

Date d =newDate();//默认当前系统时间

//d.setTime(1000 * 60 * 60 * 24 * 2);

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

System.out.println(d.getTime());//172800000

d.setTime(172800000L);

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

}

}

2.DateFormat& SimpleDateFormat

DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如SimpleDateFormat类)允许进行格式化(也就是日期->文本)、解析(文本->日期)和标准化。

我们通过这个类可以帮我们完成日期和文本之间的转换。

继续阅读API,DateFormat可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。

1.DateFormat&SimpleDateFormat的常用方法

要格式化一个当前语言环境下的日期也就是日期->文本),要通过下面的方法来完成。DateFormat是抽象类,我们需要使用其子类SimpleDateFormat来创建对象。

A:SimpleDateFormat构造方法

B:DateFormat类方法

2.案例代码六:

packagecom.itheima_04;

importjava.text.ParseException;

importjava.text.SimpleDateFormat;

importjava.util.Date;

/*

* SimpleDateFormat:

*格式化:

*Date --- String

*2049-8-26 2049年8月26日

*String format(Date date)

*解析:

*String --- Date

*"2049-8-26"

*Date parse(String source)

*

*构造方法:

*SimpleDateFormat():使用默认的模式进行对象的构建

*SimpleDateFormat(String pattern):使用的指定的模式进行对象的构建

*

*注意:Exception in thread "main" java.text.ParseException: Unparseable

date: "49年9月26日下午1:29"

*解析的字符串,模式必须和构建对象的模式一样

*

*/

public classSimpleDateFormatDemo {

public static voidmain(String[] args)throwsParseException{

//method();

//method2();

//使用指定的模式进行对象的构建

//1999年9月1日10:10:10

//4个小姨2个大美眉和2个小弟弟

SimpleDateFormatsdf =newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss");

//格式化

Datedate =newDate();

Strings = sdf.format(date);

System.out.println(s);//2049年08月26日13:39:12

//解析

Dated = sdf.parse("2049年08月26日13:39:12");

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

}

private static voidmethod2()throwsParseException{

//使用指定的模式进行对象的构建

//1999年9月1日

SimpleDateFormatsdf =newSimpleDateFormat("yyyy年MM月dd日");

//格式化

Datedate =newDate();

Strings = sdf.format(date);

System.out.println(s);//2049年08月26日

//解析

Dated = sdf.parse("2049年08月26日");

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

}

private static voidmethod()throwsParseException{

//使用默认模式进行对象的构建

SimpleDateFormatsdf =newSimpleDateFormat();

//创建日期对象

Datedate =newDate();

//格式化把日期对象转换成字符串

Strings = sdf.format(date);

System.out.println(s);//49-8-26下午1:29

//解析把字符串转换成日期对象

Dated = sdf.parse("49年9月26日下午1:29");

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

}

}

3.案例代码七:

package com.itheima_04;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

/*

*需求:求出你来这个世界上多少天

*/

public class SimpleDateFormatTest {

public static void main(String[] args) throws

ParseException {

//出生日期

String birthday = "1998-01-01";

//今天日期

String now = "2000-01-01";

SimpleDateFormat sdf = new

SimpleDateFormat("yyyy-MM-dd");

//将字符串转换成日期对象

Date d1 = sdf.parse(birthday);

Date d2 = sdf.parse(now);

//将日期对象转换成long类型

long l = d1.getTime();

long l2 = d2.getTime();

System.out.println((l2 - l) / 1000 / 60 / 60 /

24);

}

}

3.Calendar

1.Calendar类概述

Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。

Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言敏感内容处理好,再返回子类对象,如下:

Calendar类静态方法

Calendarc = Calendar.getInstance();//返回当前时间

2.Calendar类常用方法

3.案例代码八:

packagecom.itheima_05;

importjava.util.Calendar;

/*

* Calendar:日历,提供了一些操作年月日时的方法

*

*获取

*修改

*添加

*

*

*/

publicclassCalendarDemo {

publicstaticvoidmain(String[] args) {

//static Calendar getInstance()

Calendar c = Calendar.getInstance();

//void set(intfield,intvalue):把指定的字段修改成指定的值

//c.set(Calendar.DAY_OF_MONTH, 20);

//void add(intfield,intamount):在指定的字段上加上指定的值

c.add(Calendar.DAY_OF_MONTH, -1);

//intget(intfield) //返回给定日历字段的值

//public static finalintYEAR 1

//System.out.println(Calendar.YEAR);

//intyear = c.get(1);

intyear = c.get(Calendar.YEAR);

intmonth = c.get(Calendar.MONTH) + 1;

intday = c.get(Calendar.DAY_OF_MONTH);

System.out.println(year +"年"+ month +"月"+ day +"日");

}

}

3.包装类&正则表达式

1.包装类

在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的。而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型,考试成绩需要转换成double类型等。那么,想实现字符串与基本数据之间转换怎么办呢?

Java中提供了相应的对象来解决该问题,基本数据类型对象包装类:java将基本数据类型值封装成了对象。封装成对象有什么好处?可以提供更多的操作基本数值的功能。

8种基本类型对应的包装类如下:

其中需要注意int对应的是Integer,char对应的Character,其他6个都是基本类型首字母大写即可。

2.包装类的常用方法

A:构造方法:

B:成员方法:

1.案例代码九:

packagecom.itheima_06;

/*

*需求:判断一个数是否符合int类型的范围

*由于基本数据类型只能做一些简单的操作和运算,所以Java为我们封装了基本数据类型,为每种基本数据类型提供了包装类

*包装类就是封装了基本数据类型的类,为我们提供了更多复杂的方法和一些变量

*

*byteByte

*shortShort

*charCharacter

*intInteger

*longLong

*floatFloat

*doubleDouble

*booleanBoolean

*

* Integer:

*String ---int

*方式1:intintValue()

*方式2:staticintparseInt(String s)

*int--- String

*方式1:+ ""

*方式2:String toString()

*

*构造方法:

*Integer(intvalue)

*Integer(String s)

*/

publicclassIntegerDemo {

publicstaticvoidmain(String[] args) {

/*intn = 10;

if(n >= Math.pow(-2, 31) && n <=

Math.pow(2, 31) -1) {

System.out.println("符合");

}

else {

System.out.println("不符合");

}*/

Integer i =newInteger("10");

System.out.println(i);

inta = i.intValue();

System.out.println(a + 10 );

intb = Integer.parseInt("20");

System.out.println(b + 30);

Integer i2 =newInteger(40);

Strings = i2.toString();

System.out.println(s);

Strings2 = Integer.toString(50);

System.out.println(s2);

}

}

3.包装类的自动装箱与拆箱

在需要的情况下,基本类型与包装类型可以通用。有些时候我们必须使用引用数据类型时,可以传入基本数据类型。

比如:

基本类型可以使用运算符直接进行计算,但是引用类型不可以。而基本类型包装类作为引用类型的一种却可以计算,原因在于,Java”偷偷地”自动地进行了对象向基本数据类型的转换。

相对应的,引用数据类型变量的值必须是new出来的内存空间地址值,而我们可以将一个基本类型的值赋值给一个基本类型包装类的引用。原因同样在于Java又”偷偷地”自动地进行了基本数据类型向对象的转换。

自动拆箱:对象转成基本数值

自动装箱:基本数值转成对象

1.案例代码十:

packagecom.itheima_06;

importjava.util.ArrayList;

/*

* JDK1.5特性:自动装箱和拆箱

*

*/

publicclassIntegerDemo2 {

publicstaticvoidmain(String[] args) {

//Integer i = new Integer(10);

//自动装箱

//相当于:Integer i = new Integer(10);

//Integer i = 10;

//自动拆箱

//相当于inta = i.intValue();

//Integer i = 10;

//inta = i;

Integer i = 10;

Integer i2 = 20;

Integeri3= i + i2;

/*

* Integeri3 = new Integer(i.intValue() + i2.intValue());

*

*/

ArrayListlist =newArrayList();

list.add(1);//自动装箱,list.add(new

Integer(1));

}

}

4.正则表达式

1.正则表达式概述

正则表达式是专门解决字符串规则匹配的工具。

正则表达式也是一个字符串,用来定义匹配规则。

参照帮助文档,在Pattern类中有简单的规则定义,可以结合字符串类的方法使用。

2.正则表达式匹配规则

参照帮助文档,在Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。我们来学习语法规则。

正则表达式的语法规则:

字符:x

含义:代表的是字符x

例如:匹配规则为"a",那么需要匹配的字符串内容就是 ”a”

字符:\\

含义:代表的是反斜线字符'\'

例如:匹配规则为"\\",那么需要匹配的字符串内容就是 ”\”

字符类:[abc]

含义:代表的是字符a、b或c

例如:匹配规则为"[abc]",那么需要匹配的内容就是字符a,或者字符b,或字符c的一个

字符类:[^abc]

含义:代表的是除了a、b或c以外的任何字符

例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符

字符类:[a-zA-Z]

含义:代表的是a到z或A到Z,两头的字母包括在内

例如:匹配规则为"[a-zA-Z]",那么需要匹配的是一个大写或者小写字母

字符类:[0-9]

含义:代表的是0到9数字,两头的数字包括在内

例如:匹配规则为"[0-9]",那么需要匹配的是一个数字

字符类:[a-zA-Z_0-9]

含义:代表的字母或者数字或者下划线(即单词字符)

例如:匹配规则为" [a-zA-Z_0-9] ",那么需要匹配的是一个字母或者是一个数字或一个下滑线

预定义字符类:.

含义:代表的是任何字符

例如:匹配规则为" . ",那么需要匹配的是一个任意字符。如果,就想使用.的话,使用匹配规则"\\."来实现

预定义字符类:\d [0-9]

含义:代表的是0到9数字,两头的数字包括在内,相当于[0-9]

例如:匹配规则为"\d ",那么需要匹配的是一个数字

预定义字符类:\w[a-zA-Z_0-9]

含义:代表的字母或者数字或者下划线(即单词字符),相当于[a-zA-Z_0-9]

例如:匹配规则为"\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线

数量词:X?

含义:代表的是X出现一次或一次也没有

例如:匹配规则为"a?",那么需要匹配的内容是一个字符a,或者一个a都没有

数量词:X*

含义:代表的是X出现零次或多次

例如:匹配规则为"a*",那么需要匹配的内容是多个字符a,或者一个a都没有

数量词:X+

含义:代表的是X出现一次或多次

例如:匹配规则为"a+",那么需要匹配的内容是多个字符a,或者一个a

数量词:X{n}

含义:代表的是X出现恰好n次

例如:匹配规则为"a{5}",那么需要匹配的内容是5个字符a

数量词:X{n,}

含义:代表的是X出现至少n次

例如:匹配规则为"a{5, }",那么需要匹配的内容是最少有5个字符a

数量词:X{n,m}

含义:代表的是X出现至少n次,但是不超过m次

例如:匹配规则为"a{5,8}",那么需要匹配的内容是有5个字符a到8个字符a之间

3.案例代码十一:

packagecom.itheima_07;

/*

*校验qq号码

*要求必须是5-15位

*0不能开头

*必须都是数字

正则表达式:就是一套规则,可以用于匹配字符串

boolean matches(Stringregex):判断当前字符串是否匹配指定的正则表达式,如果匹配则返回true,否则返回false

*

*

*/

publicclassRegexDemo {

publicstaticvoidmain(String[] args) {

String qq ="12a345";

/*boolean flag = checkQQ(qq);

System.out.println(flag);*/

booleanflag = qq.matches("[1-9][0-9]{4,14}");

System.out.println(flag);

}

publicstaticbooleancheckQQ(String qq) {

intlength = qq.length();

//要求必须是5-15位

if(length < 5 || length > 15) {

returnfalse;

}

//0不能开头

if(qq.startsWith("0")) {

returnfalse;

}

//必须都是数字

for(inti = 0; i < length;

i++) {

//得到参数的每一个字符

charc = qq.charAt(i);

if(c <'0'|| c >'9') {

returnfalse;

}

}

returntrue;//符合要求

}

}

4.案例代码十二:

package com.itheima_07;

/*

*判断字符串”qaq”中间的字符是否是元音

*

*aeiou

*AEIOU

*

*/

public class RegexDemo2 {

public static void main(String[] args) {

boolean flag = check2("qbq");

System.out.println(flag);

}

public static boolean check(String s) {

s = s.toLowerCase();

char ch = s.charAt(1);

/*if(ch == 'a' || ch == 'e' || ch == 'i' || ch ==

'o' || ch == 'u') {

return true;

}

return false;*/

String str = "aeiou";

return str.contains(ch + "");

}

public static boolean check2(String s) {

return s.matches("\\w[aeiouAEIOU]\\w");

}

}

5.案例代码十三:

package com.itheima_07;

/*

*切割字符串"aa,bb,cc";

切割字符串"-1 99 4 23";

切割字符串"-199 423";

String[]split(String regex)根据给定正则表达式的匹配拆分此字符串。

*

*/

public class RegexDemo3 {

public static void main(String[] args) {

//method();

//method2();

String s = "-199 423";

String[] arr = s.split(" +");

print(arr);

}

private static void method2() {

String s = "-1 99 4 23";

String[] arr = s.split(" ");

print(arr);

}

private static void method() {

String s = "aa,bb,cc";

String[] arr = s.split(",");

print(arr);

}

public static void print(String[] arr) {

for (int i = 0; i < arr.length; i++) {

System.out.println(arr[i]);

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容