javaSE

Java SE 筆記

數(shù)據(jù)類型

基本數(shù)據(jù)類型

  1. boolean
  2. byte
  3. short
  4. char
  5. int
  6. long
  7. float
  8. double

數(shù)據(jù)類型轉(zhuǎn)換

  • boolean byte->short,char->int->long->float->double

    • 強(qiáng)制類型轉(zhuǎn)換 (類型)變量名 高轉(zhuǎn)低

    • 自動(dòng)類型轉(zhuǎn)換 低轉(zhuǎn)高

int year = 888888;
int sum = 888888;
long total = year * sum;    //error:仍溢出
long total = year * (long)sum   //right

流程控制

Scanner

Scanner s = new Scanner(System.in);
s.next();       //空白作為終止
s.nextLine();   //回車作為終止    

面向?qū)ο?/h2>
  • 本質(zhì):以類的方式組織代碼脂信,以對(duì)象組織(封裝)數(shù)據(jù)

  • 構(gòu)造器

    • 一旦有有參構(gòu)造器匹层,無參構(gòu)造器 必須顯示定義
    • IDEA->"Alt+Insert" 快捷鍵
  • 修飾符

    • public -> protected -> default -> private
  • 三大特性

    • 封裝

      • 高內(nèi)聚理盆,低耦合 屬性私有:get/set
      • 提高程序的安全性
      • 隱藏代碼的實(shí)現(xiàn)細(xì)節(jié)
      • 統(tǒng)一接口
      • 提高系統(tǒng)的可維護(hù)性
    • 繼承

      • IDEA 快捷鍵 “Crtl+H" 繼承樹

      • Object類

      • super()

        • super調(diào)用父類的構(gòu)造方法,必須是子類構(gòu)造方法的第一行
        • super 和 this 不能在同一個(gè)構(gòu)造方法
      • 私有(private)的無法被繼承

      • 方法重寫

        • 方法修飾符:范圍可以擴(kuò)大但不能縮小
        • 拋出異常:范圍可以縮小不能擴(kuò)大
          class A{
              public void test1(){};
              public static void test2(){};
          }
          class B extends A{
              public void test1(){};
              public static void test2(){};
          }
          
          A a = new B();  //父類的引用指向子類的對(duì)象
          a.test1();      //調(diào)用B類的test1方法
          a.test2();      //調(diào)用A類的test2方法
        
    • 多態(tài)

      • 有繼承關(guān)系|子類重寫父類方法|父類引用指向子類對(duì)象
      • 方法的多態(tài)
      • static final private 無法被重寫
      • instanceof
  • 抽象類

  • 接口

    • 約束和實(shí)現(xiàn)分離 interface
    • 默認(rèn) public abstract 方法|默認(rèn)public static final 字段
  • 內(nèi)部類

    1. 成員內(nèi)部類

      • public class Outer{
            private int id;
            public void out(){
                System.out.println("這是外部類的方法");
            }
            
            public class Inner(){
                public void in(){
                    System.out.println("這是內(nèi)部類的方法");
                }
                
                public void getId(){
                    //內(nèi)部類可獲得外部類的私有字段
                    System.out.println(id);
                }
            }
        }
        
        Outer out = new Outer();
        //通過外部類構(gòu)造內(nèi)部類的對(duì)象
        Outer.inner in = out.new Inner();
        in.getId();
        
    2. 靜態(tài)內(nèi)部類

      • public class Outer{
            private int id;
            public void out(){
                System.out.println("這是外部類的方法");
            }
            
            public static class Inner(){
                public void in(){
                    System.out.println("這是內(nèi)部類的方法");
                }
            }
        }
        
        Outer out = new Outer();
        //通過外部類構(gòu)造內(nèi)部類的對(duì)象
        Outer.inner in = out.new Inner();
        
        
    3. 局部內(nèi)部類

      • public class Outer{
            private int id;
            public void method(){
                class Inner{
                    public void in(){
                        
                    }
                }
            }
        }
        
  1. 匿名內(nèi)部類

    • 不把實(shí)列保存到對(duì)象中

異常

  • Throwable
    • Error
    • Exception
      • IOException
      • RuntimeException
  • "Ctrl+Alt+T"

網(wǎng)絡(luò)編程

  • IP

    • 公網(wǎng)(互聯(lián)網(wǎng))-私網(wǎng)(局域網(wǎng))

      • 192.168.xx.xx
    • InetAddress

  • 端口

    • 公有端口:0~1023

    • 程序注冊(cè)端口:1024~49151

    • 動(dòng)態(tài)碍粥、私有端口:49152~65535

    • netstat -ano    //查看所有端口
      netstat -ano|findstr "端口號(hào)"
      tasklist|findstr "端口號(hào)"
      
    • InetSocketAddress

  • TCP

    • 客戶端-Socket

    • 服務(wù)端-ServerSocket

    • package com.csf.net;
      
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.net.UnknownHostException;
      
      public class TcpClientDemo1 {
          public static void main(String[] args) {
              Socket socket = null;
              OutputStream os = null;
              try {
                  InetAddress ip = InetAddress.getByName("127.0.0.1");
                  int port = 9999;
                  socket = new Socket(ip, port);
                  os = socket.getOutputStream();
                  os.write("Hello, World".getBytes());
              } catch (IOException e) {
                  e.printStackTrace();
              }finally {
                  try {
                      os.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  try {
                      socket.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
      ----------------------------------------------------------------------------------
      package com.csf.net;
      
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      public class TcpServerDemo1 {
          public static void main(String[] args) {
              ServerSocket serverSocket = null;
              Socket socket = null;
              InputStream is = null;
              ByteArrayOutputStream baos = null;
              try {
                  System.out.println("server is running");
                  serverSocket = new ServerSocket(9999);
                  socket = serverSocket.accept();
                  is = socket.getInputStream();
      //            byte[] buffer = new byte[1024];
      //            int len;
      //            while ((len=is.read(buffer)) != -1){
      //                String msg = new String(buffer,0,len);
      //                System.out.println(msg);
      //            }
                  baos = new ByteArrayOutputStream();
                  byte[] buffer = new byte[1024];
                  int len;
                  while ((len=is.read(buffer)) != -1){
                      baos.write(buffer, 0, len);
      
                  }
                  System.out.println(baos.toString());
              } catch (IOException e) {
                  e.printStackTrace();
              }finally {
                  try {
                      baos.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  try {
                      is.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  try {
                      socket.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  try {
                      serverSocket.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
         
      
    • TCP 文件上傳

      • FileInputStream FileOutpuStream
  • UDP

    • DatagramPacket
    • DatagramSocket
  • URL

注解

  • 元注解

    • @Target : 注解可以用在的地方

    • @Retention : SOURCE < CLASS < RUNTIME

      默認(rèn)RUNTIME

    • @Document

    • @Inherit

  • 注解中的方法實(shí)際上是申明了一個(gè)配置參數(shù)

  • 方法名稱即為參數(shù)的名稱

  • 方法返回值類型即為參數(shù)的類型(java 基本類型, Class, String, Enum)

  • 采用default申明參數(shù)默認(rèn)值

  • 若只有一個(gè)參數(shù)瓢棒,一般參數(shù)名為value

  • 注解元素必須要有值再悼,一般采用0,""作為默認(rèn)值

反射

  • 獲得class對(duì)象的方式

    1. Class.forName() 會(huì)被初始化
    2. getClass()
    3. 類名.class 不會(huì)被初始化
    4. 基本類型包裝類的Type屬性馅袁,如:Integer.Type
  • package com.csf.reflect;
    
    import java.lang.annotation.ElementType;
    
    public class Demo2 {
        public static void main(String[] args) {
            Class c1 = Object.class;
            Class c2 = Comparable.class;
            Class c3 = String[].class;
            Class c4 = int[][].class;
            Class c5 = void.class;
            Class c6 = ElementType.class;
            Class c7 = Override.class;
            Class c8 = Integer.class;
    
            System.out.println(c1); 
            System.out.println(c2);
            System.out.println(c3);
            System.out.println(c4);
            System.out.println(c5);
            System.out.println(c6);
            System.out.println(c7);
            System.out.println(c8);
            
            //class java.lang.Object
          //interface java.lang.Comparable
          //class [Ljava.lang.String;
          //class [[I
          //void
          //class java.lang.annotation.ElementType
          //interface java.lang.Override
          //class java.lang.Integer
        }
    }
    
    
  • 類初始化

    1. 類的主動(dòng)引用:

      • new
      • main()方法所在的類
      • 反射 Class.forName()
    2. 被動(dòng)引用不會(huì)初始化

      • 常量
      • 數(shù)組
      • 通過子類獲得父類的靜態(tài)字段,子類不初始化
  • 類加載器

    • 分類

      • 引導(dǎo)類加載器 BootStap Classload
      • 擴(kuò)展類加載器 Extension Classload
      • 系統(tǒng)類加載器 System Classload
      • 自定義加載器
    • 可以加載的路徑

      System.out.println(System.getProperty("java.class.path"));
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\charsets.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\deploy.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-32.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;
              // C:\Program Files(x86)\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\javaws.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jce.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jfr.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jsse.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\management-agent.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\plugin.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\resources.jar;
              // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\rt.jar;
              // C:\Users\CSF\IdeaProjects\javaSE\out\production\javaSE;
              // D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar
      
  • setAccessible 私有屬性严就,構(gòu)造器总寻,方法

  • 獲取泛型

  • 獲取注解

    package com.csf.reflect;
    
    import java.lang.annotation.*;
    
    public class Demo5 {
        public static void main(String[] args) throws NoSuchFieldException {
            Class<Student> studentClass = Student.class;
    
            Annotation[] annotations = studentClass.getAnnotations();
            for (Annotation annotation: annotations){
                System.out.println(annotation);
            }
    
            Table table = studentClass.getAnnotation(Table.class);
            System.out.println(table.value());
    
            java.lang.reflect.Field id = studentClass.getDeclaredField("id");
            Field annotation = id.getAnnotation(Field.class);
            System.out.println(annotation.column());
            System.out.println(annotation.length());
            System.out.println(annotation.type());
        }
    }
    
    @Table("db_student")
    class Student{
        @Field(column = "db_id", type = "int", length = 10)
        private int id;
    
        @Field(column = "db_age", type = "int", length = 10)
        private int age;
    
        @Field(column = "db_name", type = "varchar", length = 3)
        private String name;
    
        public Student(int id, int age, String name) {
            this.id = id;
            this.age = age;
            this.name = name;
        }
    
        public Student() {
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    
    
    }
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @interface Table{
        String value();
    }
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface Field{
        String column();
        String type();
        int length();
    }
    
    

多線程

  • main —主線程

  • 線程創(chuàng)建

    • 繼承——Thread

    • 實(shí)現(xiàn)——Runnable

    • 實(shí)現(xiàn)——Callable

      • package com.csf.thread;
        
        import java.util.concurrent.*;
        
        public class Demo5 {
            public static void main(String[] args) throws ExecutionException, InterruptedException {
                //創(chuàng)建執(zhí)行服務(wù)
                ExecutorService service = Executors.newFixedThreadPool(1);
                //提交執(zhí)行
                Future<Boolean> future = service.submit(new ThreadTest3());
                //獲取結(jié)果
                Boolean result = future.get();
                System.out.println(result);
                //關(guān)閉服務(wù)
                service.shutdownNow();
            }
        }
        
        class ThreadTest3 implements Callable<Boolean>{
        
            @Override
            public Boolean call() throws Exception {
                for(int i=0; i<100000;i++){
        
                }
                return true;
            }
        }
        
  • 線程同步問題

    package com.csf.thread;
    
    public class Demo4 implements Runnable {
    
        private int ticket = 10;
    
        public static void main(String[] args) {
            Demo4 ticket = new Demo4();
            new Thread(ticket, "小明").start();
            new Thread(ticket, "小紅").start();
            new Thread(ticket, "小光").start();
        }
    
        @Override
        public void run() {
            while (true){
                if (ticket <= 0)
                    break;
                System.out.println(Thread.currentThread().getName() + "==>拿到了第"+ (ticket--) + "張票");
            }
        }
    }
    
    //小紅==>拿到了第10張票
    //小光==>拿到了第9張票
    //小明==>拿到了第10張票
    //小光==>拿到了第7張票
    //小紅==>拿到了第8張票
    //小光==>拿到了第5張票
    //小明==>拿到了第6張票
    //小紅==>拿到了第4張票
    //小光==>拿到了第3張票
    //小明==>拿到了第2張票
    //小紅==>拿到了第1張票
    
  • 靜態(tài)代理模式

    • package com.csf.thread;
      
      public class StaticProxy {
          public static void main(String[] args) {
      //        Marry you = new You();
      //        WeddingCompany weddingCompany = new WeddingCompany(you);
      //        weddingCompany.happyMarry();
              new WeddingCompany(new You()).happyMarry();
              
              new Thread(()->{ System.out.println("love"); }).start();
          }
      }
      
      interface Marry{
          void happyMarry();
      }
      
      class You implements Marry{
      
          @Override
          public void happyMarry() {
              System.out.println("要結(jié)婚了了");
          }
      }
      
      class WeddingCompany implements Marry{
      
          private Marry target;
      
          public WeddingCompany(Marry target) {
              this.target = target;
          }
      
          @Override
          public void happyMarry() {
              before();
              target.happyMarry();
              after();
          }
      
          private void after() {
              System.out.println("收錢");
          }
      
          private void before() {
              System.out.println("布置現(xiàn)場(chǎng)");
          }
      }
      
      
  • lambda表達(dá)式

    • 函數(shù)式接口:只包含唯一一個(gè)抽象方法 如Runnable接口

    • package com.csf.lambda;
      
      public class Demo1 {
      
          static class Like2 implements ILike{
      
              @Override
              public void func() {
                  System.out.println("love2");
              }
          }
      
          public static void main(String[] args) {
      //      方式一:最原始的方法
              ILike way1 = new Like();
              way1.func();
      
      //      方式二:靜態(tài)內(nèi)部類
              new Like2().func();
      
      //      方式三:局部內(nèi)部類
              class Like3 implements ILike{
                  @Override
                  public void func() {
                      System.out.println("love3");
                  }
              }
              new Like3().func();
      
      //      方式四:匿名內(nèi)部類
              ILike way4 = new ILike() {
                  @Override
                  public void func() {
                      System.out.println("love4");
                  }
              };
              way4.func();
      
      //      方式五:lambda表達(dá)式
              ILike way5 = () -> {
                  System.out.println("love lambda");
              };
              way5.func();
      
          }
      
      
      }
      
      interface ILike{
          void func();
      }
      
      class Like implements ILike{
      
          @Override
          public void func() {
              System.out.println("love");
          }
      }
      
    • 帶參數(shù)的lambda

      package com.csf.lambda;
      
      public class Dmo2 {
          public static void main(String[] args) {
              ILove love = (a -> {
                  System.out.println("I love " + a + " 元");
              });
              love.love(100);
          }
      }
      
      interface ILove{
          void love(int a);
      }
      
  • 線程狀態(tài)

    1. new
    2. 就緒
    3. 運(yùn)行
    4. 阻塞
    5. 死亡
  • yield

  • join

    package com.csf.thread;
    
    public class TestJoin {
        public static void main(String[] args) throws InterruptedException {
            Thread t1 = new Thread(new Join(), "Vip");
            t1.start();
            for (int i=0; i<1000; i++){
                if (i==300){
                    t1.join();
                }
                System.out.println("main"+ i);
            }
        }
    }
    
    class Join implements Runnable{
    
        @Override
        public void run() {
            for (int i=0; i<1000; i++){
                System.out.println(Thread.currentThread().getName() + i);
            }
        }
    }
    
  • IDEA 快捷鍵:100.for ——for(int i=0; i<100; i++)

  • synchronized

  • CopyOnWriteArrayList

  • 死鎖

  • Lock

    • ReentrantLock
  • 生產(chǎn)者消費(fèi)者

  • 線程池

    • ExecutorService
      • execute(Runnable)
      • submit(Callable)
    • Executors--線程池的工具類,創(chuàng)建不同類型的線程池
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梢为,一起剝皮案震驚了整個(gè)濱河市渐行,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抖誉,老刑警劉巖殊轴,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袒炉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)樊零,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門我磁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驻襟,你說我怎么就攤上這事夺艰。” “怎么了沉衣?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵郁副,是天一觀的道長。 經(jīng)常有香客問我豌习,道長存谎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任肥隆,我火速辦了婚禮既荚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栋艳。我一直安慰自己恰聘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晴叨,像睡著了一般凿宾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兼蕊,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天初厚,我揣著相機(jī)與錄音,去河邊找鬼遍略。 笑死惧所,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绪杏。 我是一名探鬼主播下愈,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蕾久!你這毒婦竟也來了势似?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤僧著,失蹤者是張志新(化名)和其女友劉穎履因,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盹愚,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栅迄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皆怕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅舆。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖愈腾,靈堂內(nèi)的尸體忽然破棺而出憋活,到底是詐尸還是另有隱情,我是刑警寧澤虱黄,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布悦即,位于F島的核電站,受9級(jí)特大地震影響橱乱,放射性物質(zhì)發(fā)生泄漏辜梳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一仅醇、第九天 我趴在偏房一處隱蔽的房頂上張望冗美。 院中可真熱鬧,春花似錦析二、人聲如沸粉洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽属韧。三九已至安拟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宵喂,已是汗流浹背糠赦。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锅棕,地道東北人拙泽。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像裸燎,于是被迫代替她去往敵國和親顾瞻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355