java程序语言基础

画布 1.png

java程序语言基础

java基础语法

界面输出-输出语句

System.out.println();在打印信息后会自动换行
System.out.print();在打印信息后不会自动换行
例如:

public class Main() {
    public static void main(String [] args) {
        // 在大括号里输入代码
        
        // 打印信息后自动换行
    System.out.println("姓名:王艺博");
    System.out.println("年龄:18");
    }
}


/*输出结果为:
 姓名:王艺博
 年龄:18
 */    
这里的 // 是可以注释的意思单行代码 ,在//后面的写的内容不会在输出界面显示 。还有/**/这个的意思是多行注释,可以注释多行内容或代码,在两个星号中间输入的内容是不会在输出界面显示的
public class Main() {
    public static void main(String [] args) {
        // 在大括号里输入代码
        
       // 打印信息后不会自动换行
        System.out.print("姓名:王艺博");
        System.out.print("年龄:18");
    }
}

/*输出结果为:
 姓名:王艺博年龄:18
 */   

变量

语法格式

  • 数据类型(确定变量类型) 变量名(确定变量名) ,变量名 = 值(给变量一个默认值);例如:int num; num = 12;
  • 数据类型 变量名 = 值 如:int a = 12; ";"英文状态下的字符
    注意:
    • 变量可以包括数字,但不能以数字开头
    • 变量必须以字母开头、下划线“_”或“$”符开头
    • 除了“_”或“$”以外,变量名不能包含任何特殊字符
    • 不能使用java语言关键字,如 int、public、class等
    • java语言区分大小写
    • 同时,为了我们的代码更加规范我们还应该遵循以下命名规范:
      1. 尽量使用有意义的变量名,变量名要简短且能清楚地表明变量的作用
      1. 第一个单词首字母小写,其后单词的首字母大写

java数据类型

  • 基本数据类型

    • 整数类型

      • byte :节约空间,占用空间只有int的四分之一 例如:byte b = 5;
      • short:节约空间,占用空间只有int的二分之一 例如:short s = 10;
      • int :一般地整型变量默认为 int 类型(常用) 例如:int i = 12;
      • long:主要用在存储比较大的数据 例如:long l = 23121312L; 注意:这里给变量赋的值要加L
    • 浮点数类型

      • float:用于储存带有小数的数据 例如:float a = 1.11f; 注意:这里给变量赋的值要加f
      • double:用于储存带有小数的数据(常用) 例如:double high = 1.75;
  • 特殊数据类型

    • 布尔类型

      • boolean:只有两个值true(真)/false(假), 默认值为false 例如:boolean flag = true;
    • 字符型

      • char:用于储存单个字符,例如,性别“男”和“女” char sex = '男'; 注意:这里是用的单引号
  • 引用数据类型

    • 字符串型

      • String: 用于储存一串字符,例如:String haha = "哈哈哈哈哈哈哈";

public class Main() {
    public static void main(String [] args) {
        // 在大括号里输入代码
        byte b = 5;
        short s = 10;
        int i = 12;
        long l = 23121312L;
        float a = 1.11f;
        double high = 1.75;
        char sex = '男';
        boolean flag = true;
        String haha = "哈哈哈哈哈哈哈";
        // 这里直接打印变量名
        System.out.println(b);
        System.out.println(s);
        System.out.println(i);
        System.out.println(l);
        System.out.println(a);
        System.out.println(high);
        System.out.println(sex);
        System.out.println(flag);
        System.out.println(haha);
    }
    
    /*
        输出的结果为:
        5
        10
        12
        23121312L
        1.11f
        1.75
        男
        true
        哈哈哈哈哈哈哈
    */
}

运算符

  • 赋值运算符

    • = 说明: 将等号右边的值赋值给左边的变量 例如:int money = 100;使用“=”将数值100放入变量money的储存空间中
  • 算数运算符

    • % + - * / 说明 : 数学中的加减乘除, %:取余 - 左操作数除以右操作数的余数
  • 关系运算符

    • != > < >= <= == 说明 : 不等于、大于、小于、大于等于、小于等于、等于 例如:99 != 100,结果为true(真)、99 > 100,结果为false(假)、99 < 100,结果为true(真)、99 >= 100,结果为false(假)、99 <= 100,结果为true(真)、地球的大小 == 篮球的大小,结果为false
  • 逻辑运算符

    • && 说明: 与、并且 当且仅当两个操作数都为真,条件才为真。 例如: (A && B)为假。

    • || 说明: 或、或者 如果任何两个操作数任何一个为真,条件为真。 例如: (A | | B)为真。

    • ! 说明: 非 用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false 例如:!(A && B)为真。

public class Main {
    public static void main(String[] args) {
        // 把“=”号后面的值赋值给等号前面的变量
        System.out.println("赋值运算符和算术运算符,变量名是自己定义的,如下面的num,num1,num2等等");
        int num = 7+1;// + 加
        int num2 = 9-1;// - 减
        int num3 = 2*4;// * 乘
        int num4 = 16/2;// 除/
        int num5 = 18%10;// 取余数 %
        System.out.println(num);// 8
        System.out.println(num2);// 8
        System.out.println(num3);// 8
        System.out.println(num4);// 8
        System.out.println(num5);// 8
        System.out.println("----------------------------");
        System.out.println("关系运算符,返回true和false");
        int num99 = 99;
        int num100 = 100;
        System.out.println(num99 != num100);// true
        System.out.println(num99 > num100);// false
        System.out.println(num99 < num100);// true
        System.out.println(num99 >= num100);// false
        System.out.println(num99 <= num100);// true
        System.out.println(num99 == num100);// false
    }
    /*  打印结果为:
        赋值运算符和算术运算符,变量名是自己定义的,如下面的num,num1,num2等等
        8
        8
        8
        8
        8
        ----------------------------
        关系运算符
        true
        false
        true
        false
        true
        false
    */
}

数据类型转换

  • 自动数据类型转换:1.要转换的两种类型要兼容(整数和浮点型)互相兼容。2.我要转换的类型大于源类型 例如:int num = 10;double d = num;这里double类型变量分配的空间大于int类型分配的空间

  • 强制类型转换:(数据类型)表达式 例如:double d = 12.13; int i = (int)i;运行后i的值为12

public class demo01 {
    public static void main(String[] args) {
        // 数据类型转换,直接转换
        int num = 12;
        double num1 = num;// 12.0  因为double是浮点数类型,所以int(整数)类型的num的值转换为double(浮点数)类型num1的值会加个.0
        System.out.println("原数据:" + num);
        System.out.println("转换double类型后:" + num1);

        // 强制转换
        double num2 = 12.99;
        int num3 = (int)num2;// 12  因为int是整数类型,所以double(浮点数)类型的num2的值转换为int(整数)类型num3的值会把小数点和后面的值去掉,这里不遵循四舍五入方法
        System.out.println("原数据:" + num2);
        System.out.println("转换int类型后:" + num3);
    }
}
/*  输出结果为:
        原数据:12
        转换double类型后:12.0
        原数据:12.12
        转换int类型后:12
*/

Scanner对象

java.util.Scanner是java5的新特征,我们可以通过Scannner类来获取用户的输出。

Scanner类:

    Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据。

    Scanner使用步骤:

    导包:import java.util.Scanner;

    创建对象实例:Scanner sc = new Scanner(System.in);

基本语法:

Scanner s = new Scannner(System.in);
import java.util.Scanner;

public class demo01 {

    public static void main(String[] args) {

        //创建Scanner引用类型的变量

        Scanner sc = new Scanner(System.in);

        //获取数字

        System.out.println("请输入一个数字");

        int n = sc.nextInt();

        System.out.println("n的值为" + n);

        //获取字符串

        System.out.println("请输入一个字符串");

        String str = sc.next();

        System.out.println("str的值为" + str);

    }

}

Scanner方法:

next():

  • 1.一定要读取有效字符后才可以结束输入。

  • 2.对输入字符前遇到的空白,next()方法可以自动将空白去掉

  • 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符

  • next()方法不能得到带有空格的字符串

流程控制语句

  • if选择结构

    • if单选择结构:

      语法:

      if(布尔表达式){
          //如果布尔表达式为true将执行的语句
      }
      
      public class demo02 {
          public static void main(String[] args) {
              if ( 1+1 == 2 ) {
                  System.out.println("1+1= 2");
              }
          }
      }
      /*
          打印结果
          1+1= 2
      */
      
    • if双选择结构:

      语法:

      if(布尔表达式){
          //如果布尔表达式为true将执行的语句
      }else{
          //如果布尔表达式为false将执行语句
      }
      
      public class demo02 {
          public static void main(String[] args) {
              if ( 1+1 == 3 ) {
                  System.out.println("1+1= 2");
              }else {
                  System.out.println("1+1= 3");
              }
          }
      }
      /*  打印结果
          1+1= 3
      */
      
    • if多选择结构:

      语法:

      if(布尔表达式1){
          //如果布尔表达式1的值为true执行代码
      }else if(布尔表达式2){
          //如果布尔表达式2的值为ture执行代码
      }else if(布尔表达式3){
          //如果布尔表达式3的值为true执行代码
      }else{
          //如果以上表达式的值都不为true执行代码
      }
      
      public class demo02 {
          public static void main(String[] args) {
              System.out.println("请输入你的成绩:");
              Scanner scanner = new Scanner(System.in);
              int num = scanner.nextInt();
              if ( num == 100 ) {
                  System.out.println("奖励100元");
              }else if ( num <100 && num >= 80) {
                  System.out.println("奖励95元");
              }else if ( num <80 && num >= 60) {
                  System.out.println("奖励60元");
              }else if ( num < 60 && num >= 0) {
                  System.out.println("没有奖励");
              }else{
                  System.out.println("输入的成绩不合法");
              }
          }
      }
      /*打印结果
          请输入你的成绩:
              88
          奖励95元
      
          
      */
      
      
    /**
     * if 语句至多有一个else语句,else在所有的else if语句之后。
     * if 语句可以由若干个else if 语句,他必须在else语句之前。
     * 一旦其中一个else if 语句检测为true,其他的else if语句以及else语句都将跳过执行。
     */
    

    嵌套的if结构:

    if(布尔表达式){
        //如果布尔表达式为true将执行的语句
        if(布尔表达式){
        //如果布尔表达式为true将执行的语句
      }
    }
    
    
    public class Demo06 {
        public static void main(String[] args) {
            System.out.println("输入比赛成绩:");
            Scanner scanner = new Scanner(System.in);
            double miao = scanner.nextDouble();
            if (miao <= 10 ) {
                System.out.println("请输入性别:");
                String sex = scanner.next();
                if ("男".equals(sex)) {
                    System.out.println("进入男子组");
                }else if ("女".equals(sex)){
                    System.out.println("进入女子组");
                }else{
                    System.out.println("额...");
                }
            }else{
                System.out.println("无法进入决赛");
            }
            scanner.close();
        }
    }
    /*    打印结果
      输入比赛成绩:
      10
      请输入性别:
      男
      进入男子组
    */
    
    
  • switch选择结构

    • switch(expression){
          case value :   //value是变量类型
              //语句
              break; //可选,如果不打break会直接执行下一个分支
          case value :
              //语句
              break; //可选
          //你可以有任意数量的case语句
          default ://可选
              //语句
      }
      
      

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入快捷键:");
        int num = scanner.nextInt();
        switch (num) {
            case 1:
                System.out.println("爸爸");
                break;
            case 2:
                System.out.println("妈妈");
                break;
            case 3:
                System.out.println("爷爷");
                break;
            case 4:
                System.out.println("奶奶");
                break;
            default:
                System.out.println("尚未设置此数字的自动拨号");
        }
        scanner.close();
    }
}
/*  打印结果
    请输入快捷键:
    3
    爷爷

*/

```

循环结构

  • while

  • do-while

  • for

    • while循环:

      while(布尔表达式){
          //循环内容
      }
      
      

    public class Demo01 {
    public static void main(String[] args) {
    System.out.println("学习是否合格?(y/n)");
    Scanner scanner = new Scanner(System.in);
    String answer = scanner.next();
    while ("n".equals(answer)) {
    System.out.println("上午学理论!");
    System.out.println("下午学编程!");
    System.out.println("学习是否合格?(y/n)");
    answer = scanner.next();
    }
    System.out.println("完成学习任务!");
    scanner.close();
    }
    }
    /* 打印结果
    学习是否合格?(y/n)
    n
    上午学理论!
    下午学编程!
    学习是否合格?(y/n)
    y
    完成学习任务!

    */

    
    * 只要布尔表达式为true,循环就一直执行下去。
    * **我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环。**
    * 少部分情况需要循环一直执行,比如服务器的请求响应监听等。
    * 循环条件一直为true就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环。会影响程序性能或者造成程序卡死崩溃!
    
    - #### do...while 循环:
    
    * 对于while 语句而言,如果不能满足条件则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
    * do...while 循环和 while 循环相似,不同的是 do...while循环至少执行一次。
    
    ```java
    do {
        //代码语句
    }while(布尔表达式);
    package edu.xcdq;
    
    public class Demo03 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String shifouhege = "";
            do {
                System.out.println("上机编写程序");
                System.out.println("是否合格:(y/n)");
                shifouhege = scanner.next();
            }while (shifouhege.equals("n")) ;
            System.out.println("恭喜你合格了");
        }
    }
    /*
        上机编写程序
        是否合格:(y/n)
        n
        上机编写程序
        是否合格:(y/n)
        y
        恭喜你合格了
    
    */
    
    • While 和do...while的区别:
    • while先判断后执行。do...while是先执行后判断!
    • do...while总是保证循环体会被至少执行一次!这是它们的主要差别。
    • For循环:

      • 虽然所有循环结构都可以用while或者do...while表示,但java提供了另一种语句——for循环,使一些循环结构变得简单。
      • for循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环结构。
      • for循环执行的次数是在执行前都确定的。语法格式如下:
      for(初始化;布尔表达式;更新){
          //代码语句
      }
      
      public class Demo01 {
          public static void main(String[] args) {
              for (int i = 0;i < 10;i++) {
                  System.out.println( "第" + i + "次循环" );
              }
          }
      }
      /*  打印结果
          第0次循环
          第1次循环
          第2次循环
          第3次循环
          第4次循环
          第5次循环
          第6次循环
          第7次循环
          第8次循环
          第9次循环
      */
      
      

跳转语句

  • break:通常用在switch、循环语句中来终止语句
    public class demo09 {
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                if ( i == 5 ) {// 第五次循环结束
                    break;
                }
                System.out.println("第" + i + "次循环");
            }
        }
    }
    /*
      第0次循环
      第1次循环
      第2次循环
      第3次循环
      第4次循环
    */
    
    
  • continue:通常用于循环语句,跳过本次循环,执行下一次循环
  • public class demo09 {
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                if ( i == 5 ) {// 跳出第五次循环
                    continue;
                }
                System.out.println("第" + i + "次循环");
            }
        }
    }
    /*  打印结果
      第0次循环
      第1次循环
        第2次循环
      第3次循环
      第4次循环
      第6次循环
      第7次循环
      第8次循环
      第9次循环
    
    */
    

数组

  • 储存多个数据
    使用方法
    int [] scores; 声明:告诉操作系统有一个数组的变量 叫scores
    int [] scores1 = new int[5];声明并初始化 申请了内存空间,申请空间成功,则在内存中初始化为0
    int [] scores2 = {1.2.5.4} 声明数组并直接给值
    //定义:给定元素的值

    scores1[0] = 45;
    scores1[1] = 55;
    scores1[2] = 65;
    scores1[3] = 75;
    scores1[4] = 85;

    数组插入元素

    package edu.xcdq;
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    /**
     * @author 王艺博
     * @date 2021/3/25 10:29
     */
    public class Demo06 {
        public static void main(String[] args) {
            /**
             * 插入新元素,依旧保持原数组有序
             */
            int [] scores = new int[7];
            scores[0] = 99;
            scores[1] = 88;
            scores[2] = 77;
            scores[3] = 66;
            scores[4] = 55;
            scores[5] = 44;
            // 1、获取要插入的值
            System.out.println("请输入你要插入的值:");
            Scanner scanner = new Scanner(System.in);
            int num = scanner.nextInt();
            // 2、找到要插入新值的位置
            int index = 0;
            for (int i = 0; i < scores.length; i++) {
                if ( num > scores[i] ) {
                    index = i;
                    break;
                }
            }
            // 2.1 打印原数组
            System.out.println(Arrays.toString(scores));
            // 3.把元素向后移动  index <-> length-1
            for (int i = scores.length-1; i > index; i--) {
                System.out.println("把" + (i-1) + "位置的元素" + scores[i-1] + "移动到" + i + "位置" + scores[i]);
                scores[i] = scores[i-1];
                System.out.println(Arrays.toString(scores));
            }
            // 4、插入新值
            System.out.println("在" + index + "位置" + scores[index] + "插入新值:" + num);
                scores[index] = num;
            // 5、打印插入后的结果
            System.out.println("降序");
            for (int i = 0; i < scores.length; i++) {
                System.out.print(scores[i] + "\t");
            }
            System.out.println();
            System.out.println("升序");
            for (int i = scores.length-1; i >= 0; i--) {
                System.out.print(scores[i] + "\t");
            }
    
        }
    }
    /*    打印结果
    请输入你要插入的值:
    60
    [99, 88, 77, 66, 55, 44, 0]
    把5位置的元素44移动到6位置0
    [99, 88, 77, 66, 55, 44, 44]
    把4位置的元素55移动到5位置44
    [99, 88, 77, 66, 55, 55, 44]
    在4位置55插入新值:60
    降序
    99    88  77  66  60  55  44  
    升序
    44    55  60  66  77  88  99  
    */
    

java面向对象

类 例如:学生类

  • 对象
    • 属性 名字、年龄、性别、身高、等等
    • 方法 也就是行为 比如 吃、玩、睡觉
    • 语法格式:

      public class Student() {
          // 定义属性部分
          // 属性1的类型 属性1
          // 属性2的类型 属性2
          // 属性n的类型 属性n
      
          // 定义方法部分
          // 方法1
          // 方法2
          // 方法n
      
      }
      
  ```java
  public class Student {
      // 属性  定义在类中,叫属性,有对应的默认值 如果基本数据类型的变量定义在方法中,不给值则没有默认值
      String name;
      int age;
      char sex;
      double high;
      double height;
      // 方法
      public void eat() {
          System.out.println("吃吃吃");
      }
      public void play() {
          System.out.println("玩耍");
      }
      public void sleep() {
          System.out.println("睡觉");
      }
  
  }
  
  ```

  ### 对象的创建与使用:

  #### 语法格式:

  ###### 类名 对象名 = new 类名();

  ###### 在创建类的对象时,需要用到java中的new关键字 

  ###### 例如:Student wangyibo = new Student();

  ###### 在java中要引用对象的属性和方法,需要使用“.”操作符,对象名在“.”前面,属性或方法在“.”后面

  #### 语法格式

  ###### 对象名.属性          引用对象的属性

  ###### 对象名.方法          引用对象的方法

  ###### 例如:创建Student类的对象后,就可以给对象的属性赋值或调用方法了,代码如下

  ```java
  package demo;  // 包 包名
  /*
   *  public  公有的,公共的    其他程序都可以访问,最大的权限,其他程序都能访问
   *  class   类
   *  Main    类的名称,随便取名字,最好有意义的,一般要求首字母大写
   *
  */
  
  public class Main {
      /*
      * public  公有的,公共的     其他程序都可以访问,最大的权限,其他程序都能访问
      * static  静态的           没有对象也可以调用,属于公共资源
      * void    空              方法的返回值,由于main是主方法,不需要跟任何程序返回内容,因此就写空
      * main    主要的           方法的名字,可以随便取,但是入口主方法只能写成main,自定义的方法可以自己取,建议有意义,建议首字母小写,驼峰命名法
      * (String[] args)         方法的参数  String[] -> 参数的类型 args 数组的名字
      * */
      public static void main(String[] args) {
          // 对象的创建  类型 对象名 = new 类名()
          Student wangyibo = new Student();
          // 属性的赋值
          wangyibo.name = "王艺博";
          wangyibo.age = 18;
          wangyibo.sex = '男';
          wangyibo.high = 1.75;
          wangyibo.height = 63;
          // 属性的调用
          System.out.println(wangyibo.name);
          System.out.println(wangyibo.age);
          System.out.println(wangyibo.high);
          System.out.println(wangyibo.height);
          System.out.println(wangyibo.sex);
          // 方法的调用
          wangyibo.eat();
          wangyibo.play();
          wangyibo.sleep();
      }
  }
  
  ```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容