JDK不同版本间的新特性-基础篇

目录

一、JDK环境部署

1.1 JDK18与IDEA2022环境准备

二、JDK9-10新特性

2.1 JDK9新特性——私有接口方法

2.2 JDK9新特性——通过try块自动关闭资源

 2.4 JDK10新特性——var动态类型推断

局部变量类型推断:

不可变集合:List.copyOf(提高数据安全性)

Java11 新的String方法:

三、JDK12-14新特性

3.2 JDK12新特性——增强的switch分支判断

3.3 JDK13新特性——文本块特性

四、总结

4.1 总结


一、JDK环境部署

1.1 JDK18与IDEA2022环境准备

        80%企业应用都在使用JDK8来做开发。

        1. JDK9: 私有接口方法

        2. JDK9: Try自动关闭IO流

        3. JDK10: var动态类型推断

        4. JDK10: 不可变集合

        5. JDK11: 新的String方法

        6. JDK12: 新版swith语法

        7. JDK13: 文本块特性

JDK18与IDEA2022环境准备:

        Java Downloads | Oracle

        下载 IntelliJ IDEA:JetBrains 功能强大、符合人体工程学的 Java IDE

二、JDK9-10新特性

2.1 JDK9新特性——私有接口方法

        2017年9月21日,JDK9正式发布。JDK9提供了超过150项新功能特性,包括备受期待的模块化系统、可交互REPL工具、jshell、JDK编译工具、公共API和接口私有代码、以及安全增强、扩展提升、性能管理改善等。可以说JDK9是一个庞大的系统工程,完全做了一个整体改变。

 私有接口方法:

        在JDK8之前,接口可以有常量变量和抽象方法,不能在接口中提供方法实现。

        JDK9不仅像JDK8一样支持接口默认方法,同时还支持私有方法新特性。

        通过接口私有方法,可以进一步增强接口的灵活性。

package com.imooc.jdk9;
//私有接口方法
public interface Sample01 {
    //在真正项目开发中,IP地址等信息要动态获得。
    //IP变化,要执行某个命令获取新的IP地址。
    //动态行为,变量无法实现,最好封装成方法。
    //String ip = "192.168.1.30"; 
    default void showInfo(){
        System.out.println("基本信息");
        System.out.println("IP地址:" + getIp());
    }

    default void showDetail(){
        System.out.println("详细信息");
        System.out.println("IP地址:"+ getIp());
    }

    //私有接口方法为 默认接口方法服务。
    private String getIp(){
        return "192.168.1.30";
    }
}

2.2 JDK9新特性——通过try块自动关闭资源

        Try自动关闭IO流。

  

        没有此新特性之前,释放资源的代码 比主体代码还多,明显不适宜。

package com.imooc.jdk9;

import java.io.*;
//通过try块自动关闭资源
public class Sample02 {
    public static void main(String[] args) throws FileNotFoundException {
        File source = new File("d:/demo.jpg");
        File target = new File("d:/demo1.jpg");
        //通过try块自动关闭资源
        try (InputStream fis = new FileInputStream(source);
             OutputStream fos = new FileOutputStream(target);){
            byte[] bs = new byte[1024];
            int len;
            //利用read方法循环读取的字节数据,并进行处理
            while((len = fis.read(bs)) != -1){
                System.out.println(len);
                //将读取到到字节数组写入到输出流
                fos.write(bs,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 2.4 JDK10新特性——var动态类型推断

        2018年3月21日,JDK10正式发布。JDK9与JDK10都不是长期支持版本(LTS),JDK11是长期支持版本。

        JDK10新增了109个新特性,与开发相关的关键特性有两个:局部变量类型推断、不可变集合。

局部变量类型推断:

        

package com.imooc.jdk10;

import java.util.ArrayList;

//var动态类型推断
public class Sample03 {
    public static void main(String[] args) {
        var str = new String("a");
        var str1 = "a";
        System.out.println(str instanceof String);
        System.out.println(str1 instanceof String);
        var list = new ArrayList<String>();
        list.add("abc");
        //list.add(321);
        //var l = 100l; //var在直接赋值数据类型时返回对应数据类型
        var l = Long.valueOf(100l); //要返回包装类型对象要用valueOf方法
        System.out.println(l instanceof Long);

        var b = Boolean.valueOf(true);
        System.out.println(b instanceof Boolean);
    }
}

不可变集合:List.copyOf(提高数据安全性)

package com.imooc.jdk10;

import java.util.ArrayList;
import java.util.List;

//不可变集合
public class Sample04 {
    public static void main(String[] args) {
        final var list = new ArrayList<String>();
        list.add("ABC");
        list.add("BCD");
        list.add("EFG");
        //List.copyOf创建不可变集合
        List<String> copyList = List.copyOf(list);
        copyList.add("A"); //会抛出不可操作异常

    }
}

Java11 新的String方法:

package com.imooc.jdk11;

//新的String方法
public class Sample05 {
    public static void main(String[] args) {
        String str = "    www.imooc.com ";
        boolean isblank = str.isBlank();  //判断字符串是空白,可以都是空格,长度不为0
        System.out.println(str + "是否空白:" + isblank);
        boolean isempty = str.isEmpty();  //判断字符串是否为空,长度=0
        System.out.println(str + "是否为空:" + isempty);
        String result1 = str.strip();    //去掉首尾空白(包括全角空格),trim()只能去掉半角空格
        System.out.println(str + "去除首尾空白:" + result1.length());
        String result2 = str.stripTrailing();  //去除尾部空白
        System.out.println(str + "去除尾部空白:" + result2.length());
        String result3 = str.stripLeading();  //去除首部空白
        System.out.println(str + "去除首部空白:" + result3.length());
        String copyStr = str.repeat(2);  //复制几遍字符串
        System.out.println(str + "复制两次:" + copyStr);
        long lineCount = copyStr.lines().count();  //行数统计
        System.out.println(str + "行数:" + lineCount);//

    }
}

三、JDK12-14新特性

3.2 JDK12新特性——增强的switch分支判断

        JDK12 is the open-source reference implementation of version 12 of the Java SE Platform as specified by JSR 386 in the Java Community Process.

        JDK12 reached General Availability on 19 March 2019. Production-ready binaries under the GPL are available from Oracle; binaries from other vendors will follow shortly.

        The features and schedule of this release were proposed and tracked via the JEP Process, as amended by the JEP 2.0 proposal. The release was produced using the JDK Release Process(JEP 3).

        2019年3月19日JDK12诞生了,短期支持版本,日常项目中不建议使用它。但是它推出了一个非常重要的,影响到Java整个体系的语法规则,增强的Switch分支语法。

package com.imooc.jdk12;

import java.util.Random;
//新版swith语法
public class Sample06 {
    public void oldSwitch(){
        int day = new Random().nextInt(7);
        int result = 0;
        switch (day) {
            case 0:
            case 1:
            case 2:
                result = 88;
                break;
            case 3:
                result = 99;
                break;
            case 4:
            case 5:
                result = 101;
                break;
            case 6:
                result = 120;
                break;
            default:
                result = -1;
        }
        System.out.println(result);
    }

    public void newSwitch(){
        int day = new Random().nextInt(7);
        int result = switch (day){
            case 0,1,2 -> 88;
            case 3 -> 99;
            case 4,5 -> 101;
            case 6 -> 120;
            default -> -1;
        };
        System.out.println(result);
    }
    public static void main(String[] args) {
        new Sample06().newSwitch();
    }
}

3.3 JDK13新特性——文本块特性

        JDK13 2019年9月17日发布的,短暂的版本,有了一个千呼万唤很多的年的特性,文本块特性。对我们日常开发有非常大的帮助。

四、总结

4.1 总结

        从JDK14开始,语法层面已经非常成熟。JDK14~18只是对现有语法进行完善,底层更多关注具体功能层面上、运行机制上的升级和更新。 

        14

        更有价值的NullPointer

        record记录类型

        15

        密封类

        

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集: JAVA核心知识点整理-282页 Java与哈希算法.docx Java中Lambda表达式的使用.docx JAVA多线程之线程的通信方式.docx Java注解详解.docx Java线程池.docx JDK1.8Stream操作.docx JDK8有新特性.docx JVM堆三代.docx JVM的垃圾回收机制详解和调优.docx Spring源码分析之IoC.docx 关于线程和线程池的学习与使用.docx 深入理解JVM垃圾回收机制.docx 深入理解多线程实现的另一种方式Callable.docx 红黑树简介.docx 线程死锁及解决办法.docx 线程锁之重入锁.docx 线程的通信.docx 虚拟机内存结构和垃圾回收docx.docx 锁分类的了解.docx 集合的扩容机制.png SpringMVC部分.docx Spring部分.docx 第一题.pdf 第七题 谈谈MySQL支持的事务隔离级别 (1).pdf 第三题 对比HashTable HashMap TreeMap有什么不同.pdf 第二题 Exception Error区别.pdf 第五题 如何保证集合是线程安全的.pdf 第八题 Java并发类库提供的线程池有哪几种 分别有什么特点.pdf 第六题 synchronized和ReentLock有什么区别.pdf 第四题 ArrayList LinkedList Vector的区别.pdf docker讲得最清楚.doc Dubbo是什么?能做什么?.doc java 基于TCP协议的Socket编程和通信.doc Java面试高级—说说TCP,UDP和socket,Http之联系和区别.doc MySQL千万级的大表要怎么优化(读写分离、水平拆分、垂直拆分).doc redis缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级.doc RPC (Remote Procedure Call)即远程过程调用.doc Spring 面试问题 TOP 50(干货推荐收藏必备).doc springboot常见面试题.doc svn和git的区别及适用场景.doc ZooKeeper.doc 为什么分布式一定要有Redis.doc 分布式、高并发、多线程,到底有什么区别.doc 分布式事务.doc 四款消息队列大比拼.docx 多台web服务器之共享session.docx 消息中件Kafka与RabbitMQ.doc 电商项目描述注意点.doc 秒杀业务的流量削峰场景如何解决.doc 面试题:Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点.doc
第1部分 基础 第1堂课 java概述 3 视频讲解:31分钟 1.1 java简介 4 1.1.1 java发展历史 4 1.1.2 java的几个版本 5 1.1.3 java应用领域 6 1.1.4 java项目成功案例 6 1.1.5 怎样学好java 8 1.2 环境搭建 8 1.2.1 jdk下载 8 1.2.2 jdk安装 10 1.2.3 配置环境变量 11 1.3 编写第一个java程序 14 1.3.1 在记事本中输入代码 14 1.3.2 保存代码为源代码文件 15 1.3.3 编译并运行java文件 16 1.4 照猫画虎——基本功训练 16 1.4.1 基本功训练1——更换java_home环境变量 16 1.4.2 基本功训练2——提取path变量值创建新环境变量 17 1.4.3 基本功训练3——输出字符表情 17 1.4.4 基本功训练4——输出“*”字符组成的三角形 18 1.5 情景应用——拓展与实践 19 1.5.1 情景应用1——计算两个整数的和 19 1.5.2 情景应用2——输出当前日期 19 1.5.3 情景应用3——在控制台接收用户输入数字 20 1.5.4 情景应用4——计算用户输入数字的乘积 21 1.6 自我测试 22 1.7 行动指南 23 1.8 成功可以复制——“盖茨第二” 23 第2堂课 使用ide集成开发工具 25 视频讲解:128分钟 2.1 eclipse简介 26 2.2 eclipse下载与安装 26 2.2.1 eclipse分类 26 2.2.2 下载eclipse 26 2.2.3 安装中文语言包 28 2.2.4 启动eclipse 29 2.3 安装界面设计器 30 2.4 熟悉eclipse 32 2.4.1 eclipse工作台 32 2.4.2 透视图与视图 33 2.4.3 包资源管理器视图 33 2.4.4 编辑器视图 33 2.4.5 控制台 34 2.4.6 大纲视图 34 2.4.7 问题视图 34 2.4.8 透视图工具栏 35 2.4.9 视图工具栏 35 2.4.10 快速视图工具栏 35 2.5 如何开发java程序 35 2.5.1 新建java项目 36 2.5.2 新建java类 36 2.5.3 编写java代码 37 2.5.4 运行java程序 39 2.6 如何开发桌面应用程序 39 2.6.1 新建swing gui窗体 40 2.6.2 向窗体中添加gui控件 41 2.6.3 实现控件的事件监听器 43 2.6.4 运行gui程序 43 2.7 如何进行程序调试 43 2.7.1 设置断点 44 2.7.2 以调试方式运行java程序 44 2.7.3 程序调试 44 2.8 了解项目类库 45 2.9 照猫画虎——基本功训练 46 2.9.1 基本功训练1——添加jar文件到构建路径 46 2.9.2 基本功训练2——添加依赖项目到构建路径 46 2.9.3 基本功训练3——创建用户自定义类库 47 2.9.4 基本功训练4——为项目添加类库 48 2.9.5 基本功训练5——为项目添加类文件夹 49 2.10 情景应用——拓展与实践 50 2.10.1 情景应用1——为窗体添加文本框控件 50 2.10.2 情景应用2——接收用户在控制台的输入 50 2.10.3 情景应用3——编写一个信息提示窗体 51 2.10.4 情景应用4——控制窗体位置 52 2.10.5 情景应用5——编写ui界面的加法 计算器 54 2.11 自我测试 55 2.12 行动指南 56 2.13 成功可以复制——迅雷创始人邹胜龙 57 第3堂课 java语言基础知识 59 视频讲解:178分钟 3.1 java主类结构 60 3.1.1 定义类包 60 3.1.2 定义类 60 3.1.3 导入api类库 60 3.1.4 定义变量 61 3.1.5 定义主方法 61 3.1.6 运行主类 61 3.2 代码注释 61 3.2.1 单行注释 61 3.2.2 多行注释 61 3.2.3 javadoc文档注释 62 3.3 变量与常量 62 3.3.1 java保留字 62 3.3.2 定义变量 63 3.3.3 定义常量 64 3.3.4 常量与变量的有效范围 64 3.4 数据类型 65 3.4.1 计算机常用数制 66 3.4.2 整数类型 67 3.4.3 浮点类型 69 3.4.4 字符类型 69 3.4.5 布尔类型 71 3.5 数据类型转换 71 3.5.1 自动类型转换 71 3.5.2 强制类型转换 73 3.6 运算符 74 3.6.1 赋值运算符 74 3.6.2 算术运算符 75 3.6.3 自增和自减运算符 76 3.6.4 比较运算符 76 3.6.5 逻辑运算符 77 3.6.6 位运算符 78 3.6.7 三元运算符 80 3.6.8 运算符优先级 81 3.7 编码规范 81 3.8 照猫画虎——基本功训练 82 3.8.1 基本功训练1——合理设定变量类型 82 3.8.2 基本功训练2——变量自增运算 83 3.8.3 基本功训练3——类型转换 84 3.8.4 基本功训练4——运算符的应用 84 3.8.5 基本功训练5——求最大值 85 3.8.6 基本功训练6——位移实现数字乘以2的8次幂 86 3.9 情景应用——拓展与实践 86 3.9.1 情景应用1——输出长方形面积 86 3.9.2 情景应用2——输出字节bit位的值 87 3.9.3 情景应用3——判断奇偶数 88 3.9.4 情景应用4——简单数据加密 89 3.9.5 情景应用5——判断闰年 89 3.9.6 情景应用6——异或运算实现变量值交换 90 3.10 自我测试 91 3.11 行动指南 92 3.12 成功可以复制——知识改变命运、科技改变生活 93 第4堂课 流程控制语句 95 第5堂课 数组应用 131 第6堂课 面向对象编程 155 第7堂课 字符串处理 189 第2部分 提高 第8堂课 类的继承与多态特性 219 第9堂课 其他类特性与异常处理 257 第10堂课 swing编程基础 283 第11堂课 多线程编程 319 第12堂课 事件处理的应用 345 第13堂课 常用工具类 373 第14堂课 常用集合类 403 第3部分 高级 第15堂课 数据库编程应用 429 第16堂课 输入输出流与文件 457 第17堂课 网络程序设计 491 第18堂课 表格控件的应用 517 第19堂课 树控件的应用 555 第20堂课 其他高级控件 581 第21堂课 图形绘制技术 621 第4部分 实战 第22堂课 进销存管理系统 647 第23堂课 企业内部通讯管理系统 729 第24堂课 图书馆管理系统 737 附录a java程序编码规范 749
Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺 第1章 导论 1 1.1 RoR的革命与Web开发的新时代 1 1.2 RoR并不完美 2 1.2.1 Ruby语言方面的不足 2 1.2.2 对历史遗留项目的支持较为困难 2 1.3 Grails的诞生解决了一些遗憾 3 1.3.1 Groovy语言 3 1.3.2 Grails站在了巨人的肩膀之上 3 1.3.3 Grails有良好的扩展性 3 1.4 对Grails的一些误解 3 1.5 本书的使用说明 4 1.6 本章小结 4 第一 入门 第2章 Hello Grails 6 2.1 Grails的安装 6 2.1.1 JDK的安装与配置 6 2.1.2 Grails的安装 7 2.2 创建Grails工程 8 2.3 Grails的MVC架构 11 2.4 Scaffold应用程序 14 2.5 开发工具的使用 17 2.6 本章小结 19 第3章 Groovy VS Java 20 3.1 Groovy的基本类型与运算符 21 3.1.1 字符串 21 3.1.2 数字 22 3.1.3 Groovy的类 23 3.1.4 运算符 24 3.2 Groovy的控制结构 25 3.3 Groovy的集合 27 3.3.1 列表 27 3.3.2 映射 28 3.3.3 区 29 3.4 Groovy的闭包 30 3.4.1 闭包的定义 30 3.4.2 闭包的代表 31 3.4.3 闭包在GDK中的使用 31 3.5 本章小结 33 第二 实际应用 第4章 商品维护 36 4.1 准备工作 36 4.2 查看商品列表 40 4.3 创建和编辑商品 44 4.4 本章小结 48 第5章 商品搜索 49 5.1 构造查询表单 49 5.2 复杂的数据库查询 50 5.2.1 HibernateCriteriaBuilder 的初窥 51 5.2.2 数据库的分页查询 54 5.2.3 将查询改造为inner join 59 5.3 显示分页导航 60 5.4 本章小结 62 第6章 用户注册与登录 63 6.1 表单验证与资源文件 63 6.2 用户注册 69 6.3 用户登录 73 6.3.1 登录的数据库查询 73 6.3.2 使用Session维持会话 74 6.3.3 自定义Codec实现对 密码加密 75 6.4 登录保护 76 6.5 本章小结 79 第7章 购物车与订单 80 7.1 购物车的查看与管理 80 7.1.1 定义购物车的Domain类 80 7.1.2 定义OrderService类 82 7.1.3 显示购物车 84 7.1.4 维护购物车 85 7.2 订单的提交 90 7.2.1 定义订单的Domain类 90 7.2.2 提交订单的表单页面 90 7.2.3 订单的保存 94 7.3 订单的查看 95 7.4 本章小结 99 第8章 系统后台管理 100 8.1 页面布局的使用 100 8.1.1 Grails Layout的基础知识 100 8.1.2 为系统后台管理创建 统一的decorator 103 8.2 文件上传的实现 107 8.2.1 开发表单页面 107 8.2.2 在Controller中接收文件 108 8.3 修改订单状态 109 8.4 本章小结 110 第9章 Grails的自动化测试 111 9.1 Grails自动化测试基础知识 111 9.2 编写测试用例 113 9.2.1 对Domain类进行测试 113 9.2.2 对Service类进行测试 116 9.2.3 对Controller进行测试 118 9.2.4 对Taglib进行测试 120 9.3 本章小结 121 第10章 部署应用 122 10.1 Grails对部署的支持 122 10.2 配置应用程序 124 10.3 本章小结 127 第三 深入了解Grails 第11章 深入GORM 130 11.1 自定义映射 130 11.1.1 基本映射 130 11.1.2 配置主键 131 11.1.3 “锁”与Version 133 11.1.4 事件与自动时戳 134 11.1.5 映射Blob字段 134 11.1.6 定义非持久化属性 135 11.2 深入理解Domain的关系 136 11.2.1 一对一关系 136 11.2.2 一对多关系 137 11.2.3 多对多关系 139 11.2.4 继承关系 141 11.2.5 合成关系 143 11.3 数据库查询小结 143 11.3.1 GORM提供了便捷的 查询方法 143 11.3.2 基于HQL的查询 145 11.4 对GORM进行性能优化 146 11.4.1 设置抓取模式 147 11.4.2 使用二级缓存 147 11.5 使用GRAG工具生成Domain 151 11.6 本章小结 154 第12章 与Spring整合 155 12.1 依赖注入与Spring容器基础 155 12.1.1 依赖注入 155 12.1.2 Spring容器基础 157 12.2 在Grails中使用Spring 158 12.3 本章小结 160 第13章 深入Controller 161 13.1 Controller中常用的属性与方法 161 13.2 自定义URL Mapping 164 13.3 Web Flow 167 13.4 本章小结 172 第14章 深入Groovy Server Page 174 14.1 GSP基础知识 174 14.1.1 GSP输出表达式 174 14.1.2 GSP中预定义的变量 与作用域 175 14.2 GSP标签库 175 14.2.1 常用的内置标签 176 14.2.2 开发自定义标签 179 14.3 Grails对Ajax的支持 182 14.4 本章小结 184 第15章 实现Web Service 185 15.1 REST风格的Web Service 185 15.1.1 什么是REST 185 15.1.2 在Grails中实现REST 185 15.1.3 在Client端调用服务 187 15.2 基于SOAP的传统Web Service 188 15.3 本章小结 189 第16章 使用Grails插件 190 16.1 插件的安装 190 16.2 插件的组织结构 196 16.3 插件的使用 197 16.3.1 Acegi插件 197 16.3.2 Debug插件 204 16.4 本章小结 205 第四 Grails解密 第17章 高级Groovy特性 208 17.1 动态方法调用与属性访问 208 17.1.1 动态方法调用 208 17.1.2 动态属性访问 208 17.2 invokeMethod和getProperty 209 17.3 MOP动态基础 211 17.3.1 遍历方法和属性 211 17.3.2 动态添加方法 213 17.3.3 动态添加属性 215 17.3.4 使用方法对象 216 17.3.5 为某一特定的实例 添加方法 217 17.4 本章小结 218 第18章 Grails插件开发 219 18.1 创建与发布插件 219 18.2 插件能做什么 221 18.2.1 添加Spring配置信息 223 18.2.2 与Spring容器交互 224 18.2.3 修改web.xml 224 18.2.4 添加动态方法 226 18.2.5 捕获变更 227 18.3 插件的依赖关系 229 18.4 在安装或升级时执行附加操作 230 18.5 本章小结 230 第19章 浅析Grails的源程序 231 19.1 准备工作 231 19.1.1 下载源码 231 19.1.2 编译Grails源码 231 19.2 HibernateCriteriaBuilder的原理 233 19.3 开启Hibernate Query Cache 237 19.4 本章小结 241 第20章 未来Grails版本新特性 242 20.1 GORM的新特性 242 20.1.1 更多的GORM事件 242 20.1.2 映射基本类型的集合 243 20.1.3 对Domain的只读访问 243 20.1.4 定义默认排序字段 243 20.1.5 改进的findBy 245 20.2 对插件系统的改进 245 20.3 数据绑定 245 20.4 在GSP中使用JSP的标签 246 20.5 加密配置文件中的数据库密码 246 20.6 本章小结 246 参考文献 247 索引 248 Grails技术精解与Web开发实践 目录 XII XI

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chengbo_eva

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值