【JavaSE】----- Java语言的介绍

目录

一、Java语言概述

🎄 Java是什么?

🎄 为什么选择Java语言?

🎄 Java语言发展简史

🎄 Java是最好的语言吗?

🎄 Java语言的优势

二、初识Java中的main方法

三、运行Java程序

四、编写Java代码需要注意的事项


一、Java语言概述

🎄 Java是什么?

  • Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。

🎄 为什么选择Java语言?

🌴 这里先说一个题外话,很多同学可能会问 JavaScript和Java有什么关系呢?

  • 要说到这俩的关系,举个例子:就相当于雷锋和雷峰塔的关系或者说老婆和老婆饼的关系(没有一点关系...),最开始JavaScript 叫 liveScript,当时Java太火了,于是乎liveScript更名为JavaScript借势宣传一波。其实就是为了蹭热度!

回到正题,之所以选择Java语言是因为Java的特性!

🌊 简单性:

  • Java语法是C++语法的一个“纯净版本”。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等等。不仅如此,Java开发环境远远超出大多数其他编程语言的开发环境。
  • 面向对象:什么是面向对象? 这里我们用木匠打一个比方,一个“面向对象”的木匠始终关注的是所制作的椅子,第二位才是所使用的工具;而一个“非面向对象的”木匠首先考虑的是所使用的工具。
  • 在Java的世界里,一切皆对象。
  • Java的面向对象特性与C++旗鼓相当,与C++的主要不同点在于多重继承。在Java中,取而代之的是更简单的接口概念。而且与C++相比,Java提供了更丰富的运行时自省功能。

🌊 分布式(微服务):

  • Java有丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。

🌊 健壮性:

  • Java与C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性(对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性)。不仅如此,Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。

🌊 安全性:

  • Java适用于网络/分布式环境。为了达到这个目标,在安全性方面投入了大量的精力。使用Java可以构建防病毒、防篡改的系统。
  • 从一开始,Java就设计成能够防范常见的各种攻击:
  1. 运行时堆栈溢出。蠕虫和病毒常用的攻击手段。
  2. 破坏自己进程空间之外的内存。
  3. 未经授权读写文件

🌊 体系结构中立:

  • 编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,这些编译后的代码就可以在许多处理器上运行。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易的在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。

🌊 可移植性:

  • 与C/C++不同,Java规范中没有“依赖具体实现的地方”。基本数据类型的大小以及有关运算都做了明确的说明。例如,Java中的int永远是32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头疼的主要问题。

🌊 解释型:

  • Java解释器可以在任何移植了解释器的机器上执行Java字节码。由于链接是一个增量式且轻量级的过程。所以开发过程也变得更加快捷,更加具有探索性。

🌊 高性能:

  • 尽管对解释后的字节码性能已经比较满意,但在有些场合下可能需要更加高效的性能。字节码可以(在运行时刻)动态的翻译成对应运行这个应用的特定cpu的机器码。

🌊 多线程:

  • Java在当时很超前。它是第一个支持并发程序设计的主流语言。多线程可以带来更好的交互响应和实时行为。并发程序设计绝非易事,但是Java在这方面表现出色,可以很好的管理这个工作。

🌊 动态性:

  • Java与C/C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端没有任何影响。在Java中找出运行时类型信息十分简单(反射的特性,后续会讲到)。

🎄 Java语言发展简史

  • Java 语言源于 1991 年 Sun 公司 James Gosling 领导的的 Oak 项目,1995 年 Sun 公司正式起名为 Java,并提出 “Write once, Run anywhere" (一次编译,到处运行)的口号。
  • 1996 年 1 月 Java 1.0 发布,提供了一个解释执行的 Java 虚拟机,其时恰逢互联网开始兴起,Java 的 Applet 能在Mozilla 浏览器中运行,被看作是未来的互联网语言。
  • 1997 年 2 月 Java 1.1 发布,Java 语言的基本形态基本确定了,比如反射 (reflection), JavaBean, 接口和类的关系等等,一直到今天都保持一致。然而,Java 最初的一些目标,如在浏览器中执行 Applet,以及跨平台的图形界面Awt 很快遭遇到负面的评价。
  • 1998 年 12 月,Java 第一个里程碑式的版本,即 Java 1.2 发布了。这个版本使用了 JIT(Just in time)编译器技术,使得语言的可迁移性和执行效率达到最优的平衡,同时Collections 集合类设计优良,在企业应用开发中迅速得到了广泛使用。Sun 公司把 Java 技术体系分成三个方向,分别是 J2SE(面向桌面和通用应用开发),J2EE(面向企业级应用开发),J2ME(面向移动终端开发)。这个分类影响非常久远,体现出主流语言设计者的思想:针对于不同的应用领域,在形态,API 集合等进行划分。
  • 2000 年 5 月,Java 1.3 发布,这个版本中 Corba 作为语言级别的分布式对象技术,成为 J2EE 的一个技术前提。J2EE 受到 Corba 的设计的影响较大,早期 EJB 的 Home,接口和实现就是 Corba 在 C 语言的实现,被移植到Java 语言之中。J2EE 中的 Servlet 规范获得了极大的成功,伴随着互联网的兴起,和浏览器直接通过 HTTP 协议交互的 Servlet,和众多的 MVC 框架,成为 Web1.0 的网红。
  • 2002 年 2 月,Java 1.4 发布,Java 语言真正走向成熟,提供了非常完备的语言特性,如 NIO,正则表达式,XML处理器等。同年微软的.NET 框架发布,两者开始了为期十几年的暗自竞争。从语言特性上来说,.NET 后发先至,一直处于优势。但 Java 依赖良好的开发者生态,绝大多数大型软件公司的使用者众多和不断贡献,以及对 Linux操作系统良好的支持,渐渐的在服务器端获得优势地位。 2004 年 9 月,Java 5 发布,Sun 不再采用 J2SE, J2EE 这种命名方式,而使用 Java SE 5, Java EE 5 这样的名称。我认为 Java 5 是第二个里程碑式的版本。Java 语言语法发生很大的变化,如注解 (Annotation),装箱 (Autoboxing),泛型 (Generic),枚举 (Enum),foreach 等被入,提供了java.util.concurrent 并发包。Java 5 对于 Java 语言的推动是巨大的,特别是注解的加入,使得语言定义灵活了很多,程序员可以写出更加符合领域定义的描述性程序。
  • 2006 年 5 月, JavaEE 5 发布,其中最主要是 EJB3.0 的版本升级。在此之前,EJB2.X 版本被广泛质疑,SpringFramework 创建者 Rod Johnson 在经典书籍“J2EE Development without EJB“中,对 EJB2 代表的分布式对象的设计方法予以批驳。EJB3 则重新经过改造,使用注解方式,经过应用服务器对 POJO 对象进行增强来实现分布式服务能力。在某种程度,可以说 EJB3 挽救了 JavaEE 的过早消亡。 2006 年 12 月,Java 6 发布,这个语言语法改进不多,但在虚拟机内部做了大量的改进,成为一个相当成熟稳定的版本,时至今日国内的很多公司依然以Java6 作为主要 Java 开发版本来使用。同年 Sun 公司做出一个伟大的决定,将 Java 开源。OpenJDK 从 Sun JDK1.7 版本分支出去,成为今天 OpenJDK 的基础。OpenJDK6 则由 OpenJDK7 裁剪而来,目前由红帽负责维护,来满足 Redhat Enterprise Linux 6.X 用户的需要。
  • 2009 年 12 月,JavaEE 6 发布,这个版本应该说是 JavaEE 到目前为止改进最大影响最深远的一个版本。因为JavaEE5 只有 EJB3 适应了 Java 注解语法的加入,而 EE6 全面接纳了注解。CDI 和 BeanValidation 规范的加入,在 POJO 之上可以定义完备的语义,由容器来决定如何去做。Servlet 也升级到 3.0 版本,并在接口上加入异步支持,使得系统整体效率可以大幅提高。EE 划分为 Full Profile 和 Web Profile,用户可以根据自己的需要选择不同的功能集。
  • 在此之前,Oracle 已经以 74 亿美金的价格收购了 Sun 公司,获得了 Java 商标和 Java 主导权。也收购了 BEA 公司,获得市场份额最大的应用服务器 Webogic。JavaEE 6 虽然是收购之后发布的版本,但主要的设计工作仍然由原 Sun 公司的 Java 专家完成。 2011 年 7 月,Oracle 发布Java 7, 其中主要的特性是 NIO2 和 Fork/Join 并发包,尽管语言上没有大的增强,但我个人认为,自从 Oracle JDK(包括 OpenJDK7),Java 虚拟机的稳定性真正做到的工业级,成为一个计算平台而服务于全世界。
  • 2013 年 6 月,Oracle 发布 JavaEE 7,这个版本加入了 Websocket,Batch 的支持,并且引入 Concurrency 来对服务器多线程进行管控。然而所有的子规范,算上可选项 (Optional) 总共有 40 多项,开发者光是阅读规范文本就 很吃力了,更不要说能够全局精通掌握。JavaEE 规范的本质是企业级应用设计的经验凝结,每一个 API 都经过众多丰富经验的专家反复商议并确定。各个版本之间可以做到向后兼容,也就是说,即使是 10 年前写的 Servlet 程序,当前的开发者也可以流畅的阅读源码,经过部分代码调整和配置修改,可以部署在当今的应用服务器上。反过来,今后用 Servlet4 写的程序,浏览器和服务器通信使用全新的 HTTP/2 协议,但程序员在理解上不会有障碍,就是因为 Servlet 规范的 API 非常稳定,基本没有大的变化修改。
  • 2014 年 3 月,Oracle 发布 Java 8,这个版本是我认为的第三个有里程碑意义的 Java 版本。其中最引人注目的便是 Lambda 表达式了,从此 Java 语言原生提供了函数式编程能力。语言方面大的特性增加还有:Streams,Date/Time API,集合的并行计算支持等,Java8 更加适应海量云计算的需要。
  • 2018 年 3 月,Java 10 正式发布,并带来 109 项新特性。
  • 美国当地时间2018 年9月25日,Oracle 官方宣布Java 11 (18.9 LTS) 正式发布,可在生产环境中使用!这是自 Java8 后的首个长期支持版本

🎄 Java是最好的语言吗?

🌀 答案:不是,因为在每个领域都有更合适的编程语言。

  • C 语言无疑是现代计算机软件编程语言的王者,几乎所有的操作系统都是 C 语言写成的。
  • C++ 是面向对象的 C 语言,一直在不断的改进。
  • JavaScript 是能运行在浏览器中的语言,丰富的前端界面离不开 Javascript 的功劳。近年来的 Node.js 又在后端占有一席之地。
  • Python 用于系统管理,并通过高性能预编译的库,提供 API 来进行科学计算,文本处理等,是 Linux 必选的解释性语言。
  • Ruby 强于 DSL(领域特定语言),程序员可以定义丰富的语义来充分表达自己的思想。
  • Erlang 就是为分布式计算设计的,能保证在大规模并发访问的情况下,保持强壮和稳定性。
  • Go 语言内置了并发能力,可以编译成本地代码。当前新的网络相关项目,很大比例是由Go 语言编写的,如Docker、Kubernetes 等。
  • 编写网页用 PHP,函数式编程有 Lisp/Scala,编写 iOS 程序有 Swift/Objective-C。

一句话概括,能留在排行榜之上的语言,都是好的语言,在其所在的领域能做到最好。

🎄 Java语言的优势

  • 语法比较简单,学过计算机编程的开发者都能快速上手。
  • 在若干了领域都有很强的竞争力,比如服务端编程,高性能网络程序,企业软件事务处理,分布式计算,Android 移动终端应用开发等等。
  • 最重要的一点是符合工程学的需求,我们知道现代软件都是协同开发,那么代码可维护性,编译时检查,较为高效的运行效率,跨平台能力,丰富的 IDE,测试,项目管理工具配合。都使得 Java 成为企业软件公司的首选,也得到很多互联网公司的青睐。
  • 没有短板,容易从市场上找到 Java 软件工程师,软件公司选择 Java 作为主要开发语言,再在特定的领域使用其他语言协作编程,这样的组合选择,肯定是不会有大的问题。 所以综合而言,Java 语言全能方面是最好的。

我们来一起看看Java社区的概况:

  • Java 是一门开放的语言,其开源社区也是参与者众多。最有名的应当数 Apache 社区,目前已经拥有近 200 个顶级项目,其中绝大多数是 Java 语言项目。在 Java 生态圈中,具有重要地位的如 Spring、Ant、Commons、Tomcat、Xerces、Maven、 Struts、Lucene、ActiveMQ、CXF、Camel、Hadoop 等等。很多技术时代,一大批 Java 项目加入,如 Web 时代的 Velocity、Wicket;JavaEE 相关的 Tomee、OpenJPA、OpenWebBeans、Myfaces;WebService 时代的 jUDDI、Axis、ServiceMix;Osgi 时期的 Flex、Karaf;大数据时代的 HBase、Hive、ZooKeeper、Cassandra;云时代的 Mesos、CloudStack 等等。
  • 涉及到软件开发的方方面面,可以说当今几乎所有的中型以上 Java 应用中,都会有 Apache 开源项目的身影。国内最早参与 Apache 社区的以国外软件公司国内研发团队成员为主,如红帽、IONA、Intel、IBM 研发中心等。如今国内互联网公司和软件公司也不断的参与,特别是开始主导一些 Apache 项目,如 Kylin 等。
  • JBoss 开源社区,包含了 50 多个 Java 开源项目,其中有 Hibernate、Drools、jBPM 等业界知名开源项目,也有Undertow、Byteman、Narayana 等名气不算大,但绝对是相应领域业界的顶级优秀项目。当前 JBoss 开源社区主要以企业应用中间件软件为主,RedHat 是主要的技术贡献力量。
  • Eclipse 开源社区,之前主要是包含 Eclipse IDE 的项目,后来也逐步进行多方面的扩展,比如 OSGi,服务器等,目前一些知名 Java 项目,如 Jetty、Vertx 等都是 Eclipse 开源组织成员。此外 IOT 目前是 Eclispe 的一个重点方向,在这里可以找到完整的 IOT Java 开发方案。
  • Spring 开源社区,以 SpringFramework 为核心,包括 SpringBoot、SpringCloud、SpringSecurity、SpringXD 等开源项目,在国内有广泛的应用场景。

Java不仅仅是一门编程语言,它是一个综合的技术体系,是面向对象思想的规范

二、初识Java中的main方法

🍓 在JAVA中函数也称为方法,方法必须写在类里面。

public class HelloWorld{
	public static void main(String[] args){
		System.out.println("hello");
	}
}
  • public:访问修饰限定符。
  • class:关键字,用来定义一个类。类型(抽象的)
  • HelloWorld:由关键字定义的类的名称。
  • JAVA中所以的左大括号是写在语句后面的(同一行)。
  • public static void main(String[] args):是JAVA中main函数的固定写法。
  • String[] args:是一个形式参数。(args 是一个数组)在C语言中定义数组:int arr[ ];,但是在JAVA中定义数组:int [ ] arr;,两种语言定义数组的书写形式不用。
  • System.out.println(); 相当于C语言中的 printf()函数。
  • "hello":由双引号引起来的内容称为字符串。

🎉 如上展示的就是最简单的一个Java程序,可以说,Java的main方法应该是当前主流编程语言中最“长”的。
🎉 通过上述代码,我们可以看到一个完整的Java程序的结构,Java程序的结构由如下三个部分组成:

  1. 源文件(扩展名为*.java):源文件带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个类。类的内容必须包含在花括号里面。
  2. 类:类中带有一个或多个方法。方法必须在类的内部声明。
  3. 方法:在方法的花括号中编写方法应该执行的语句。

总结:类存在于源文件里面;方法存在于类中;语句存在于方法中

三、运行Java程序

  • Java是一门半编译型、半解释型语言。先通过javac编译程序把源文件进行编译,编译后生的.class文件是由字节码组成的平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。
  • JRE(Java Runtime Environment):Java运行时环境,包含了JVM,Java基础类库。是使用Java语言编写程序运行的所需环境。
  • JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。

Java程序运行需要经过编译,运行两个阶段。

  1. 编译:javac 命令
  2. 运行:java 命令

JAVA代码使用记事本编写后,运行代码的步骤(本人当前使用的是 sublime text 编写的代码):

使用记事本编写代码,如果这个列是public修饰的,类型要与文件名一致!

1、首先进入存放代码的目录(文件夹)中。

🎋 方法一:打开CMD使用命令

  • CMD打开默认所在的路径是C盘,如果所写的代码也在C盘的目录中,就可以使用命令:     “cd 代码所在路径(存放代码的目录)”,敲完回车键(Enter)后就可以进入该目录。
  • 在该目录下输入 dir 命令就可以看到在该目录中所写的JAVA代码(这一步可以不用做)。
  • 如果所写的代码在其他磁盘中,首先使用命令进入到保存代码的磁盘。例如代码在E盘:e: -> 回车然后使用命令:cd 代码所在路径(存放代码的目录)。

🎋 方法二:

  • 打开代码所在的目录(文件夹),<按 shift + 鼠标右键 > 在弹出的菜单中有一个Powershell窗口,打开Powershell窗口所在的路径就是当前目录(文件夹)。

 

 2、编译代码:

  • 进入到存放代码的目录(文件夹)后,使用命令:javac HelloWorld.java (这里的HelloWorld.java 是所写代码的文件名)。执行此命令后会在该目录中生成一个后缀名为.class的字节码文件。

看一下字节码文件(.class文件)中的内容:

可以看到这个文件中第一行存放了一个 cafe babe,然后就是一些十六进制数。

🍉 补充:第一行为什么会存放cafe babe 呢?

  • Class 文件的第 1 - 4 个字节代表了该文件的魔数(Magic Number)。它唯一的作用是确定这个文件是否为一个能被虚拟机接受的 Class 文件,其值固定是:0xCAFEBABE(咖啡宝贝)。如果一个 Class 文件的魔数不是 0xCAFEBABE,那么虚拟机将拒绝运行这个文件。
  • Class 文件的第 5 - 6 个字节代表了 Class 文件的次版本号(Minor Version),即编译该 Class 文件的 JDK 次版本号。
  • Class 文件的第 7 - 8 个字节代表了 Class 文件的主版本号(Major Version),即编译该 Class 文件的 JDK 主版本号。
  • 高版本的 JDK 能向下兼容以前的 Class 文件,但不能运行新版本的 Class 文件。例如一个 Class 文件是使用 JDK 1.5 编译的,那么我们可以用 JDK 1.7 虚拟机运行它,但不能用 JDK 1.4 虚拟机运行它。

下表列出了各个版本 JDK 的十六进制版本号信息:

图中的 Class 文件,其前 8 个字节分别是:cafe babe 0000 0034。那么可以知道,这个 Class 文件是由 JDK1.8 编译的。 

3、运行代码:

  • 使用命令 java HelloWorld (HelloWorld是文件名),再按回车键。此时屏幕上就会出现代码打印(输出)的内容。

  •  JAVA代码是使用JVM(Java虚拟机)运行的。
  • JVM:Java虚拟机。作用:运行Java程序!
  • Java虚拟机实际上是一个软件,是使用C/C++编写的。Java程序最终是在Java虚拟机上运行的,是用软件实现了一个类似硬件(电脑)的东西。
  • JVM是将对应的字节码文件拉过去然后执行。

🍓 JDK:Java开发者工具

🍓 JRE:Java运行环境

🍓 JVM:Java虚拟机

  • 既然JVM执行的是字节码文件(.class),所以只要拿到一个Java代码的字节码文件,然后使用命令:java 文件名,就可以直接运行代码。
  • 这个就是文章前面所说的Java的口号:一次编译,到处运行!(前提是电脑上必须安装了JDK)

四、编写Java代码需要注意的事项

1、如果使用public修饰的类与文件名不同,编译代码的时候就会报错。

2、一个文件中可以写多个类,类名不能相同。一个文件中只能有一个public修饰的类。一个类对应一个字节码文件。

 一个类对应生成一个字节码的好处是:使用哪个类就加载哪个类,不用将所有类都加载。

一般情况下我们习惯一个Java文件中只写一个类,但是一个文件中写多个类也不会报错。

🍉3、public static void main(String[] args) 中的 args 表示什么?

文章前面说了String[] args 是一个数组,接下来将数组中的内容打印出来看一下:

public class HelloWorld{
	public static void main(String[] args){
		//Java中使用 数组名.length 获取数组的长度
		for(int i = 0; i<args.length;i++){

		}
		System.out.println("hello");
	}
}

args 是一个字符串数组,数组的大小取决于在运行代码时输入字符串的个数。例如此时输入了两个字符串,数组的大小就是2。

args表示运行时的命令行参数,在运行时,后面所写的字符串就会被存放在args数组中。

4、 Java中的注释

/**
 * 文档注释
 * 放在类或者方法的前面
 */
public class HelloWorld{
	public static void main(String[] args){

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

			//System.out.println(args[i]); 单行注释

			/*
			System.out.println(args[0]);
			System.out.println(args[1]);
			多行注释
			*/
		}
		System.out.println("hello");
	}
}

🌀 如果在sublime text 记事本中,写代码的时候加入过多的中文注释,编译代码会报错。

  •  这是由于字节码格式不匹配所导致的,因为字节码格式不匹配导致的,使用sublime text 编译java文件默认是文本文档,以ASCII码值形式的文件 (也是个字节码文件)。
  • 在sublime text 中写的代码是文本文件(ASCII码文件),文本文件保存内容的格式一般都是utf-8。而javac编译中使用的是GBK。
  • 两个编码格式不匹配所以才会报错,只要指定javac编译器使用utf-8的标准去编译就不会报错。

解决方法:在编译指令javac HelloWorld. javac后面加上-encoding utf- 8 再进行编译。

补充

  • utf-8:8位Unicode转换格式(UTF 8)是一种用于编码各 种字符的相对较新的代码约定。它是字符标识的标准,也是各种编程语言和设备的参考,有助于标准化字母,数字和其他字符的显示。
  • GBK :Chinese Internal Code Extension Specif icat iono (汉字内码扩展规范)。GBK编码,是在GB2312- 80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE, 共23940个码位, 共收录了21003个汉字,完全兼容GB2312 80标准,支持国际标准ISO/IEC10646- 1和国家标准GB130001中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。

5、Java中的打印(输出)个格式有三种

public class HelloWorld{
	public static void main(String[] args){
		System.out.print("打印不换行");
		System.out.println("打印换行"); //这个打印格式使用最多
		System.out.printf("%d",10); //这个打印格式基本不使用
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

潇湘夜雨.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值