Java9-17의 새로운 기능에 대한 해석, 3개 미만을 알고 있으면 손이 닿지 않을 수 있습니다.

머리말

Java8은 수년이 지난 후 기업에서 가장 성숙하고 안정적인 버전이 되었습니다.대부분의 회사에서 여전히 이 버전을 사용하고 있다고 생각합니다.그러나 Java19는 올해 눈 깜짝할 사이에 나왔습니다.많은 Java 엔지니어가 바쁘다고 생각합니다. 학습과 업무가 많고 새로운 기능에 대해 잘 알지 못하며 단어도 특정 블록으로 제한됩니다.

이 기사는 블로거가 유용하다고 느끼는 새로운 기능에 대한 사례 검증 및 간략한 설명이며 통합되어 모든 사람과 공유됩니다.

特别说明:Java17是继Java8之后的一个重要里程碑,像SpringBoot3.0、IDEA2022、Jenkins新版、Kafka4.0等等很多生态都强制绑定支持这个版本,等于是给它背书,博主建议大家有必要花时间去了解一下。

읽을 시간이 없다면 收藏一下한가할 때 차를 마시며 읽으면 된다.


당신의 수확

우선 간단하고 지속적이며 직관적인 글을 통해 Java8 이후의 전반적인 Java 개발 동향을 이해할 수 있으며 향후 몇 년 동안 Java 관련 작업에 적응할 수 있는 기반을 마련할 수 있습니다.

둘째, Java9-17의 새로운 기능을 이해함으로써 향후 인터뷰에 대한 포인트를 추가할 수 있습니다.결국 배우기를 좋아하고 태도가 있는 프로그래머는 기업에서 더 선호할 것입니다.

마지막으로 Java의 향후 개발 동향에 대한 블로거의 피상적인 견해를 살펴보고 혼란스러워하는 당신에게 도움이 될 수 있습니다.


준비

우선 Java17 버전을 설치해야 합니다. 환경 변수 구성은 여전히 ​​이전과 동일합니다. 이것이 제 버전입니다.

여기에 이미지 설명 삽입

둘째, IDEA2022.3을 설치하는 것이 좋습니다.IDEA의 새 버전은 이전보다 훨씬 적은 메모리를 차지하며 일부 향상된 지원을 제공합니다.

설치 후 Java17 구성을 수행해야 합니다. 그림을 참조하십시오.

setting配置
여기에 이미지 설명 삽입
Project Structure配置
여기에 이미지 설명 삽입
这里特别说明一下,最好选择预览版本,因为Java17包含一些预览功能,这里不选预览版本会编译报错。
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

새로운 기능

총 8개의 파트로 나누어 버전순으로 설명하였으며, 여러 버전이 지속적으로 개선되었기 때문에 마지막은 따로 싣는다.

1. 비공개 인터페이스

1), 설명

Java9의 새로운 기능인 인터페이스에 선언된 전용 메서드는 외부에서 구현되지 않습니다.

2), 경우

인터페이스, 기본 메서드 및 두 개의 전용 메서드를 선언합니다.

/**
 * <p>
 * 用户信息接口
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 15:03
 */
public interface UserInterface {
    
    
   private void getUsername() {
    
    
      System.err.println("你好,我是王小飞!");
   }

   private void getPassword() {
    
    
      System.err.println("你好,我是徐西圆!");
   }

   default void getData() {
    
    
      getUsername();
      getPassword();
   }
}

이 인터페이스를 구현해보면 default 메서드만 구현 가능하고 private 메서드는 구현할 수 없음을 알 수 있습니다.

/**
 * <p>
 * JDK9新特性:接口private方法
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 15:10
 */
public class UserImpl implements UserInterface {
    
    

   @Override
   public void getData() {
    
    
      UserInterface.super.getData();
   }

   public static void main(String[] args) {
    
    
      UserImpl user = new UserImpl();
      user.getData();
   }
}

Ctrl+Insert는 구현할 방법을 볼 수 있습니다.
여기에 이미지 설명 삽입

3) 주의

개인 인터페이스는 자동으로 기본값이므로 메서드 본문이 있어야 합니다. 그렇지 않으면 컴파일이 실패합니다.


2. 타입 추론

1), 설명

Java 11의 새로운 기능인 var 키워드를 사용하여 메서드 내에서 속성 또는 개체를 선언하면 컴파일러에서 자동으로 판단할 수 있습니다.

2), 경우

케이스에는 두 가지 테스트가 포함되어 있습니다. 하나는 var로 선언된 변수가 자체적으로 유형을 유추할 수 있는지 여부를 직접 테스트하는 것이고 다른 하나는 루프에서 사용하는 효과입니다.

/**
 * <p>
 * JDK11新特性:类型推断
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 11:52
 */
public class TypeInferenceDemo {
    
    

   public static void main(String[] args) {
    
    
      TypeInferenceDemo demo = new TypeInferenceDemo();
      // 测试类型推断
//    demo.testVar();

      // 循环中使用
      List<UserInfo> userList = new ArrayList<>();
      UserInfo userInfo = new UserInfo();
      userInfo.setUsername("张三");
      userInfo.setPassword("123456");
      userList.add(userInfo);
      for (var user : userList) {
    
    
         System.err.println(user.getUsername() + " | " + user.getPassword());
      }
   }

   public void testVar() {
    
    
      var name = "张三";
      var age = 33;
      var id = 1001L;
      var amount = BigDecimal.ZERO;
      var user = new UserInfo();
      System.err.println("-------------------------------------------------");
      System.err.println(name);
      System.err.println(age);
      System.err.println(id);
      System.err.println(amount);
      System.err.println(user);
   }

   public static class UserInfo {
    
    
      private String username;
      private String password;

      public String getUsername() {
    
    
         return username;
      }

      public void setUsername(String username) {
    
    
         this.username = username;
      }

      public String getPassword() {
    
    
         return password;
      }

      public void setPassword(String password) {
    
    
         this.password = password;
      }
   }
}

테스트의 효과는 그림에 표시됩니다.

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

3) 주의

1) 메서드 내에서만 사용할 수 있습니다(로컬 변수).

2) 초기화 값이 있어야 하며 null일 수 없습니다.

3) 메소드의 리턴 타입으로 정의할 수 없습니다.


3. 널 포인터 최적화

1), 설명

Java15의 새로운 기능은 NullPointerException 예외 로그를 ​​최적화하고 더 인간적으로 인쇄하는 것입니다.

2), 경우

프롬프트가 더 방향성이 있음을 알 수 있습니다. 즉, 향후 복잡한 프로덕션 환경 문제 해결 프로세스에서 null 포인터 예외로 인해 방해받지 않을 것입니다.

여기에 이미지 설명 삽입

3) 주의

아무것도 통지


4. 텍스트 블록

1), 설명

JDK15의 새로운 기능은 이전 String의 간결한 버전의 줄 바꿈과 큰따옴표를 대체하는 것입니다.

2), 경우

삼중 따옴표가 큰 따옴표를 대체하는 것을 볼 수 있습니다. 왜냐하면 큰 따옴표의 내용에는 많은 줄 바꿈 문자가 포함될 것이고 삼중 따옴표의 내부는 매우 명확한 내용이고 큰 따옴표는 필요하기 때문입니다. 막대 n을 사용하여 줄을 끊고 삼중 따옴표는 줄을 직접 줄바꿈할 수 있습니다.

/**
 * <p>
 * JDK15新特性:文本块
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 23:36
 */
public class TextBlockDemo {
    
    
   private static final String str =
         "本以为大S和汪小菲的事情就这样告一段落,彼此都过着属于自己的幸福小日子,但是,被骂9天后,汪小菲口中的“窝囊废”,终于有所行动了!\n"
         + "\n"
         + "也许具俊晔再也忍受不了别人骂自己窝囊废,更不愿意住在别人房子内,所以11月30日,据媒体爆料,具俊晔这次要男人一把,决定买一套属于自己的房子,"
         + "属于自己的床垫,搬出汪小菲买的豪宅,来证明自己的实力。";

   private static final String newStr = """
            本以为大S和汪小菲的事情就这样告一段落,彼此都过着属于自己的幸福小日子,但是,被骂9天后,汪小菲口中的“窝囊废”,终于有所行动了!
            
            也许具俊晔再也忍受不了别人骂自己窝囊废,更不愿意住在别人房子内,所以11月30日,据媒体爆料,具俊晔这次要男人一把,决定买一套属于自己的房子,
            属于自己的床垫,搬出汪小菲买的豪宅,来证明自己的实力。
         """;

   public static void main(String[] args) {
    
    
      System.err.println(str);
      System.err.println("------------------------------------------------");
      System.err.println(newStr);
   }
}
3) 주의

텍스트 블록에서 주의할 점은 딱 한 가지, 즉 세 따옴표 안에 있는 내용은 기본적으로 들여쓰기가 되어 있지 않다는 것입니다. 들여쓰기 양.

다음 그림은 효과를 직접 보여줍니다.

여기에 이미지 설명 삽입

5. 지능형 변환

1), 설명

Java16의 새로운 기능은 instanceof를 향상시키고 지능적으로 변수 유형을 변환하는 데 도움을 주는 것입니다.

2), 경우

old와 new의 두 가지 작성 방식을 비교할 수 있습니다.두 번째 방법은 첫 번째 방법을 단순화합니다.유형 변환 + 변수 선언 + 후속 논리적 판단을 함께 수행 할 수 있습니다.

/**
 * <p>
 * JDK16新特性:智能转型
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/3 14:02
 */
public class InstanceofMatching {
    
    
   /**
    * 旧写法
    * @param obj 未知对象
    */
   static void testOld(Object obj) {
    
    
      if (obj instanceof String) {
    
    
         String s = (String) obj;
         if ("模式匹配".equals(s)) {
    
    
            System.err.println(s);
         }
      }
   }

   /**
    * 新写法
    * @param obj 未知对象
    */
   static void testNew(Object obj) {
    
    
      if (obj instanceof String s && "模式匹配".equals(s)) {
    
    
         System.err.println(s);
      }
   }

   public static void main(String[] args) {
    
    
      testOld("Hello, Java!");
      testNew("模式匹配");
   }
}
3) 주의

instanceof 이후에 판단력을 높여야 한다면 instanceof는 타입 매칭을 위한 것이기 때문에 || 대신 &&를 사용해야 한다.Java는 && 이후의 변수가 반드시 존재한다는 것을 보장할 수 있지만 || 이후의 변수가 반드시 존재한다고 판단할 수는 없다. 따라서 오류를 보고합니다.

여기에 이미지 설명 삽입

6. 레코드 수업

1), 설명

간단히 말해서 Java16의 새로운 기능은 최종 클래스 선언이 더 간결하고 읽기 쉬워진다는 것입니다.

2), 경우

글을 먼저 보고

/**
 * <p>
 * JDK16新特性:record类
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 21:52
 */
public record RecordDemo(int type, String typeName) {
    
    
   private void test() {
    
    
      System.err.println(type + " | " + typeName);
   }
   public static void main(String[] args) {
    
    
      // 这里new的时候带的参数其实就是类的属性,等于声明属性+访问构造方法二合一。
      RecordDemo recordDemo = new RecordDemo(100, "葡萄牙");
      recordDemo.test();
   }
}

위의 새로운 표기법은 아래의 기존 표기법과 동일하여 한눈에 이해할 수 있습니다.

/**
 * <p>
 * RecordDemo的写法等同于这个类
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 21:55
 */
public final class RecordCustomDemo {
    
    
   final int type;
   final String typeName;

   public int type() {
    
    
      return type;
   }

   public String name() {
    
    
      return typeName;
   }

   public RecordCustomDemo(int type, String typeName) {
    
    
      this.type = type;
      this.typeName = typeName;
   }

   @Override
   public boolean equals(Object o) {
    
    
      if (this == o)
         return true;
      if (o == null || getClass() != o.getClass())
         return false;
      RecordCustomDemo that = (RecordCustomDemo) o;
      return type == that.type && Objects.equals(typeName, that.typeName);
   }

   @Override
   public int hashCode() {
    
    
      return Objects.hash(type, typeName);
   }
}
3) 주의

다음이 자동으로 생성된다는 점을 제외하면 일반 클래스를 사용하는 것과 거의 비슷합니다.

1) 괄호 안의 매개변수는 클래스의 속성이며 최종 유형입니다.

2) 이 속성으로 생성자를 자동으로 생성합니다.

3) xx.type(), xx.typeName()과 같은 이 속성에 대한 접근자를 자동으로 생성합니다.

4) equals 및 hashCode 메서드를 생성합니다.

여전히 이해가 되지 않는다면, 같은 의미인 롬복의 @Data 주석으로 이해하면 됩니다.


7. 봉인된 클래스 및 인터페이스

1), 설명

Java17 새 기능, ​​봉인된 클래스 및 봉인된 인터페이스.

sealing 키워드로 선언된 클래스는 permit 키워드를 설정하여 상속할 수 있는 하위 클래스를 제어할 수 있습니다.

봉인된 키워드로 선언된 인터페이스를 사용하면 permit 키워드를 설정하여 인터페이스를 구현할 수 있는 클래스를 제어할 수 있습니다. .

간단히 말해서, 아버지는 어느 아들이 재산을 물려받을 수 있는지를 규정합니다.

2), 경우

봉인 클래스의 문구를보십시오

봉인된 클래스를 선언하고 이를 상속할 수 있는 하위 클래스를 승인하도록 허가를 설정합니다.

/**
 * <p>
 * JDK17新特性:密封类
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 17:20
 */
public sealed class Daddy permits Son1, Son2 {
    
    
}

첫째 아들이 물려받을 수 있다

/**
 * <p>
 *
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 17:22
 */
public final class Son1 extends Daddy {
    
    
}

차남이 물려받을 수 있다

/**
 * <p>
 *
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 17:23
 */
public final class Son2 extends Daddy {
    
    
}

셋째 아들은 아마도 불효자일 것이다.

IDEA에 오류 프롬프트가 있음을 알 수 있습니다. 이는 봉인된 선언의 상위 클래스에서 허용되지 않음을 의미합니다.

여기에 이미지 설명 삽입

그런 다음 밀봉 인터페이스를 살펴봅니다.

사실 실드 클래스와 비슷하지만 위에서 언급한 레코드와 결합하여 코드를 단순화할 수도 있습니다.

/**
 * <p>
 * JDK17新特性:密封接口
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 18:03
 */
public sealed interface DaddyInterface permits Son4, Son5 {
    
    
   void test();
}

넷째 아들은 아버지의 소원을 실현할 수 있습니다.레코드를 사용한 후 변수 선언 및 일부 내장 메소드 구현이 단순화되었습니다.

/**
 * <p>
 *
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 17:23
 */
public record Son4(int age, String name) implements DaddyInterface {
    
    
   @Override
   public void test() {
    
    

   }
}

다섯째 아들은 아버지의 소원을 이룰 수 있습니다

/**
 * <p>
 *
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/2 17:23
 */
public record Son5(int age, String name) implements DaddyInterface {
    
    
   @Override
   public void test() {
    
    

   }
}

여섯째 아들은 좀 멍청해서 아버지의 소원을 이루지 못하고 이전 봉인 반과 같은 오류 메시지를 볼 수 있습니다.

여기에 이미지 설명 삽입

3) 주의

1) 봉인된 선언의 상위 클래스, 해당 하위 클래스는 최종, 봉인, 비봉인으로만 수정할 수 있습니다.

2) sealed로 선언된 부모 클래스에는 적어도 하나의 하위 클래스가 있어야 합니다.

3) 권한이 부여되지 않은 하위 클래스는 상위 클래스를 상속할 수 없습니다.

4) 밀폐 인터페이스와 밀폐형 사이에는 차이가 없습니다.

4) 레코드와 결합된 봉인 인터페이스는 더 많은 코드를 저장하고 더 간결하게 만들 수 있습니다.

여기서 특별한 점은 실드(sealed)와 레코드(record)는 사실 새로운 자바 기능의 패턴매칭에서 매우 의미가 있지만 패턴매칭은 전혀 알지 못하는 자바 프로그래머들에게는 다소 생소한 부분이 아닐까 생각합니다. 피라미드 체계. 이해하기 어렵다면 우리의 원래 목적이 아니므로 자세히 설명할 별도의 챕터가 없습니다. 마지막으로 패턴 매칭에 대한 제 견해를 간단히 말씀드리겠습니다.


8. 스위치 향상

1), 설명

Java14-17에서 스위치를 각각 향상시켰고 스위치를 끝에 두는 것이 더 직관적이기 때문에 마지막에 스위치만 두는 이유는 무엇입니까?

총 세 가지 변경 사항이 있습니다.

1) 화살표 구문을 지원합니다.

2) 표현 지원;

3) 지원 사례 null.

2), 경우

실제로 화살표 구문은 이전 글에서 콜론과 중단을 대신 화살표로 대체하는 것이므로 더 간결합니다.

/**
 * <p>
 * JDK14新特性:switch箭头语法
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/3 11:05
 */
public class SwitchDemo1 {
    
    
   private static void foods(int i) {
    
    
      switch (i) {
    
    
         case 1:
            System.err.println("青椒肉丝");
            break;
         case 2:
            System.err.println("番茄炒蛋");
            break;
         default:
            System.err.println("米饭");
      }
   }

   private static void fruits(int i) {
    
    
      switch (i) {
    
    
         case 1 -> System.err.println("香蕉");
         case 2 -> System.err.println("猕猴桃");
         default -> System.err.println("苹果");
      }
   }

   public static void main(String[] args) {
    
    
      foods(1);
      fruits(3);
   }
}

실제로 지원 식은 반환할 단일 또는 여러 식을 작성할 수 있습니다.

/**
 * <p>
 * JDK14新特性:switch支持表达式
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/3 11:05
 */
public class SwitchDemo3 {
    
    

   /**
    * 单表达式
    */
   private static String fruits(int i) {
    
    
      return switch (i) {
    
    
         case 1 -> "香蕉";
         case 2 -> "猕猴桃";
         default -> "苹果";
      };
   }

   /**
    * 多表达式
    */
   private static String fruitsNew(int i) {
    
    
      return switch (i) {
    
    
         case 1, 2 -> {
    
    
            System.err.println("----------------------------------");
            System.err.println("来一个香蕉");
            yield "香蕉来咯";
         }
         case 3, 4 -> {
    
    
            System.err.println("----------------------------------");
            System.err.println("来一个猕猴桃");
            yield"猕猴桃来咯";
         }
         default -> {
    
    
            System.err.println("----------------------------------");
            System.err.println("没的选就来个苹果吧");
            yield "苹果来咯";
         }
      };
   }

   public static void main(String[] args) {
    
    
//    System.err.println(fruits(2));
//    System.err.println(fruits(3));

      System.err.println(fruitsNew(2));
      System.err.println(fruitsNew(4));
      System.err.println(fruitsNew(5));
   }
}

지원 사례 null, 실제로 사례는 null 값을 받을 수 있습니다.

/**
 * <p>
 * JDK17新特性(预览):switch支持case null
 * </p>
 *
 * @author 程序员济癫,公众号:【Java分享客栈】
 * @since 2022/12/3 11:05
 */
public class SwitchDemo2 {
    
    
   private static void foods(String s) {
    
    
      if (s == null) {
    
    
         return;
      }
      switch (s) {
    
    
         case "1":
            System.err.println("青椒肉丝");
            break;
         case "2":
            System.err.println("番茄炒蛋");
            break;
         default:
            System.err.println("米饭");
      }
   }

   private static void fruits(String s) {
    
    
      switch (s) {
    
    
         case "1" -> System.err.println("香蕉");
         case null -> System.err.println("null");
         default -> System.err.println("苹果");
      }
   }

   public static void main(String[] args) {
    
    
      foods("1");
      fruits(null);
   }
}

효과를 볼 수 있습니다. null을 직접 전달하면 오류가 보고되지 않습니다.

여기에 이미지 설명 삽입

3) 주의

1) 화살표 구문, 콜론 및 화살표는 동시에 존재할 수 없습니다.

2) 표현식의 경우 여러 표현식에 중괄호를 사용해야 하며 반환에는 yield 키워드를 사용해야 합니다.

3) null이 미리보기 기능인 경우 IDEA - 프로젝트 구조 - 컴파일 및 통과할 모듈에서 언어 수준 17(미리보기)을 선택하고 이전 준비를 참조하세요.


요약하다

1) Java9-17의 새로운 기능은 여기에 있을 뿐만 아니라 immutable collection, 모듈화, String 및 Stream의 API 향상 등과 같은 몇 가지 매우 특징적인 콘텐츠도 있지만 개인적으로 그것이 대표적이지 않다고 생각합니다. 전환에 직접 도움이 되거나 사용할 수 없기 때문에 나열되지 않습니다.

2) 패턴매칭은 많은 자바 프로그래머들의 관심 대상이다. Java"도 Java 패턴 매칭의 완전한 형태를 보려면 몇 년이 걸릴 수 있으므로 지금 불완전한 버전을 연구하는 데 너무 많은 시간을 할애할 필요가 없다고 말했습니다. Python, Kotlin 및 Scala와 비교할 때 이 기능은 실제로 멀지 않은 열등.


자바 개발 동향

마지막으로 많은 분들이 관심을 갖고 있는 이 문제에 대해 말씀드리자면 Java8 이후 이러한 버전의 새로운 기능과 미리보기 기능을 이해하는 한 Java가 변경을 시도하고 있음을 분명히 알 수 있으며 이는 좋은 신호라고 생각합니다.

예를 들어 위의 새로운 기능은 Python, JavaScript 및 기타 언어의 많은 그림자를 찾을 수 있으며 새로운 언어인 Go 언어는 거인의 어깨에서 개발되어 많은 언어의 뛰어난 기능을 흡수합니다.

이제 Java도 비슷한 길을 가고 있습니다. 일부 우수한 언어의 하이라이트를 새 버전에 통합하고 있음을 분명히 알 수 있습니다. 이러한 추세는 Java가 지속적으로 개선되고 있다는 의미를 나타냅니다.

인터넷에는 Java를 경멸하는 댓글이 많이 있습니다.진지하게 받아 들일 필요는 없습니다.생태를 경험하고 국내 IT 회사의 역학을 이해해야 느낄 수 있습니다.

Java는 여전히 중국에서 가장 널리 사용되는 언어이며 가장 큰 생태를 가지고 있으며 이것은 하룻밤 사이에 대체될 수 없지만 시장 법칙이 발전한 결과입니다.

SpringBoot3.0은 Java17을 지원하고, Jenkins의 새 버전은 Java17을 지원하고, Kafka4.0은 Java8을 직접 포기하고, ElasticSearch8.x는 최소한 JDK17을 지원하고, IDEA2022는 기본적으로 Java17을 지원합니다. 기술 수준의 개선뿐만 아니라 더 유익한 호소력과 번들링.

이러한 관점에서 Java를 배우는 것은 완전히 가치가 있으며 성숙하고 우수하며 엄격한 언어로서 화이트 칼라 노동자처럼 똑바로 앉아 있습니다.

또한 지금 Java를 배우고 마스터하는 엔지니어는 앞으로 다른 언어로 전환해야 한다는 압박감이 없을 것이라고 생각합니다.위의 새로운 기능은 이러한 방향을 설명하며 다른 언어의 하이라이트를 흡수하고 있습니다.

앞으로 예상할 수 있는 것은 다른 언어로 전환할 때 점차 덜 낯설고 모호해진다는 것입니다. , you 내가 있고 내 안에 당신이 있습니다.



원문은 순전히 손으로 직접 타이핑한 글이니 键盘上全是血도움이 되셨다면 클릭 赞和收藏~

제 업무 경험과 재미있는 이야기를 공유하기 위해 최선을 다하고 있습니다. 마음에 드시면 홈페이지에 들어가셔도 됩니다 关注一下~

Supongo que te gusta

Origin blog.csdn.net/xiangyangsanren/article/details/128166322
Recomendado
Clasificación