Java笔记 @__性感六2ki9

核心思想

  • 每个任务最少写3次
  • 写每句代码的时候想它的作用
  • 先写再想
  • 每个知识点都要用代码来证明
  • DRY原则-Don’t Repeat Yourself

JAVA基础核心

一.环境的认识和安装

1.计算机基础

  • 计算机硬件
    • 硬盘 : 永久存放数据的载体
    • 内存 : 暂时存储的载体,平衡速率差
    • CPU : 计算机核心,主要处理单元
  • 计算机软件
    • 互联网应用(B/S)-未来方向
    • 客户端应用(C/S)
  • 软件开发
    • 发现需求
      • 重复性强
      • 工作量大
    • 确定模式
      • 移动设备
      • PC客户端
      • 小程序
      • Web
    • 对应软件语言开发
    • 软件上线

2.初识JAVA

  • JAVA
    • 创始人 : 詹姆斯-高斯林
    • 发展史
graph TB
A(1995年5月,JAVA诞生)-->B(1996年推出Java1.0)
B-->C(1997年推出Java1.1)
C-->D(1998年推出Java1.2)
D-->|迷茫挫败的开始|E(2000年5月,先后发布了1.3和1.4)
E-->|第一个里程碑|F(2004年9月发布Java1.5版本)
F-->|奠定盛世|G(2005年6月发布Java1.6版本)
G-->|辉煌继续|H(2011发布Java7,2014发布Java8)
H-->|依然强大|I(2016年6月发布Java9)
    • 平台版本
      • Java ME 小型版(淘汰)
      • Java SE 标准版
      • Java EE 企业版
    • 优点
      • 简单性
      • 安全性
      • 解释性
      • 健壮性
      • 面向对象
      • 高性能
      • 多线程
      • 分布式
      • 开源
      • 跨平台(JVM)

3.代码规范

  • 书写规范
    • 每有一个大括号,内部代码要有一次缩进
    • 类名要首字母大写
    • 大小写敏感
    • 所有符号都是英文
    • 以分号结尾

4.案例编写

  • 第一个Java程序
public class HelloWorld{
    //HelloWorld 表示类名
    public static void main(String[] args){
                        // main方法是程序的主入口
        system.out.println("Hello World!");   //输出语句
        
    }
}
  • 欣知商城案例
public class XinzhiShop{
    
    public static void main(String[] args){
        system.out.println("-----欢迎来到欣知商城-----");
        system.out.println("1.购买商品");
        system.out.println("2.浏览店铺");
        system.out.println("3.查看收藏");
        system.out.println("4.联系我们");
        system.out.println("--------------------------");
    }
    
}

二.变量和数据类型

1.计算机内存

  • 内存的作用
    • 与CPU交互
    • 与硬盘交互
    • 存储信息
    • 平衡CPU处理速度和硬盘的读取速度
  • 内存的工作原理
    • 首先要进行数据分类,以提高效率
    • 在内存的物理层面利用通电和断电来实现0和1的存储
    • 为了提高效率,会采用倒进制的转换
  • Java内存
      • 主要数据存储空间
      • 动态空间,需要时申请,用完后归还
      • 像管道一样,先进先出
      • 存储Java中的标识符
      • 给放在堆里的数据做个标记
      • 像一个通,先进后出

堆栈

2.变量

  • 定义
    • 变量就是可以被改变的数据,变量其实就是内存中的一个存储空间,用来存储数据
  • 存储过程
    • 声明
      • 向堆申请一块空间,必须说明数据类型
    • 标识
      • 定义标识,通过标识去找与之相对应的空间
    • 赋值
      • 堆是使用必须要有意义,申请空间后必须赋值
    • 使用
      • 通过标识符来读取
  • 和内存的关系
    • 变量就是在内存中有位置的地址
    • 修改变量就是修改内存
    • 读取变量就是读取内存
  • 命名规范
    • 只能用英文,下划线,数字,$结尾
    • 只能用英文, _ , $开头
    • 不能用关键字命名
    • 尽量起的有意义
    • 尽量采用驼峰命名法
    • 不建议使用_$
  • 常用关键字
分类关键字
定义数据类型关键字class , interface , byte , short , int , long , float , double , char , boolean , void .
于定义数据类型值的关键字true , false , null
用于定义流程控制的关键字if , else , switch , case , default , while , do , for , break , continue , return .
定义访问权限修饰符的关键字private , protected , pubic .
定义类,函数,变量修饰符的关键字abstract , final , static, synchronized .
定义类与类之间关系的关键字extends , implements .
定义建立实例及引用实例,判断实例的关键字new , this, super , instanceof .
异常处理的关键字try , catch , finally , throw , throws .
包的关键字package , import .
其他修饰符关键字native , strictfp , transient , volatile , assert.

3.数据类型

  • 基本数据类型
类型占用空间取值范围
byte1b-128~127
short2b$-2^{15} \sim 2^{15}-1$
int4b$-2^{31} \sim 2^{31}-1$
long8b$-2^{63} \sim 2^{63}-1$
float4b-3.403E38~3.403E38
double8b-1.798E308~1.798E308
  • 基本数据类型
    • 数字
      • 整数
        • byte
        • short
        • int
        • long
      • 小数
        • float , double
    • 非数字
      • char , boolean .
  • 引用数据类型
    • 类(class)
    • 接口(interface)
    • 数组(array)
  • 数据类型的转换
    • boolean不属于数值类型,不参与转换
    • 把不同数据类型看成是不同容量的容器

4.面试题

  • 变量是如何在内存中存储的,?
    • 首先,相应类型的变量会在内存的堆中分配相应的大小,
    • 然后给堆里这个数据分配一个相应的标识符,
    • 并且把具体的数据放到相应内存空间里.
  • int a = 1;在内存中发生了什么变化,?
    • 首先,会在堆里分配一个int数据类型对应大小的空间
    • 然后,相应的栈内标识符为a
    • 把1放到a所对应的内存空间中
  • Java中的数据类型有哪些
    • 八大基本数据类型 byte short int long float double boolean char
    • 引用数据类型 接口 类 数组

5.运算符

  • 算数运算符
    • +、-、、/、%、++、–、+=、-=、=、/=、%=
    • 其中,+特殊,数字运算中是加的角色,在字符串运算中表示连接
    • /求商,%求余数
    • a++ 与 ++a区别
      • ++a会优先进行计算
      • a++会优先使用变量现在的值
    • Example
public class XGL_Variable_Demo {
	public static void main(String[] args) {
		int num1 = 10,num2 = 20;
		System.out.println(num1 + num2);   //加号第一种用法
		String name1 = "性感",name2 = "六";
		System.out.println(name1 + name2);   //加号第二种用法
		System.out.println(num2 / num1);
		System.out.println(num2 % num1);
		System.out.println(num1++);   //先输出 num1,再进行运算
		System.out.println(++num1);   //先运算,后输出 num1
		
	}
}

Console

30
性感六
2
0
10
12

  • 逻辑运算符
    • &、|、!&&||
    • & 表示左右两边的条件必须同时满足,最后结果才是true
    • | 表示只要两边其中有一方是true,那么结果就是true
    • & 与 && 的区别
      • & 不管左边结果是true还是false,都要计算右边的表达式
      • && 只要左边的表达式为false,就不再计算右边的表达式
    • | 与 || 的区别
      • | 不管左边结果是true还是false,都要计算右边的表达式
      • || 只要左边的表达式为true,就不再计算右边的表达式
    • Example
public class XGL_Variable_Demo {
	public static void main(String[] args) {
		int num1 = 10,num2 = 20;
		System.out.println(num1 == num2 && num1 < num2);
		System.out.println(num1 == num2 || num1 < num2);
	}
}

Console

false
true

  • 比较运算符
    • .>、<、>=、<=、==、!=、equals
    • 结果只有真假,true or false
    • Example
public class XGL_Variable_Demo {
	public static void main(String[] args) {
		int num1 = 10,num2 = 20;
		System.out.println(num1 > num2);
		System.out.println(num1 < num2);
		System.out.println(num1 != num2);
	}
}

Console

false
true
true

  • 赋值运算符
    • 将 = 右边的数据或者是能得到数据的表达式,赋值给左边的空间
    • Example
public class XGL_Variable_Demo {
	public static void main(String[] args) {
		int age = 21;
		String name = "性感六";
		System.out.println("我是"+name+"\n我今年"+age);
		
	}
}

Console

我是性感六
我今年21

  • 三目运算符
    • Example
public class XGL_Variable_Demo {
	public static void main(String[] args) {
		int num1 = 10,num2 = 20;
		System.out.println(num1 > num2 ? "1比2大" :"1没有2大");
	}
}

Console

1没有2大
  • 运算优先级
    • () > ! > 算数运算符 > 比较运算符 > && > || > 赋值运算符

6.需求编写

  • 需求一
    • 使用变量完成自我介绍
    • 创建姓名,年龄,爱好等变量,使用输出语句讲结果打印到控制台上
public class XGL_Variable_Test1_1 {
	public static void main(String[] args) {
		String name = "性感六";
		int age = 21;
		String hobby = "电脑 情感";
		System.out.println("我是"+name+"\n我的年龄是"+age+"\n我的爱好是"+hobby);
	}
}

Console

我是性感六
我的年龄是21
我的爱好是电脑 情感

  • 需求二
    • 使用变量完成数字运算
    • 创建两个数字类型的变量,依次测试算数运算符的使用方法
public class XGL_Variable_Test2_1 {
	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		System.out.println(a + b);
		System.out.println(a - b);
		System.out.println(a * b);
		System.out.println(a / b);
		System.out.println(a % b);
		System.out.println(a ++);
		System.out.println(++ a);
		System.out.println(a --);
		System.out.println(-- a);
		System.out.println(a += 2);
		System.out.println(a -=2);
		System.out.println(a *= 2);
		System.out.println(a /= 2);
		System.out.println(a %= 2);
	}
}

Console

3
-1
2
0
1
1
3
3
1
3
1
2
1
1

  • 需求三
    • 使用变量完成数字比较
    • 创建两个变量,测试所有的比较运算符,得到boolean结果打印在控制台
public class XGL_Variable_Test3_1 {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		String name1 = "性感六";
		String name2 = "性感六";
		System.out.println(a > b);
		System.out.println(a < b);
		System.out.println(a >= b);
		System.out.println(a <= b);
		System.out.println(a == b);
		System.out.println(a != b);
		System.out.println(name1.equals(name2));
	}
}

Console

false
true
false
true
false
true
true
  • 需求四
    • 完成比数字游戏
    • 两位玩家依次输入数字,比较大小,如果相同则平局
import java.util.Scanner;

public class XGL_Variable_Test4_2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入第一个数字");
		int num1 = in.nextInt();
		System.out.println("请输入第二个数字");
		int num2 = in.nextInt();
		System.out.println(num1 > num2?"1号玩家获胜":num1 == num2 ?"平局":"2号玩家获胜");
	}
}

Console

请输入第一个数字
5
请输入第二个数字
4
1号玩家获胜

  • 需求五
    • 实现位数相加游戏
    • 用户输入一个四位数字,将千位数字和百位相加,十位数字和个位相加得到两个新数字,打印在控制台
    • 再将两个新数字相加得到最终结果
import java.util.Scanner;

public class XGL_Variable_Test5_2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入一个四位数字");
		int num = in.nextInt();
		int sum1 = num / 1000 % 10 + num / 100 % 10;
		int sum2 = num / 10 % 10 + num / 1 % 10;
		System.out.println("千位百位相加是"+sum1+",十位个位相加是"+sum2);
		System.out.println("两个新数字相加的结果是"+(sum1+sum2));
	}
}

Console

请输入一个四位数字
1524
千位百位相加是6,十位个位相加是6
两个新数字相加的结果是12

  • 需求六
    • 实现幸运抽奖功能
    • 让用户输入一个5位数,个位和百位相加的结果,如果可以整除十位,并能被千位和万位的和整除则中奖
    • 思路
graph TB
A(确定需求)-->|Scanner| B(接收这个五位数)
B --> |var / 要取哪位 % 10| C(算出个位百位相加的结果)
C --> D(用算出来的结果除以十位)
D --> |能被整除| E(计算千位和万位的和)
D --> |不能被整除|F(没有中奖)
E --> G(千位百位的和除以个位百位的和)
G --> |能被整除|H(中奖)
G --> |不能能被整除|I(没有中奖)
import java.util.Scanner;

public class XGL_Variable_Test6_2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入一个五位数");
		int num = in.nextInt();
		int sum1 = num / 1 % 10 + num / 100 % 10;
		int sum2 = num / 1000 % 10 + num / 10000 % 10;
		System.out.println(sum1 % num / 10 % 10 == 0 && sum2 % sum1 == 0 ?"中奖了" : "没有中奖");
	}
}

Console

请输入一个五位数
44321
中奖了

三.选择结构

1.顺序结构

  • 从上到下,从左到右
graph TB
A(开始)-->B(语句A)
B-->C(语句B)
C-->D(语句C)
D-->E(结束)

2.if判断结构

  • if语法
    • 小括号中的表达式只能是boolean类型
    • 执行流程
graph TB
A{条件}-->|true|B(代码块)
B-->C(if额外的代码块)
A-->|false|C
  • if-else语法
    • 首先判断if()小括号中的表达式结果,如果是true,则执行if(){}大括号内的代码;如果是false,则执行else{}大括号内的代码
    • 执行流程
graph TB
A{条件}-->|true|B(if代码块)
B-->C(if结构外的代码)
A-->|false|D(else代码块)
D-->C
  • else-if语法
    • 首先判断if()小括号中的表达式结果,如果是true,则执行if(){}大括号内的代码;如果是false,则执行else{}大括号内的代码
    • 执行流程
graph TB
A{if条件}-->|true|B(if代码块)
B-->C(if结构外的代码)
A-->|false|D{else-if条件一}
D-->|true|E(else-if代码块1)
D-->|false|F{更多else-if}
F-->|true|G(更多else-if代码块)
F-->|false|H(else代码块)
H-->C
E-->C
G-->C

3.switch选择结构

  • switch语法
    • 表达式的取值:byte,short,int,char;JDK5以后可以是枚举;JDK7以后可以是String
    • case后面只能是常量,不能是变量,而且,多个case后面的值不能相同

4.需求

  • 需求一
  • 实现优惠券抵用活动
  • 用户获得了一张20元抵用券,现有5项商品可以使用抵用券。用户只能选择一项进行使用
  • 当用户选择后,用户付钱,并找零
import java.util.Scanner;


public class XGL_If_Demo6_3 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("-----欢迎进入欣知商城-----");
		System.out.println("主菜单 > 使用抵用券");
		System.out.println("一下商品可以使用抵用券:");
		System.out.println("1.美的微波炉---370元");
		System.out.println("2.飞利浦剃须刀---267元");
		System.out.println("3.格力空调---3225元");
		System.out.println("4.潮流卫衣---577元");
		System.out.println("5.网红课教程---139元");
		System.out.println("请输入你要购买的商品编号");
		int choose = in.nextInt();
		String name = null;
		int price = 0;
		switch (choose) {
		case 1:
			name = "美的微波炉";
			price = 370;
			break;
		case 2:
			name = "飞利浦剃须刀";
			price = 267;
			break;
		case 3:
			name = "格力空调";
			price = 3225;
			break;
			
		case 4:
			name = "潮流卫衣";
			price = 577;
			break;
			
		case 5:
			name = "网红课教程";
			price = 139;
			break;

		default:
			System.out.println("输入错误,请重新输入");
			break;
		}
		
		System.out.println("您选择购买" + name + "---" + price + "元");
		System.out.println("原价" + price + "元,抵用券减20元,现价" + (price - 20) + "元");
		System.out.println("请付款" + (price - 20) + "元");
		int payMoney = in.nextInt();
		System.out.println("找零" + (payMoney - (price - 20)));
		
		
		
	}
}


Console

-----欢迎进入欣知商城-----
主菜单 > 使用抵用券
一下商品可以使用抵用券:
1.美的微波炉---370元
2.飞利浦剃须刀---267元
3.格力空调---3225元
4.潮流卫衣---577元
5.网红课教程---139元
请输入你要购买的商品编号
1
您选择购买美的微波炉---370元
原价370元,抵用券减20元,现价350元
请付款350元
360
找零10

四.循环结构

1.for循环

  • 循环语句可以在满足循环条件的情况下,反复执行某一段代码
  • for循环里定义的变量在循环外部无法使用

2.while循环

  • while循环的使用方法

3.do-while循环

  • do-while循环的使用方法

4.三种循环的比较

  • 如果知道循环次数,优先使用for循环
  • for循环性能更高,执行完毕后,会释放该变量的存储空间
  • while循环适用于无法预知循环次数的循环

5.需求

  • 需求一
  • 在控制台依次输出数字1-100。
public class XGL_For_Demo2_2 {
	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			System.out.println(i + 1);
		}
	}
}
  • 需求二
  • 在控制台依次输出数字100以内的偶数,再显示这些偶数之和

public class XGL_For_Demo4_2 {
	public static void main(String[] args) {
		int sum = 0;
		for (int i = 0; i < 100; i+=2) {
			System.out.println(i);
			sum += i;
		}
		System.out.println(sum);
	}
}

  • 需求三
  • 现有一张足够大的纸,厚度是1cm,需要折叠多少次能超过珠穆朗玛峰的高度(8848m)
public class XGL_For_Demo5_2 {
	public static void main(String[] args) {
		int h = 1;
		for (int i = 0; h < 884800; i++) {
			h *= 2;
			System.out.println(i+1);
		}
	}
}
  • 需求四
  • 打印三角形

public class XGL_For_Demo6_2 {
	public static void main(String[] args) {
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j <= i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

Console

*
**
***
****
*****
******
  • 需求五
  • 王七蛋在工地上搬砖,每天可以挣25元。但他每周日,也就是每周七都会拿出75元当作这一周的生活费,用程序帮他计算需要工作多久才可以到欣知大数据学习

public class XGL_For_Demo9_2 {
	public static void main(String[] args) {
		int money = 0;
		for (int i = 0; money < 22800; i++) {
			money += 25;
			if (i % 7 ==0) {
				money -= 75;
			}
			System.out.println(i);
		}
	}
}

五.方法

1.定义

其实就是一个特定的功能操作,程序中完成独立功能,可重复使用的一段代码的集合

注 : - java中最小的程序单元是类

2.方法格式

注 [] 代表可写可不写 , void表示不返回任何东西 , 参数也可以不写

[修饰符] 返回值的类型 方法名称 (形式参数...){
    方法体
    如果方法需要给调用者返回一个结果,此时使用return 值;
}

3.方法中的专业术语

修饰符 : public static 等,static修饰的方法表示方法属于类,直接用类名调用即可

返回值类型 : 方法其实是在完成一个功能,该功能操作完毕之后,是否需要给调用者一个返回结果,
            如果不需要给调用者返回结果,此时使用关键字void来声明,无返回的意思.

方法的调用者 : 在哪里调用某一个方法,那么哪里就是该方法的调用者

方法名称 : 遵循标识符的规范,使用动词表示,使用驼峰命名

形式参数 : 方法圆括号中的变量,仅仅只是占位而已.

4.调用方法

  • 如果方法使用static修饰
使用方法所在类的名称.方法名(参数);   来调用
  • 如果方法没有使用static修饰
此时使用方法所在类的对象来调用

5.方法定义的位置

1. 在类中定义,在Java中最小的程序单元是类.

2. 方法定义在其他方法之外

3.方法定义的先后顺序不影响
  • 传递方式
    • 引用传递 - ref
      • 特点 节省堆空间
    • 值传递 - val

六.数组

1.定义

所谓数组,是在程序设计中,为了来方便处理,把具有相同类型的若干变量按有序的形式组织起来的一种数据形式.

这些按一定顺序排列的同类型数据的集合叫做数组.

数组中的每一个数据称之为数组元素,数组中元素以索引来表示其存放的位置,从0开始,步长是1

2.格式

数组元素的类型 [] 数组名;   int[] ages;

数组必须先初始化,才能使用,因为初始化表示在内存中分配空间.

3.初始化

静态初始化
    
    特点 : 有我们自己来为每一个数组元素设置初始化值,而数组的长度由系统决定
    
    语法 : 数组元素类型[] 数组名 = new 数组元素类型[]{元素1,元素2,元素3,......};
    
    举例 : int[] nums = new int[]{1,3,5,4,9};
    
    简单写法 : int[] nums = {1,3,5,5,54,5};   //必须声明之后立刻初始化
    
    int[] nums = new int[]{1,2,3,4,5};
    
    nums = new int[]{2,4,6};
    
    system.out.println("nums.length");   //3
    
动态初始化

    特点 : 由我们来设置数组的元素个数(数组长度),而每一个数组元素由系统决定
    
    语法 : 数组元素类型[] 数组名 = new 数组元素类型[length];
    
    举例 : int ages = new int[100];

无论哪种方式,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化,数组是定长的

欣知商城一期

graph TB
A(头部展示)-->|switch|B(选择区域)
B-->|1|C(日用品)
B-->|2|D(食品)
B-->|3|E(调味品)
B-->|4|F(查看购物车)
B-->|5|G(付款)
B-->|6|H(放弃购买)
C-->|选择商品|I(香皂10,洗发水20,洗脸盆30)
I-->|输入数量|J(成功加入购物车)
J-->|1|B
J-->|2|Q(返回当前选择商品页面)
J-->|0|G
G-->|大于商品总价|K(付款成功并找零)
G-->|小于商品总价|L(提示还需支付多少钱)
D-->|选择商品|M(大米10,面20,肉30)
E-->|选择商品|N(十三香15,老干妈11,花椒面3)
F-->|未购买时|O(提示用户购买商品后查看)
F-->|购物车有东西|P(罗列清单)
M-->|输入数量|J
N-->|输入数量|J
public void menu(){
    system.out.println();
    int choose = in.nextInt();
    doChoose(choose);
}
public void doChoose(int choose){
    String[] dailyNecessities = {"香皂","洗发水","洗脸盆"};
    int[] dailyPrice = {10,20,30};
    switch(){
        case 1 :
            addShop(dailyNecessities[] dailyPrice[]);
    }
}
public void addShop(String[] shop,int[] price){
    
}

七.面向对象

1.软件的生命周期

  • 软件的产生直到报废的整个过程
  • 软件生命周期的内容
    • 问题的定义及规则
    • 需求分析
      • 软件开发与与需求方共同讨论,主要确定软件开发目标和可行性.
    • 软件设计
    • 程序编码
    • 软件测试
    • 运行维护

对象和类的关系

  • 对象
    • 对象是人们要进行研究的任何事物,一切事物都可以认为是对象
    • 对象具有的状态 : 姓名, 年龄 , 身高
    • 对象具有的行为 : 吃饭 , 睡觉, 写代码
    • 具有相同特性(状态)和行为(功能)的对象的抽象就是类
    • 对象的抽象是类,类的具体化就是对象
    • 类实际上就是一种数据类型
    • 类具有特性,对象的状态,用成员变量来描述,封装数据
    • 类具有功能,对象的行为,用方法来描述
    类的定义
    
[修饰符] class 类名{
.
    成员变量;
    
    方法
}/

注* 1.如果类使用public修饰,必须保证当前文件名和类名相同
    2.类名使用名词来表示,首字母大写,多个单词组成,使用驼峰表示法

对象的创建和调用方法

1.根据类来创建对象的语法
类名 变量 = new 类名();

2.给字段设置值
对象变量.字段名 = 该类型的值;

3.获取该字段的值
该字段类型 变量 = 对象变量.字段值

4.通过对象调用方法
对象变量.方法(实参);

比较对象

==
    对于基本数据类型,比较的是值,
    对于引用数据类型,比较的是在内存中的地址值
    每次使用new关键字,都表示在堆中开辟一块内存空间,不同的内存空间,地址值不同

对象的生命周期

对象什么时候出生 : 每次使用new关键字的时候,

END

微信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值