Java基础学习 I

目录

​编辑

一、基础概念

1、接口

1.1 GUI

1.2 命令接口

2、JDK安装目录

3、java程序编写运行流程

4、java三大使用平台

4.1 Java SE

4.2 Java ME

4.3 Java EE

5、java跨平台

6、JRE和JDK

6.1 JDK组成

6.2 JRE组成

6.3 JDK、JRE、JVM关系

二、基础语法1

1、注释

2、关键字

3、常量(字面量)

4、变量

5、计算机的存储规则

6、数据类型

6.1 基本数据类型

6.2 引用数据类型

7、标识符

8、键盘录入

9、获取随机数

10、项目结构

11、运算符

12、原码、反码、补码

三、基础语法2

1、流程控制语句

1.1 顺序结构

1.2 分支结构

1.3 循环结构

2、数组

2.1 介绍

2.2 定义和初始化

2.3 元素访问

2.4 数组遍历

2.5 数组内存图

3、方法

3.1 定义

3.2 格式

3.3 重载

3.4 值传递

3.5 二维数组

4、面向对象

4.1 类和对象

4.2 封装 

4.3 变量

4.4 构造方法

4.5 内存 


一、基础概念

1、接口

1.1 GUI

  • 施乐首先推出图形化界面
  • 缺点:消耗更多内存;巡行速度慢

1.2 命令接口

Windows下的CMD命令行

1.2.1 常用CMD命令

  • 盘符名称+冒号(英文状态下):盘符切换
  • dir:查看当前路径下的内容,会显示包含隐藏文件的所有内容
  • cd 目录:进入单级目录
  • cd ..:回退到上一级目录
  • cd 目录1\目录2\...:进入多级目录
  • cd \:回退到盘符目录
  • cls:清屏
  • exit:退出命令提示符窗口

1.2.2 问题

        对于常用的应用程序,运行前需要通过命令行启动可执行文件,但是部分可执行文件打开时需要切换盘符(麻烦)。对此,可以将应用程序的路径记录在特定位置=>配置环境变量(高级系统设置)=>系统先在当前目录下查找是否存在该应用程序,若不存在,则在环境变量中寻找=>实现了在任意目录下打开指定的软件。

2、JDK安装目录

  • bin:路径下存放各种工具命令,如javac和java
  • conf:路径下存放相关配置文件
  • include:路径下存放一些平台特定的头文件
  • jmods:路径下存放各种模块
  • legal:路径下存放各模块的授权文档
  • lib:路径下存放工具的补充JAR包

3、java程序编写运行流程

  • 记事本编写程序(.java文件)
  • 编译文件(javac .java文件)(.class字节码文件):javac是JDK提供的编译工具
  • 运行程序(java 文件名不加.class后缀名):java是JDK提供的运行代码的工具 

4、java三大使用平台

4.1 Java SE

        Java语言的标准版,用于桌面应用的开发,是后两个版本的基础。桌面应用指用户打开程序,程序界面会让用户在最短时间内找到所需功能,同时主动带领用户完成工作并得到最好的体验,通常使用C/C++语言。

4.2 Java ME

         Java语言的小型版,用于嵌入式电子设备(电视机、数码相机等)或者小型移动设备(手机)。

4.3 Java EE

        Java语言的企业版,用于Web方向的网站开发。网站开发包括浏览器和服务器的开发。

5、java跨平台

        Write Once, Run Anywhere: Java程序可以在任意平台(Windows、Linux等操作系统)运行。

  • 高级语言编译运行方式:编程——编译——运行
  • 虚拟机:Java语言的跨平台性是通过虚拟机实现的,它不是直接运行在操作系统里,而是运行在虚拟机中的。因此,可以针对不同的操作系统,安装不同的虚拟机。

6、JRE和JDK

6.1 JDK组成

        JDK(Java Development kit):Java开发工具包

  • JVM(Java Virtual Machine):Java虚拟机,真正运行Java程序
  • 核心类库:事先定义好的类库,可直接使用,如System。
  • 开发工具:javac编译工具、java运行工具、jdb调试工具、jhat内存分析工具等。

6.2 JRE组成

        JRE(Java Runtime Environment):Java运行环境

  • JVM
  • 核心类库
  • 开发工具:不完整,但必须包含java运行工具

6.3 JDK、JRE、JVM关系

        JDK包含JRE,JRE包含JVM。


二、基础语法1

1、注释

  • 单行注释://
  • 多行注释:/* */
  • 文档注释:/** */

注意:注释内容不参与程序的编译和运行(不会出现在.class文件中);多行注释内不能嵌套注释

2、关键字

  • 关键字:是Java中被赋予了特定涵义的英文单词,字母全部小写
  • class:用于创建或定义一个类

3、常量(字面量)

  • 整数类型
  • 小数类型
  • 字符串类型:双引号括起来的内容
  • 字符类型:单引号括起来的,且仅有一个的内容
  • 布尔类型:表示真假(true/false)
  • 空类型:一个特殊的值,空值(null)。不能直接打印,可以以字符串的形式打印

特殊的字符:

  • '\t':制表符。在打印的时候,把'\t'前面的字符串的长度补齐到8或8的整数倍,至少补1个空格,至多补8个空格=>使表格数据对齐

4、变量

  • 使用场景:当某个数据的值经常发生改变时,可以用变量存储。当数据变化时,只需要修改变量内记录的值。
  • 定义格式:数据类型 变量名 = 数据值;
  • 注意:一个变量在一个时刻只能存储一个值;变量名不允许重复定义;一条语句可以定义多个变量,可同时初始化;变量在使用前需要进行赋值;变量使用需要注意其作用域范围

5、计算机的存储规则

三类数据:(任意数据都是以二进制形式存储)

(1)Text文本(数字,字母,汉字):数字直接转换为二进制,字母通过ASCII码表查询,汉字查询gb2312以找到唯一对应的数字。Unicode编码(国际标准字符集)将世界各种语言的每个字符定义唯一的编码,以满足跨语言、跨平台的文本信息转换。

(2)Image图片:黑白图,灰度图,彩色图

  • 分辨率:宽*高=>分割成若干个小格子
  • 像素:每个小格子称为一个像素,例如宽n个像素,高m个像素=>定义一个软件大小
  • 黑白图:每个像素点赋值为0或1,0为黑,1为白
  • 灰度图:灰度表用0~255表示灰度数据(0表示纯黑,255表示纯白),每个像素点具有特定的灰度
  • 彩色图:三原色(RGB红绿蓝),每种颜色的深度用一个值表示,值越大越深,值的范围0~255。每个像素点用不同程度的三原色搭配形成。

(3)Sound声音 :波形图,每个点有对应的数字

JDK7版本后,不同进制在代码中的表现形式:

  • 二进制:由0和1组成,并以0b开头
  • 十进制:由0~9组成,且不加任何前缀
  • 八进制:由0~7组成,并以0开头
  • 十六进制:由0~9、a~f组成,且以0x开头

6、数据类型

6.1 基本数据类型

  • 整数:byte(1B)(-128~127)、short(2B)、int(4B)(默认)、long(8B)(以l/L为后缀)
  • 浮点数:float(4B)(以f/F为后缀)、double(8B)(默认)
  • 字符:char(2B)
  • 布尔:boolean(1B)(true/false) 

取值范围:double>float>long>int>short>byte

6.2 引用数据类型

  • 基本数据类型:栈中的变量存储的是真实的数据的值
  • 引用数据类型:通过new关键字创建,栈内存中的变量记录的是数据存放在堆内存中的地址值,且堆内存中记录的是成员变量的具体值,以及成员方法在方法区中的地址值(对象)。“引用”其他内存空间

7、标识符

标识符是用户自定义的类、方法、变量名,必须遵守以下规则

  • 由数字、字母、下划线、美元符组成
  • 不能以数字开头
  • 不能是关键字
  • 标识符区分大小写

提高代码可读性:

  • 方法、变量:小驼峰命名法=>标识符是一个单词的时候,全部小写;标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写
  • 类名:大驼峰命名法=>标识符是一个单词的时候,首字母大写;标识符由多个单词组成的时候,每个单词首字母大写

8、键盘录入

(1)Scanner类可以接收键盘输入的数字

  • 导包:import java.util.Scanner;
  • 创建对象:Scanner sc = new Scanner(System.in);
  • 接收数据:根据数据类型调用方法
  • 遇到空格、制表符、回车会停止
    • nextInt():接收整数
    • nextDouble():接收小数
    • next():接收字符串
  • nextLine():接收字符串,可以接收空格和制表符,遇到回车停止
  • 当两类键盘录入混用时,可能出现:输入一个整数加回车
    • nextInt接收到整数后停止,nextLine接着从缓冲区接收回车而直接停止

9、获取随机数

(1)Random类可以生成一个随机数

  • 导包:import java.util.Random;
  • 创建对象:Random r = new Random();
  • 生成随机数:int number = r.nextInt(随机数范围);
  • 随机数范围:nextInt(n)=> [0,n-1)
  • 任意数m~任意数n => [m,n]—转换—[0,n-m]—转换—[0,n-m+1)=> nextInt(n-m+1)+m

10、项目结构

project(项目)=>module(模块)=>package(包)=>class(类)


11、运算符

  • 运算符:对字面量(常量)或变量进行操作的符号
  • 表达式:用运算符把字面量或变量连接起来、符合java语法的式子,不同运算符连接的表达式体现的是不同类型的表达式。

11.1 算术运算符:+、-、*、/、%(取模或取余)

        注意:浮点数参与的计算,结果可能不精确;整数除法的结果向下取整

        %应用场景:判断a是否可以被b整除;判断a是否为偶数;环形队列

(1)'+':

  • 数字相加 => 类型不同时,先类型转换再相加
  • 隐式转换:自动把取值范围小的数据类型转换为取值范围大的数据类型;

        byte、short、char会先转为int再进行计算 

      (byte->short->int->long->float->double)

byte b1 = 1;        byte b2 = 2;        result = b1 + b2;        =>        int

  • 强制转换:把取值范围大的数值赋给取值范围小的变量,可能导致数值错误

        格式:目标数值类型 变量名 = (目标数据类型)被强制转换的数据

byte b1 = 1;        byte b2 = 2;        byte result = (byte)(b1 + b2); 
  • 字符串相加 => 字符串的连接符,前后字符串拼接并产生新的字符串;两个操作数中至少有一个为字符串;连续'+'时,从左到右逐个执行(注意单个+两侧操作数类型)
  • 字符相加 => 字符+字符、字符+数字 => 把字符通过ASCII码表查询到对应的数字再进行计算;如果另一个操作数为字符串,则直接进行拼接
'A' = 65        0x41'Z' = 90        0x5A
'a' = 97        0x61'z' = 122       0x7A

11.2 自增自减运算符:++、--

  • 自增自减运算符在单独使用时,无论在变量的前面或后面,运算结果一样
  • 自增自减运算符参与计算(包括赋值、比较等操作)时,运算符在变量后面则先用后自增/自减,运算符在变量前面则先自增/自减再用。

11.3 赋值运算符:=、+=、-=、*=、/=、%=

  • +=、-=、*=、/=、%=底层隐含了一个强制类型转换,转换成运算符左侧操作数的数据类型

11.4 关系运算符:==、!=、>、>=、<、<=        结果为true/false

11.5 逻辑运算符:&(逻辑与)、|(逻辑或)、^(逻辑异或)、!(逻辑非)

        优化:短路逻辑运算符,可能提前结束判断(此时,右侧的表达式不会运算),最终运算结果不变。

  • &必须判断两个条件 => &&(短路与):先判断左侧条件是否为true,若不是则直接返回false。反之,接着判断右侧条件是否为true。
  • |必须判断两个条件 => ||(短路或):先判断左侧条件是否为ture,如是则直接返回true。反之,接着判断右侧条件是否为true。

11.6 三元运算符:关系表达式?表达式1:表达式2;

  • 先判断关系表达式的真假,若结果为真,则执行表达式1,否则执行表达式2.
  • 作用:可以进行判断,并根据判断的结果得到不同的内容,可以嵌套

11.7 运算符的优先级

优先级运算符
1.        ()        {}
2!        - (负号)        ++        --
3*        /        %
4+        -
5<<        >>        >>>
6<        <=        >        >=        instanceof
7==        !=
8&
9^
10|
11&&
12||
13? :
14=        +=        -=        *=        /=        %=        &=

12、原码、反码、补码

  • 原码:十进制数据的二进制表现形式,最高位为符号位(0正1负);利用原码对正数进行计算不会出现问题,但是对负数进行运算时实际结果会与我们预期结果相反。
  • 反码:为了解决原码不能计算负数的问题 => 正数的反码和原码相同,负数的反码在原码的基础上,符号位不变,数值位全部取反。
  • 补码:为了解决正负零和负数计算问题(即负数计算时跨0的问题) => 正数的补码和原码相同,负数的补码在反码的基础上加1。计算机中的存储与运算均以补码形式进行的。

隐式转换:在被转换的数值高位补符号位

强制转换:取被转换的数值低位,转换后最高位为符号位

运算符补充:

&(逻辑与):两个操作数直接以十进制形式出现,则运算时先转换为补码。如果数据类型不一致,则低位的数据补齐至高位。最后按位与得到一个新的补码。

|(逻辑或):两个操作数直接以十进制形式出现,则运算时先转换为补码。如果数据类型不一致,则低位的数据补齐至高位。最后按位或得到一个新的补码。

注意:不能用短路逻辑运算符计算两个数值

<<(左移):向左移动n位,低位补0 => 乘2^n

>>(右移):向右移动n位,高位补符号位 => 除2^n

>>>(无符号右移):向右移动n位,高位补0


三、基础语法2

1、流程控制语句

1.1 顺序结构

顺序结构语句是java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行

1.2 分支结构

  • if 语句:

if(关系表达式){        // 单条件判断

        语句体;

}

  • 在语句体中,如果只有一句代码,大括号可以省略不写(int a = 100;包含变量定义与赋值,不能省略大括号)
  • 若表达式结果为布尔类型,可以省略关系运算符
  • 一般可用于处理异常数据

if(关系表达式){        // 双条件判断

        语句体1;

} else {

        语句体2;

}

if(关系表达式1){        // 多条件判断

        语句体1;

} else if(关系表达式2){

        语句体2;

}

...

else{

        语句体 n+1;

}

  • switch 语句:在已有的多选项中选择

switch(表达式){

        case 值1:

                语句体1;

                break;

        case 值2:

                语句体2

                break;

...

        default:

                语句体n+1;

                break;

}

  • 依次(从上至下)和case后的值进行比较,若匹配到则执行对应的语句体直到break,若所有值均不匹配则执行default中的语句。
  • 表达式:取值可为byte、short、int、char,JDK5后可以为枚举,JDK7后可以为String。
  • case:待比较的值只能是常量,不能是变量,且值不能重复
  • default:位置不一定在最后一行,但是执行时都会先和不同case的值比较,不匹配才会执行default;可以省略,但是特殊数据下可能报错。
  • case:若case语句体中不存在break则可能出现穿透现象,即表达式中的值依次和不同case值比较,当匹配上时则执行对应的case语句体,若该语句体中存在break时则当执行到break时结束switch语句,若不存在break则执行完当前case语句体后会继续执行下一个case的语句体直到遇上break或括号。
  • JDK12后的switch新特性:用大括号简化break => 一行语句可以省略大括号

switch和if语句的第三种格式(多条件判断):

  • if语句的第三种格式:一般适用于对不同取值范围的判断
  • switch:一般将有限个数据列举出来后,任选其一
        switch (day){
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                System.out.println("工作日");
                break;
            case 6:
            case 7:
                System.out.println("休息日");
                break;
            default:
                System.out.println("输入错误");
        }
        switch (day){
            case 1,2,3,4,5:
                System.out.println("工作日");
                break;
            case 6,7:
                System.out.println("休息日");
                break;
            default:
                System.out.println("输入错误");
        }
        // JDK12后的新特性
        switch (day){
            case 1,2,3,4,5 -> System.out.println("工作日");
            case 6,7 -> System.out.println("休息日");
            default -> System.out.println("输入错误");
        }

1.3 循环结构

  • for循环:  

for(初始化语句;条件判断语句;条件控制语句){

        循环体语句;

}

  • 当变量定义在循环体内时,该变量只在循环体内有效,且每次循环都会重新创建变量,并在当前循环结束时变量也会从内存中消失
  • 快速生成[0,n)的for循环:n.fori+回车
  • while循环:

初始化语句;

while(条件判断语句){

        循环体语句;

        条件控制语句;

}

  • for循环和while循环对比
相同:运行规则一致,可以相互转换

区别:

for循环:控制循环的变量如果在初始化语句中定义的,则在循环结束后会被自动释放掉,之后的语句不能直接使用

 while循环:控制变量是在循环外定义的,不归属于while语法结构中,在循环结束后不会被释放掉,还可以继续直接使用


for循环:一般知道循环次数或循环的范围

while循环:不知道循环的次数或范围,只知道循环结束的条件

  • do...while循环

初始化语句;

do{

        循环体语句;

        条件控制语句;

}while(条件判断语句)

  • 先执行后判断,至少执行一次
  • 无限循环:后面不能写其它代码

for(;;){

        循环体语句;

}

while(true){

        循环体语句;

}

do{

        循环体语句;

} while(true);

  • 跳转控制语句
  • continue:跳过当前循环,继续执行下次循环
  • break:提前结束整个循环,继续执行循环下面的语句;嵌套循环中,只是跳出单层循环

2、数组

2.1 介绍

数组是一种容器,可以用来存储同种数据类型的多个值。允许存放的数据进行隐式转换,例如int(byte、short、int)

2.2 定义和初始化

格式一:        数据类型[ ] 数组名        例:String[] name;

格式二:        数据类型 数组名[ ]

初始化:在内存中为数组容器开辟空间,并将数据存入容器 => 创建后数组长度不变,且数组名相当于一个指针,记录数组的地址值

  • 静态初始化  :
  • 完整格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
  • 简化格式:数据类型[] 数组名 = {元素1,元素2,元素3...};
  • 动态初始化:初始化时指定数组长度,由系统为数组分配初始值
  • 格式:数据类型[] 数组名 = new 数据类型[数组长度]
  • 默认初始化值:(整数类型)0、(小数类型)0.0、(字符类型)'\u0000'即空格、(布尔类型)false、(引用类型)null
  • 区别:

>> 动态初始化:只明确元素个数,不明确具体数值

>> 静态初始化:需求中已经明确要操作的具体数据 

2.3 元素访问

格式:        数组名[索引]
索引(下标、角标):[0,n-1]

2.4 数组遍历

  • 数组名.length:获取数组长度
  • 循环依次访问数组中所有的元素
  • idea中快速遍历:数组名.fori

2.5 数组内存图

  • Java内存分配:运行时虚拟机占用一块空间,包括栈、堆、方法区、本地方法栈和寄存器五个区 => JDK8后取消方法区新增元空间,把方法区的多种功能进行拆分,部分功能在堆中,部分功能在元空间中。
  • 栈:方法运行时使用的内存,当某一方法运行时则进入方法栈中执行
  • 堆:存储对象或数组(用new创建
  • 方法区:存储可以运行的class文件,即运行程序前将字节码文件加载至方法区
  • 本地方法栈:JVM使用操作系统功能时使用,与程序员开发无关
  • 寄存器:供CPU使用,与程序员开发无关
  • 数组内存图:栈中存放数组地址值,堆中存放具体的数组;两个数组指向同一个空间的内存图(数组名赋值,指向同一块数据)

3、方法

3.1 定义

  • 方法(method)是程序中最小的执行单元;可以将重复的代码、具有独立功能的代码抽取到方法中;提高代码的复用性和可维护性
  • main方法:主方法,是程序运行的入口

3.2 格式

  • 形参:形式参数,是方法定义中的参数,多个形参用逗号隔开
  • 实参:实际参数,是方法调用中的参数,多个实参用逗号隔开
  • 方法:方法体(需要做什么)、形参(操作过程需要什么)、返回值(return方法结果)

3.3 重载

  • 同一个类中,定义多个同名方法,这些同名方法具有同种功能。但是每个方法具有不同的参数类型或参数个数(形参不同),这些同名方法构成重载关系。
  • “同一个类中,方法名相同,参数不同的方法,且与返回值无关”,参数不同:个数不同或类型不同或顺序不同
  • Java虚拟机通过不同的参数来区分同名方法

3.4 值传递

  • 传递基本数据类型时,传递的是真实的数据类型(将实参的纸赋给形参),在方法内改变形参不会影响实参的值
  • 如果需要更新实参的值,需要在方法中返回形参,并将返回的值赋给实参

  • 传递引用数据类型时,传递给形参的是地址值,形参指向真实的数据,形参的改变会影响实际参数的值

3.5 二维数组

  • 需求:对数据进行分组管理
  • 初始化

静态初始化

  • 格式:数据类型[][] 数组名 = new 数据类型[][]{{元素,元素},{元素,元素}};
  • 一维数组长度不固定
  • 简化格式:数据类型[][] 数组名 = {{元素,元素},{元素,元素}};
  • 可读性:

数据类型[][] 数组名 = {

                {元素,元素},

                {元素,元素}

};

动态初始化

  • 格式:数据类型[][] 数组名 = new 数据类型[m][n];
    • m:二维数组中最多可存放m个一维数组
    • n:每个一维数组最多可以存放n个元素
    • 一维数组长度固定为n,为赋值前为默认初始化值
  • 访问:数组名[索引][索引]        =>        数组名[i]:第i个一维数组的地址值
  • 遍历:先得到一维数组,在遍历得到的一维数组
  • 内存图:


4、面向对象

4.1 类和对象

  • 类:对象共同特征的描述
  • 对象:真实存在的具体实际,先设计类才能得到对象
  • 定义类

public class 类名 {

        成员变量(属性)

        成员方法(行为)

        构造器

        代码块

        内部类

}

  • 获得类的对象
类名 对象名 = new 类名()
  • 使用对象

访问属性:对象名.成员变量

访问行为:对象名.方法名(参数列表)

  • 补充
  • Javabean类:描述一类事物的类,不含main方法
  • 测试类:编写main方法的类,可以在测试类中创建Javabean类的对象并进行赋值调用
  • 一个java文件中可以定义多个class类,但是只能有一个类是public 修饰,且public修饰的类名与代码文件名一致
  • 成员变量:修饰符 数据类型 变量名 = 初始化值;
    • 类中一般不需要对成员变量指定初始化值,存在默认值,因为类是对一个群体的描述
    • 成员变量的赋值一般在具体的对象中
  • private:修饰成员(变量或方法),被private修饰的成员只能在当前类直接访问使用

4.2 封装 

  • 对象封装了数据以及对数据操作的行为,例如setXxx()、getXxx()

4.3 变量

  • 成员变量:类的内部,方法的外部;有默认初始化值;存放在堆内存中;生命周期:对象
  • 局部变量:方法的内部或参数列表中;没有默认初始化值,在使用前需要赋值;存放在栈内存中;生命周期:方法
  • 作用域:就近原则,通过this.成员变量名直接使用同名的成员变量而不是局部变量

4.4 构造方法

  • 构造器、构造函数:在创建对象时对成员变量进行赋值

格式:

修饰符 类名(参数){

                方法体;

}

  • 方法名与类名完全相同
  • 没有返回值类型(包括void等)和return关键字
  • 定义:
    • 如果没有定义构造方法,系统将给出一个默认的无参构造方法,所有成员变量的数据均采用默认值
    • 如果定义了构造方法,系统将不再提供默认的构造方法
  • 重载:多个构造方法(一般需要包含无参构造方法,成员变量为固定值)的方法名相同,但是参数不同,被称为构造方法的重载
  • 每创建一次对象,都会调用一次构造方法,并且是由虚拟机自动调用,不能手动调用

4.5 内存 

(1)一个对象的内存图

  • 加载class文件
  • 声明局部变量
  • 在堆内存中开辟一个空间
  • 对对象中的变量赋值
    • 默认初始化
    • 显示初始化
    • 构造方法初始化
  • 将堆内存中的地址值赋给局部变量(对象)

(2)两个对象的内存图

  • Javabean类的class文件只需要加载一次
  • 在堆内存中开辟的两个空间是相互独立、互不影响的

(3)两个引用指向同一个对象

(4)this关键字

  • 作用:区分局部变量和成员变量
  • 本质:所在方法调用者的地址值

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值