Java_API-常用类

内容概述

  • Object类/Scanner类
  • String类/StringBuffer类/StringBuilder类
  • 数组高级和Arrays类
  • 基本类型包装类(Integer,Character)
  • 正则表达式(Pattern,Matcher)
  • Math类/Random类/System类
  • BigInteger类/BigDecimal类
  • Date类/DateFormat类/Calendar类

一、Object类/Scanner类

Object类
/*
 * java.lang.Object:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 
 * 1.在编写代码时,只有在使用java.lang下的类时,无需导包。其它包的类都需要导包;
 * 2.java.lang包下包含了大量的常用类。我们可以直接使用,无需导包;
 * 3.关于Object类:
 * 		1).它是所有引用数据类型(包括数据)的父类;
 * 		2).所有的类(包括Java类库中的类、我们的自定义类、数组)都隐式的继承自Object;
 * 		3).Object的构造方法:
 * 				Object()
 *		4).Object的常用方法:
				public int hashCode():返回哈希码值。是一个int值。同一个对象,多次调用此方法会返回相同的hashCode;
							不同的对象,会返回不同的hashCode;内部是根据对象的地址产生的哈希值;
					//功能:用于哈希表结构的键值
					//默认实现:将此对象的地址转换为int值返回;
					//此方法建议子类重写;
				public final Class getClass():返回此 Object 的运行时类。
					//功能:获取此对象的Class对象
					//此方法不能被子类重写
				public String toString():返回该对象的字符串表示。一般子类重写:将内部的所有属性的值封装为一个String并返回;
					//功能:返回此对象的字符串表现形式;
					//默认实现:全名限定的类名 + @ + hashCode(无意义)
					//此方法建议子类重写;
				public boolean equals(Object obj):比较当前对象与参数对象是否"相等";
					//功能:将当前对象与参数对象进行比较
					//默认实现:比较地址(跟==的结果是一样的)
					//此方法建议子类重写;
				这里区别一个运算符:==
				判断运算符:==h
					1.如果两边是基本数据类型,比较的值是否相等;
					2.如果两边是"引用数据类型",比较的是"引用(地址)"是否相等;
				equals方法:
					1.只能判断引用数据类型; 
					2.在Object类中定义,任何类都会继承此方法;
					3.在Object类中默认实现:判断两个对象的地址是否相同;
					4.我们一般都会重写此方法,判断对象内部的属性值是否全部完全相同;
				protected void finalize():当垃圾回收器回收此对象的内存空间前,会自动调用此方法;
					//功能:当前对象在被垃圾回收器回收前,由垃圾回收器自动调用的方法。一般用于做些释放内存的操作;
					//默认实现:无
					//此方法根据需要由子类重写(一般我们不用)
				protected Object clone():复制当前对象的副本;
					//功能:复制此对象的副本;
					//默认实现:本地方法
					//一般子类无需重写;
 */

public class Demo {
	public static void main(String[] args) {
		Student stu = new Student();
		//1.hashCode();
		System.out.println(stu.hashCode());
		System.out.println(stu.hashCode());
		Student stu1 = new Student();
		Student stu2 = new Student();
		System.out.println(stu1.hashCode());
		System.out.println(stu2.hashCode());
		//2.getClass():
		Class c = stu.getClass();
		System.out.println(c.getName());
		System.out.println(c.getModifiers());
		System.out.println(c.getPackage().getName());
		//3.toString();
		stu.setName("张三");
		stu.setAge(20);
		stu.setSex('男');
		System.out.println("stu.toString() : " + stu.toString());
		//4.equals():
		Student stu11 = new Student("张三",20,'男');
		Student stu22 = new Student("张三",20,'男');
		//==:判断地址是否相等
		System.out.println("stu11 == stu22 : " + (stu11 == stu22));
		//判断内部的成员的值,是否完全相同;
		System.out.println("成员的值是否完全相同:" + (stu11.getName().equals(stu22.getName()) &&
												stu11.getAge() == stu22.getAge() &&
												stu11.getSex() == stu22.getSex()));
		System.out.println("stu11.equals(stu22) : " + stu11.equals(stu22));
		Student stu33 = new Student();
		stu33 = null;
		//运行垃圾回收器
		System.gc();
		//复制对象
		Student stu44 = new Student();
		stu44.setName("刘德华");
		stu44.setAge(20);
		stu44.setSex('男');
		Student stu55 = new Student();    
		stu55.setName(stu44.getName());
		stu55.setAge(stu44.getAge());
		stu55.setSex(stu44.getSex());
		Student stu66 = (Student) stu44.clone();
		System.out.println("stu44 == stu66 : " + (stu44 == stu66));//false
		System.out.println(stu66.getName() + "," + stu66.getAge() + "," + stu66.getSex());
		
	}
}
public class Student implements Cloneable{
	private String name;
	private int age;
	private char sex;
	public Student() {
		super();
	}
	public Student(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public char getSex() {
		return sex;
	}
	public void setSex(char sex) {
		this.sex = sex;
	}
	//重写父类的方法
	/*public boolean equals(Object obj){
		if(this == obj){
			return true;
		}
		if(!(obj instanceof Student)){
			return false;
		}
		Student stu = (Student)obj;
		return this.name.equals(stu.name) &&
				this.age == stu.getAge() &&
				this.sex == stu.getSex();
		
	}*/
	
	//重写父类Object的方法;
	public String toString(){
		return "Student [姓名 = " + this.name + 
							", 年龄 = " + this.age + ",性别 = " + 
							this.sex + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + sex;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (sex != other.sex)
			return false;
		return true;
	}
	
	public void finalize(){
		System.out.println("我要被垃圾回收器回收了,最后一句话:拜拜!!");
	}
	public Object clone(){
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}
}
Scanner类
/*
 * 之前我们了解了Scanner类的
 * 		1.next():读取一个字符串
 * 		2.nextInt():读取一个int值
 * 		3.nextDouble():读取一个double值
 * 之前,我们的nextInt()方法,如果用户输入了非数字,就会出现异常;
 * 在Scanner类中,有一些:hasNextXxxx()方法,这些方法可以先期判断
 * 是否能够获取一个Xxxx的值,如果可以,此方法返回true,否则返回false;
 */
public class Demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			System.out.println("请输入一个数:");
			if(sc.hasNextInt()){
				int n = sc.nextInt();
				System.out.println("你输入的数是:" + n);
				break;
			}else{
				System.out.println("你输入数字无效!");
				sc = new Scanner(System.in);
			}
		}
	}
}

二、String类/StringBuffer类/StringBuilder类

java.lang.String类
0.此类被定义为final,不能被继承;
1.一个"字符串"对象;
2.一个"引用数据类型";
3.使用方式:
	String s1 = "abc";(常用、存储的是常量池中的地址)
	或:
	String s1 = new String("abc");(存储的是堆中的地址)(在内存中创建了两个对象:1.常量池:"abc";2.堆:new String())
4.特点:其"值"的内容不能改变(地址可以改变);
	String str = "你好";
	str = "Java";//原值被丢弃,存储了新的地址;
5.常见面试题:
	String s1 = "abc";
	String s2 = "abc";
	System.out.println(s1 == s2);//true
-----------------------------------------------------------------------------------------------------
	String s1 = "Hello";
	String s2 = "World";
	String s3 = "HelloWorld";
	String s4 = "Hello" + "World";
	String s5 = s1 + s2;
	String s6 = "Hello" + s2;
	String s7 = s1 + "World";
	String s8 = new String("Hello");
	System.out.println(s3 == s4);//true
	System.out.println(s3 == s5);//false
	System.out.println(s3 == s6);//false
	System.out.println(s3 == s7);//false
	System.out.println(s1 == s8);//false;
6.构造方法:
	public String():构造一个空字符串。效果同String str = "";
	public String(byte[] bytes):使用一个byte[]数组构造一个字符串;
	public String(byte[] bytes,int offset,int length):使用byte[]数组的一部分构造一个字符串;
	public String(char[] value):使用一个字符数组构造一个字符串;
	public String(char[] value,int offset,int count):使用字符数组的一部分构造一个字符串;
	public String(String original):使用一个字符串构造一个字符串;
7.常用方法:----注意:以下方法返回String的,都是生成一个新字符串,原字符串不变;
	1).判断功能:
		boolean equals(Object obj):重写父类的方法。与参数字符串比较,如果包含一样的字符序列则返回true,否则返回false;
		boolean equalsIgnoreCase(String str):作用与equals()相同;但此方法不区分大小写;
		boolean contains(String str):判断是否包含参数字符串;
		boolean startsWith(String str):判断字符串是否以参数字符串开头;
		boolean endsWith(String str):判断字符串是否以参数字符串结尾;
		boolean isEmpty():判断字符串是否是"空字符串";
	2).获取功能:
		int length():获取此字符串内部的字符数量。(区分数组的length属性)
		char charAt(int index):获取此字符串中index位置的字符char;
		int indexOf(int ch):从左向右查找,获取字符ch在字符串中第一次出现的位置。如果不包含,则返回:false
		int indexOf(String str):获取字符串str在此字符串中第一次出现的位置。
		int indexOf(int ch,int fromIndex):从fromIndex位置开始,查找字符ch。
		int indexOf(String str,int fromIndex):从fromIndex位置开始,查找str。
		String substring(int start):从start(包含)开始,截取到此字符串的末尾;返回一个新字符串,原字符串不变;
		String substring(int start,int end):从start(包含)到end(不包含)截取字符串;返回一个新字符串,原字符串不变;
	3).转换功能:
		byte[] getBytes():将字符串转换为一个byte[]数组。
		char[] toCharArray():将字符串转换为一个char[]数组;
		static String valueOf(char[] chs):静态方法,将一个char[]数组转换为一个String
		static String valueOf(int i):静态方法,将一个int转换为一个String
		String toLowerCase():转换为小写;
		String toUpperCase():转换为大写;
		String concat(String str):将参数字符串添加到本字符串的末尾。
	4).替换功能:
		String replace(char old,char new):使用new字符替换本字符串中的所有old字符;
		String replace(String old,String new):使用new字符串替换本字符串中的所有old字符串;
	5).其它功能:
		String trim():去掉字符串两边的空格;不包括中间的。
		int compareTo(String str):重写Comparable接口的方法。按Unicode编码表的顺序与参数字符串比较;
			System.out.println("a".compareTo("b"));//-1
			System.out.println("a".compareTo("a"));//0
			System.out.println("b".compareTo("a"));//1
		int compareToIgnoreCase(String str):不区分大小写的比较;
练习_统计大串中小串出现的次数
/*
 * 统计大串中小串出现的次数
 * 举例:在字符串”woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun”中java出现了5次
 */
public class Demo {
	public static void main(String[] args) {
		String str = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
		int count = 0;//计数器
		int index = str.indexOf("java");
		while(index != -1){
			count++;
			index = str.indexOf("java",index + 1);
		}
		System.out.println("出现的次数:" + count);
	}
}
StringBuffer类/StringBuilder类
StringBuffer类:
	1.String的缓冲池类。
	2.String和StringBuffer的区别:
		1).String:其"值"不可变;
		2).StringBuffer:其"值"可变;
	  当我们多次进行字符串的拼接等操作时,使用String会产生大量的垃圾空间。建议使用此类;
	2.构造方法:
		public StringBuffer():初始容量16
		public StringBuffer(int capacity):初始容量capacity
		public StringBuffer(String str):使用String构造一个StringBuffer。
	3.添加功能:
		public StringBuffer append(String str):及各种重载的方法。将任何类型的参数添加到末尾;
		public StringBuffer insert(int offset,String str):将一个String插入到offset位置。原位置上的字符依次后移;
	4.删除功能:
		public StringBuffer deleteCharAt(int index):删除index位置上的字符
		public StringBuffer delete(int start,int end):删除start到end - 1处的所有字符;
	5.替换功能:
		public StringBuffer replace(int start,int end,String str):将start到end处的所有字符替换为str;
	6.反转功能:
		public StringBuffer reverse():反转内部字符串;
	7.截取功能:
		public String substring(int start):截取从start到结尾,返回一个新字符串;
		public String substring(int start,int end):截取从start到end -1处的所有字符;
StringBuffer类和StringBuilder类的区别:
		1.StringBuffer是线程安全的;
		2.StringBuilder是线程不安全的;
String和StringBuffer的相互转换
/*
 * String和StringBuffer的相互转换
 * String --> StringBuffer:
 * 		1.StringBuffer的构造方法:
 * 				StringBuffer buf = new StringBuffer("Hello");
 * 		2.StringBuffer的append()方法
 * 				StringBuffer buf = new StringBuffer();
 * 				buf.append("Hello");
 * StringBuffer --> String:
 * 		1.全部:StringBuffer的toString():
 * 		2.部分:StringBuffer的substring():
 */
public class Demo {
	public static void main(String[] args) {
		//1.String --> StringBuffer
		String str = "Hello";
		//--构造方法
		StringBuffer buf1 = new StringBuffer(str);
		System.out.println(buf1);
		//--append
		StringBuffer buf2 = new StringBuffer();
		buf2.append(str);
		System.out.println(buf2);
		//2.StringBuffer --> String
		//--全部:toString()
		String s1 = buf2.toString();
		System.out.println(s1);
		//--部分:substring()
		String s2 = buf2.substring(2);//llo
		System.out.println(s2);
	}
}

三、数组高级和Arrays类

冒泡排序
/*
 * 冒泡排序:
 * 将两个相邻的数字进行比较,如果第一个数比第二个数大,就交换,一直比较到最后,将把最大值移动到数组的末尾;
 * 将上述的程序再次执行,将把数组中第二大的数字移到数组的后边,依次类推,反复比较。
 */
public class Demo {
	public static void main(String[] args) {
		int[] array = {1432,432,6543,523,43,867};
		for(int i = 0;i < array.length - 1;i++){//外层循环控制循环次数;一共比较多少"轮"
			for(int j = 0; j < array.length - 1 - i ; j++){//判断每个数跟后边的数进行比较,并交换
				//判断
				if(array[j] > array[j + 1]){
					//交换
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
			}
		}
		//遍历数据,查看效果
		for(int i = 0;i < array.length ; i++){
			System.out.println(array[i]);
		}
	}
}
选择排序
/*
 * 选择排序:
 * 1.是将每个数,与它后边的每个数依次进行比较
 */
public class Demo {
	public static void main(String[] args) {
		int[] array = {21,43,24,4365,42,42,554,76,57,3,66,96};
		for(int i = 0;i < array.length - 1 ; i++){
			for(int j = i + 1 ; j < array.length ; j++){
				if(array[i] > array[j]){
					int temp = array[i];
					array[i] = array[j];
					array[j] = temp;
				}
			} 
		} 
		//遍历检查结果
		for(int i = 0;i < array.length ; i++){
			System.out.println(array[i]);
		}
	}
}
二分查找
/*
 * 二分查找:
 * 注意:对要查找的数组,一定要先排序,后查找;
 */
public class Demo {
	public static void main(String[] args) {
		int[] array = {10,20,30,40,50};
		int start = 0;
		int end = array.length - 1;
		int mid = (start + end) / 2; //第一次找的索引
		int num = 50;	//要找的数
		boolean flag = false;
		while(start <= end){
			if (  num  <  array [ mid ]  ){//往左走
				end = mid - 1;
			}else if( num > array[ mid ] ){ // 往右走
				start = mid + 1;
			}else {
				flag = true;
				break;
			}
			mid = (start + end) / 2;
		}
		if(flag){
			System.out.println("找到数字:索引为:" + mid);
		}else{
			System.out.println("数字没找到 !");
		}
	}
}
Arrays类
	1.对数组操作的类,没有构造方法,内部包含了大量静态的工具方法;
	2.常用方法:
		1).public static String toString(int[] a):将int[]数组转换为String的表示形式;
		2).public static void sort(int[] a):升序排序int[]数组;
		3).public static int binarySearch(int[] a,int key):二分查找int[]数组中的key值;

四、基本数据类型包装类(Integer,Character)

包装类
		基本数据类型	包装类型
		byte			Byte
		short			Short
		int				Integer
		long			Long
		char			Character
		float			Float
		double			Double
		boolean			Boolean
Integer类
		1.内部可以包含一个int值。还包含了其它一些对int值操作的方法;
		2.构造方法:
			1).Integer(int value):将一个int值转换为Integer;
			2).Integer(String s):将一个String转换为Integer;
		3.int和String的相互转换:
			1).String --> int:
				A.Integer-->int parseInt(String s) --> int
				B.Integer-->Integer valueOf(String s) --> intValue() --> int
			2).int --> String:
				A.String --> String valueOf(int n) --> String
				B.Integer -->String toString(int t) --> String 
		4.常用方法:
			public int intValue():返回Integer内部的int值
			public static int parseInt(String s):将String转换为int			
			public static String toString(int i):将int转换为String
			public static Integer valueOf(int i):将int转换为Integer
			public static Integer valueOf(String s):将String转换为Integer
			基本进制转换:
			public static String toBinaryString(int i):int--> 二进制 -->String
			public static String toOctalString(int i):int --> 八进制 --> String
			public static String toHexString(int i):int --> 十六进制 --> String
			十进制到其它进制:
			public static String toString(int i,int radix):将某进制的i值,转换为String表示形式。radix为:进制数
			其它进制到十进制:
			public static int parseInt(String s,int radix):将某进制的字符串表现形式s,转换为十进制int值。radix为进制数;

		5.JDK5的自动装箱和拆卸:
			1.自动装箱:将"基本数据类型"转换为对应的"包装类型";
					Integer intObj = 10;
			2.自动拆箱:将"包装类型"转换为对应的"基本数据类型";
					int n = intObj;
		6.常见面试题:
			Integer v1 = 127;
			Integer v2 = 127;
			System.out.println(v1 == v2);//true
			Integer v3 = 128;
			Integer v4 = 128;
			System.out.println(v3 == v4);//false

			Integer v5 = 127;
			Integer v6 = new Integer(127);
			System.out.println(v5 == v6);//false;
Character类
		1.char的包装类;
		2.构造方法:
			Character(char v):
		3.常用方法:
			public static boolean isUpperCase(char ch):判断是否是大写字符
			public static boolean isLowerCase(char ch):判断是否是小写字符;
			public static boolean isDigit(char ch):判断是否是数字
			public static char toUpperCase(char ch):将字符ch转换为大写;
			public static char toLowerCase(char ch):将字符ch转换为小写;

五、正则表达式(Pattern,Matcher)

Pattern类
public class Demo {
	public static void main(String[] args) {
		 Pattern p = Pattern.compile("a*b");
		 Matcher m = p.matcher("aaaaab");
		 boolean b = m.matches();
		 System.out.println("是否匹配:" + b);
		 
		 String str = "aaaaaaab";
		 String regex = "a*b";
		 System.out.println("匹配:" + str.matches(regex));
	}
}

六、Math类/Random类/System类

Math类
		1.成员属性:
			E:比任何其他值都更接近 e(即自然对数的底数)的 double 值。(该值已被定义,并且被修饰为static和final)
			PI:比任何其他值都更接近 pi(即圆的周长与直径之比)的 double 值。(该值已被定义,并且被修饰为static和final)
		2.成员方法:
			public static int abs(int a):取a的绝对值;
			public static double ceil(double a):向上取整;
			public static double floor(double a):向下取整;
			public static int max(int a,int b) :取a和b的最大值
			public static double pow(double a,double b):返回第一个参数的第二个参数次幂的值。
			public static double random():获取一个double类型的随机数。该值>=0 并且 < 1.0
			public static int round(float a):四舍五入取整(参数为double的自学)
			public static double sqrt(double a):返回正确舍入的 double 值的正平方根
Random类
		1.构造方法:
			public Random()
			public Random(long seed):由于内部算法固定,所以相同的种子能产生相同的随机数序列(即使多次运行);
		2.成员方法:
			public int nextInt():获取一个int范围内的一个随机数;
			public int nextInt(int n):获取一个n以内的正整数;
System类
		public static void gc():运行垃圾回收器;
		public static void exit(int status):结束虚拟机;
		public static long currentTimeMillis():获取从1970年1月1日到当前时间的毫秒值;
		public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length):复制数组;

七、BigInteger类/BigDecimal类

java.math.BigInteger类:用于"大整数"运算
		1.构造方法:
			public BigInteger(String val)
		2.成员方法:
			public BigInteger add(BigInteger val):加
			public BigInteger subtract(BigInteger val):减
			public BigInteger multiply(BigInteger val):乘
			public BigInteger divide(BigInteger val):除
			public BigInteger[] divideAndRemainder(BigInteger val):除法和取余
java.math.BigDecimal类:用于"浮点"运算
		* 注意:在以后的开发中,凡是涉及到浮点运算的,都不要使用"基本数据类型",
		*     而是使用BigDecimal类来运算。
		1.构造方法:
			public BigDecimal(String val):建议使用此构造方法;
		2.成员方法:
			public BigDecimal add(BigDecimal augend):加
			public BigDecimal subtract(BigDecimal subtrahend):减
			public BigDecimal multiply(BigDecimal multiplicand):乘
			public BigDecimal divide(BigDecimal divisor):除
			public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):除法,可以指定四舍五入的方式;

八、Date类/DateFormat类/Calendar类

java.util.Date类
		1.构造方法:
			public Date():使用当前系统时间构造;
			public Date(long date):使用一个毫秒值构造;
		2.成员方法:
			public long getTime():获取毫秒值;
			public void setTime(long time):设置毫秒值;
java.text.SimpleDateFormat类
		1.构造方法:
			public SimpleDateFormat():使用默认格式;
			public SimpleDateFormat(String pattern):使用pattern指定的格式;
		2.成员方法:
			public final String format(Date date):将Date转换为String;
			public Date parse(String source):将String转换为Date;
java.util.GregorianCalendar类
	java.util.Calendar(抽象类):日历类
		|--GregorianCalendar(类):
        获取GregorianCalendar对象:
        		方式一:直接实例化;
        		方式二:Calendar的getInstance()方法;
        注意:在使用Calendar.MONTH字段时尤其要注意,月份的起始值是从0开始而不是1,比如现在是4月份,得到的Calendar.MONTH字段的值是3。
		1).成员方法:
			public static Calendar getInstance():获取一个GregorianCalendar对象;
			public int get(int field):获取field字段的值;
			public void add(int field,int amount):增加field字段的值为amount;
			public final void set(int year,int month,int date):设置新的年月日信息;
练习_计算2月份的天数
/*
 * 如何获取任意年份的2月份有多少天
 * 1.构造一个日历:指定年,3,1
 * 2.将"day_Of_Month" 减 1
 * 3.获取日期;
 */
public class Demo {
	public static void main(String[] args) {
		GregorianCalendar gc = new GregorianCalendar(2000,3 - 1,1);
		gc.add(Calendar.DAY_OF_MONTH, -1);
		int day = gc.get(Calendar.DAY_OF_MONTH);
		System.out.println("2月份有:" + day + " 天");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值