黑马程序员 API概述

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、String类:

 1.String 类代表字符串。Java 程序中的所有字符串字面值(如"abc" )都作为此类的实例实现。

 2.字符串是常量;它们的值在创建之后不能更改。

 3.String 对象是不可变的,所以可以共享。

 一.String类的构造器:

1).public String():默认构造器,没有任何参数

2).参数为字节数组:

String(byte[]bytes);

           String(byte[] bytes,int startIndex,intlength)

3).参数为字符数组:

String(char[]value);

        String(char[] value,intstartIndex,int length)

4).String(String str):

1.判断定义为String类型的s1和s2是否相等

       String s1 = "abc";

       String s2 = "abc";

       System.out.println(s1 == s2);                

       System.out.println(s1.equals(s2)); 

2.下面这句话在内存中创建了几个对象?

       String s1 = new String("abc");        

    3.判断定义为String类型的s1和s2是否相等

       String s1 = new String("abc");        

       String s2 = "abc";

       System.out.println(s1 == s2); ?       

       System.out.println(s1.equals(s2)); ?  

    4.判断定义为String类型的s1和s2是否相等

       String s1 = "a" + "b"+ "c";

       String s2 = "abc";

       System.out.println(s1 == s2); ?       

       System.out.println(s1.equals(s2)); ?  

    5.判断定义为String类型的s1和s2是否相等

       String s1 = "ab";

       String s2 = "abc";

       String s3 = s1 + "c";

       System.out.println(s3 == s2); ?                                          

       System.out.println(s3.equals(s2)); ?   

二、String类的常用方法

    1,判断

1.1boolean equals(Object);    //判断传入的字符串是否与调用的字符串字符序列是否 相同,相同就返回true否则false

       1.2 boolean equalsIgnoreCase(string);  //判断传入的字符串是否与调用的字符串字 符序列是否相同,不区分大小写,相同就返回true否则false

       1.3 boolean contains(string);          //判断传入的字符串是否被调用的字符串包含

       1.4 boolean startsWith(string);        //判断调用的字符串是否以传入的字符串开头

       1.5 boolean endsWith(string);          //判断调用的字符串是否以传入的字符串结尾

       1.6 boolean isEmpty();                 //判断字符串是否为空

 

    2,获取

       2.1 int length();                  //获取字符串的长度

       2.2 char charAt(index);                //通过索引获取对应的字符

       2.3 int indexOf(int ch);           //通过传入int数或者是字符找对应索引

           int idnexOf(int ch,fromIndex);     //在指定fromIndex的位置查找传入的字符

       2.4 int indexOf(string str);           //通过传入字符串查找字符串所对应的索引

           int idnexOf(string str,fromIndex); //通过指定fromIndex的位置查找传入的字符串

       2.5 int lastIndexOf(ch);           //通过传入的字符从后向前找字符的索引值,把从后向前第 一次找到的索引值返回

           int lastIndexOf(ch,fromIndex):     //通过指定fromIndex的位置,从后向前查找字符, 把从后向前第一次找到的索引值返回

       2.6 int lastIndexOf(string);           //通过传入的字符串,从后向前查找,将第一次找到字 符串中第一个字符的索引返回

           int lastIndexOf(string,fromIndex): //通过指定fromIndex的位置,从后向前查找对应 字符串,将第一次找到字符串中第一个字符的索引返回

       2.7 String substring(start);      //通过传入的索引值开始向后截取,截取的是索引到length

           String substring(start,end);    //通过传入的两个索引值截取,有开始有结尾,包含头 不包含尾

      

    3,转换

       3.1 byte[] getBytes();   //编码,让计算机看的懂的,用默认的编码表,将字符串转换成字节数组

           byte[] getBytes(String)            //用指定的编码表进行编码

       3.2 char[] toCharArray();            //将字符串转换成字符数组

       3.3 static String copyValueOf(char[]); //将字符数组转换成字符串

           static String copyValueOf(char[] data, int offset, int count);//将字符数组转换字符串, 通过offset开始,截取count个

       3.4 static String valueOf(char[]);       //将字符数组转换成字符串

           static String valueOf(char[] data, int offset, int count);//将字符数组转换字符 串,通过offset开始,截取count个

       3.5 static String valueOf(int);        //将一个int数转换成字符串

           static String valueOf(double);

           static String valueOf(boolean);

              ...

          

       3.6 static String valueOf(object);    

           和object.toString():结果是一样的。

       3.7 String toLowerCase():              //将字符串全部转换为小写

           String toUpperCase():              //将字符串全班转换为大写

       3.8"abc".concat("kk");                //将两个字符串相连接,产生新的字符串

          

    4,替换。

       4.1 String replace(oldChar,newChar);   //将newChar替换OldChar,如果OldChar不存在,原字符 串直接赋值给替换后字符串

       4.2 String replace(string,string);    

      

    5,切割。

       String[] split(regex);              //通过regex切割字符串,切割后会产生一个字符串数组

       String s = "金三胖 郭美美 李天一";

       String[] arr = s.split(" ");

      

    6,去除字符串两空格。

       String trim();                        

      

    7,比较

       String str = "ab";

       String str1 = "bc";

       int num = str.compareTo(str1);         //如果str比str1大的话,返回的正数

byte[] arr = {97,98,99};

       String str = new String(byte[])        //解码,让我们看的懂的,通过默认的编码表,将字节数 组转换成字符串

       String(byte[], String)                 //解码,通过指定的编码表,将字节数组转换成字符串


String(byte[],int offset, int length, String)//解码,截取字节数组,offset是开始索引, length是截取的长度


三、Scanner

1.创建对象

       使用构造函数Scanner(InputStream)传入一个输入流, 该Scanner就可以读取数据了System.in

    2.读取各种类型的数据

       nextInt() 可以读取一个int

       nextLine() 读取一行字符串

    3.关闭问题

       使用结束后要调用close()方法释放资源


public class Test1 {

	public static void main(String[] args) {
		String str1 = new String();
		
		System.out.println("String str1 = new String():");
		System.out.println("str1 == null : " + (str1 == null));//str1是空引用么?		//false
		System.out.println("str1.length():" + str1.length());//str1中存储的字符串的长度?	//0
		System.out.println("str1.equals(\"\"):" + str1.equals(""));//str1中是空字符串么?//true
		System.out.println("---------------------");
		/*
		 * 参数为字节数组:
			String(byte[] bytes);
			String(byte[] bytes,int startIndex,int length)
		 */
		byte[] bArray = {97,98,99,100};
		String str2 = new String(bArray);//使用byte数组构造一个String,如果byte数组都是整数,对应0-127就是ASCII码表的值
		System.out.println("str2 = " + str2);
		String str3 = new String(bArray,1,3);//用bArray来构造,从bArray的索引1开始,取2个
	//	String str3 = new String(bArray,1,4);// java.lang.StringIndexOutOfBoundsException:(运行时异常)
		System.out.println("str3 = " + str3);
		/*
		 * 参数为字符数组:
	 		String(char[] value);
			String(char[] value,int startIndex,int length)
		 */
		char[] cArray = {'[','a','b',',','c','d',']'};
		
		String str4 = new String(cArray);
		System.out.println("str4 = " + str4);
		
		String str5 = new String(cArray,1,5);
		System.out.println("str5 = " + str5);
		/*
		 * 用一个字符串构造一个字符串:
		 * String(String str):
		 */
		String str6 = new String("abc");
		System.out.println("str6 = " + str6);
		
	}

}

public class Test {

	public static void main(String[] args) {
		//在下面的过程中,产生了几个String对象空间
		//这个过程中,先后产生了三个对象空间:"hello","world","helloworld"
		//这个过程中,更改是str1的引用,
		String str1 = "hello";
		str1 = str1 + "world";
		System.out.println(str1);
		System.out.println("---------------------");
		//字符串的字面量
		String str2 = "ab";//先在常量池中找有没有"ab",如果没有,建立空间,返回引用;
		String str3 = "ab";//先在常量池中找有没有"ab",如果有,直接返回"ab"的引用;
		System.out.println(str2 == str3);//判断两个引用是否相等:true
		System.out.println(str2.equals(str3));//判断里面存储的字符串是否相同:true
		
		System.out.println("---------------------");
		String str4 = "a";
		String str5 = "b";
		String str6 = "ab";
		String str7 = str4 + str5;//"ab"//运算符的操作数有一个是变量,结果就是一个新字符串;
		     //str7 = "a" + str5;//运算符的操作数有一个是变量,结果就是一个新字符串;
		     //str7 = str4 + "b";//运算符的操作数有一个是变量,结果就是一个新字符串;
		String str8 = "a" + "b";//运算符的操作数都是字符串常量,这个结果可以确定,会先在常量池中找
		System.out.println("str6 == str7 : " + (str6 == str7));//false
		System.out.println("str6 == str8 : " + (str6 == str8));//true
		System.out.println("---------------------");
		//字符串的new 操作符
		String str9 = new String("ab");
		String str10 = new String("ab");
		System.out.println("str9 == str10 : " +  str9 == str10);//肯定不等false
		System.out.println("str9.equals(str10) : " + str9.equals(str10));//肯定是true
		
		String str11 = "ab";
		System.out.println("str9 == str11 : " + str9 == str11);//false
		
	}

}


  模拟登录,给三次机会,并提示还有几次


 

public class Test {

	public static void main(String[] args) {
		//假设用户已有的登录名和密码:admin 和 admin
		String loginName = "admin";
		String loginPwd = "admin";
		
		Scanner sc = new Scanner(System.in);
		
		int maxCount = 3;//最多3次机会
		while(maxCount > 0){
			System.out.print("请输入登录名:");
			String uName = sc.next();
			System.out.print("请输入登录密码:");
			String uPwd = sc.next();
			if(uName.equals(loginName) &&
					uPwd.equals(loginPwd)){//区分大小写判断
				System.out.println("登录成功!");
				break;
			}else{
				maxCount--;
				if(maxCount == 0){
					System.out.println("对不起,三次登录失败!账户锁定两个小时!");
					break;
				}
				System.out.println("用户名或密码错误,您还有 " + maxCount + " 次机会!");
			}
			
		}
	}

}

四、StringBuffer的常用方法

    1,添加

       1.1 StringBuffer append(int x);               //在缓冲区的末尾追加        

       1.2 StringBuffer insert(int index,Stringstr);   //在指定索引位置添加

 

    2,删除

       2.1 StringBuffer delete(int start, intend);  //包含头索引,不包含尾部索引

       2.2 StringBuffer delete(0,sb.length);         //清空缓冲区

       sb = new StringBuffer();

       sb.append("aaaaa");

       sb = new StringBuffer();

       2.3 StringBuffer deleteCharAt(int index);     //根据指定的索引删除索引对应的元素             

       

    3,修改

       3.1 StringBuffer  replace(int start,int end,string);//用String替换,包含头不包含尾

        3.2 void setCharAt(int index ,char);          //修改,把指定索引位置的值改成传入的char值      

        3.3 StringBuffer reverse();                   //将缓冲区的元素反转            

        3.4 void setLength(int len);                  //根据传入的len值截取缓冲区的长度

        3.5 toString()                                //转换成String                 

       

    4,查找

        4.1 int indexOf(str);                         //查找str在缓冲区第一次出现的位置

       4.2 int lastIndexOf(str);                     //从后向前查找查找str在缓冲区第一次出现的位置

   

StringBuilder和StringBuffer

    1.StringBuilder和StringBuffer与String的区别

    StringBuilder和StringBuffeer是可变字符序列

    String是不变得,一但被初始化,就不能改变

      

    2.StringBuilder和StringBuffer的区别

    StringBuilder是线程不安全的,所以效率比较高,1.5版本出现

    StringBuffer是线程安全的,效率相对较低,1.0版本出现的


StringBuffer:

String append():向当前的StringBuffer的字符末尾追加任何类型数据,有各种重载的方法。如果当前容量不够,将增加新容量为之前容量的2倍+2

public StringBuffer insert(int offset,Stringstr):将字符串插入此字符序列中。

public StringBuffer delete(int start,intend):移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符,如 果不存在这种字符,则一直到序列尾部。如果 start 等于 end,则不发生任何更改。

       1.如果end的值超出"字符长度",不抛异常,截止到字符串末尾;

        2.start不能超出"字符长度",否则:运行时抛出:java.lang.StringIndexOutOfBoundsException

       3.如果start大于end,运行时抛出:java.lang.StringIndexOutOfBoundsException

  public StringBuffer deleteCharAt(int index):移除此序列指定位置的 char。此序列将缩短一个 char

        (1)index一定要小于"字符长度length()",否则运行时异常:java.lang.StringIndexOutOfBoundsException

  public StringBuffer replace(int start,intend,String str):

  使用给定 String 中的字符替换此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符,如果不存在这种字符,则一 直到序列尾部。先将子字符串中的字符移除,然后将指定的 String 插入 start

  public String substring(int start):

  返回一个新的 String,它包含此字符序列当前所包含的字符子序列。该子字符串始于指定索引处的字符,一直到此字符串末尾。

         1.start<=length()(字符长度);

  public String substring(int start,int end):

      (1)包含start,不包含end

       (2)start > end :java.lang.StringIndexOutOfBoundsException

      (3)start=end :空字符

        (4)如果start或 end >= length():java.lang.StringIndexOutOfBoundsException:

public StringBuffer reverse():将此字符序列用其反转形式取代

public class Test {
	public static void main(String[] args) {
		StringBuffer buf1 = new StringBuffer();
		buf1.append("hello");
		System.out.println("容量:" + buf1.capacity());
		System.out.println("长度:" + buf1.length());
		buf1.append(true);
		System.out.println("容量:" + buf1.capacity());
		System.out.println("长度:" + buf1.length());
		buf1.append(3.14159);
		System.out.println("容量:" + buf1.capacity());
		System.out.println("长度:" + buf1.length());
		buf1.append("121212121212121212122222");
		System.out.println("--容量:" + buf1.capacity());//如果之前容量不够,将增加原长度的2倍 + 2
		System.out.println("--长度:" + buf1.length());
		buf1.append("1");
		System.out.println("容量:" + buf1.capacity());//如果之前容量不够,将增加原长度的2倍 + 2
		System.out.println("长度:" + buf1.length());
		
		System.out.println("----insert()----");
		StringBuffer buf2 = new StringBuffer("Hello");
		System.out.println(buf2.insert(5, "xxx"));//offset后移,将字符串插入:Hxxxello
	//	System.out.println(buf2.indexOf(6,"xxx"));//java.lang.StringIndexOutOfBoundsException(运行时)offset值一定<=字符长度
		System.out.println("----delete()----");
		StringBuffer buf3 = new StringBuffer("HelloWorld");
		System.out.println(buf3.delete(1, 2));//World
		
		System.out.println("----deleteCharAt()----");
		StringBuffer buf4 = new StringBuffer("HelloWorld");
		System.out.println(buf4.deleteCharAt(9));//
		
		System.out.println("----replace()----");
		StringBuffer buf5 = new StringBuffer("HelloWorld");
		System.out.println(buf5.replace(2, 5, "XXXX"));
		
		System.out.println("----substring()----");
		StringBuffer buf6 = new StringBuffer("HelloWorld");
		System.out.println(buf6.substring(10));
		System.out.println(buf6);
		
		System.out.println("--" + buf6.substring(7,8));
		
		System.out.println("----reverse()----");
		StringBuffer buf7 = new StringBuffer("你好中国");
		System.out.println(buf7.reverse());
		
	}

}

五、包装类

    1.什么是包装类

       8种基本数据类型都会对应一个包装类

       int是Integer, char是Character, 其他都是首字母大写double Double short Short boolean Boolean

    2.什么时候使用

       集合的泛型中只能写包装类型

       后面的课程中会学到集合, 集合是只能装对象的, 而基本数据类型不是对象不能直接装入

       在JDK5之前, 如果想把基本数据类型装入集合, 必须人工的进行包装(转为包装类对象)

       JDK5之后, 基本数据类型和包装类之间可以自动的互相转换了

        Integeri = 10;

public class Test {

	public static void main(String[] args) {
		Integer intObj = 20;//相当于:Integer intObj = new Integer(20);//自动装箱
		int intValue = new Integer(20);//自动拆箱
		
		int sum = intObj + intValue;
		System.out.println("sum = " + sum);
	}

}


 

六、Arrays工具类

    sort()

    binarySearch()

七、BigInteger

    1.创建对象

       可以使用BigInteger(String)来创建一个很大的整数, 精度可以无限大, 值创建之后不会被改变(类似String)

    2.常用方法

       BigInteger add(BigInteger val)         //加

       BigInteger subtract(BigInteger val)    //减

       BigInteger multiply(BigInteger val)    //乘

       BigInteger divide(BigInteger val)      //除

       BigInteger mod(BigInteger m )          //模

       BigInteger max(BigInteger val)         //两个数的最大值

       BigInteger min(BigInteger val)         //两个数的最小值

 

八、BigDecimal

    1.创建对象

       BigDecimal(double);                    //不建议用,运算结果不精确

        BigDecimal(String);                    //可以,但是每次都要传字符串给构造函数

       static BigDecimal valueOf(double)      //可以,而且可以直接传double数

       因为double数是不精确,是无限接近那个数,用BigDemal这个类可以让其精确

    2.常用方法

       BigDecimal add(BigDecimal augend)

       BigDecimal subtract(BigDecimalsubtrahend)

       BigDecimal multiply(BigDecimalmultiplicand)

       BigDecimal divide(BigDecimal divisor)

九、时间类

    1.Date

       比较古老的一个类, 大多数方法已过时, 但通常我们还会用它来获取当前时间

       new Date()可以创建日期对象, 然后使用SimpleDateFormat可以将其格式化成我们需要的格式

       通常使用的格式为: "yyyy-MM-dd HH:mm:ss", 具体格式说明详见SimpleDateFormat类yyyy年MM月dd日 E HH:mm:ss

       a.获取当前时间的毫秒值

       Date d = new Date();

       d.getTime();                       //获取的是1970年1月1日0时0分0秒到当前时间的毫秒值

       System.currentTimeMillis();

       b.将毫秒值转换成时间对象

       Date d = new Date(毫秒值)                 //通过毫秒值获取时间对象

       Date d = new Date();               //创建时间对象

       d.setTime(毫秒值);                     //根据毫秒值修改时间对象

    2.Calendar

       很多方法都是替代了Date类的方法, 最常用的就是

       int get(int field)(Calendar.YEAR)      //通过传入的字段获取对应的值,(获取年对应的值)

       void add(int field, int amount)        //field代表传入的时间字段可以是年月日等,amount代表是数值,正数就是在传入的字段上加,负数减

       void set(int field, int value)         //field代表传入的时间字段可以是年月日等,value代表设置的值,想设置哪一年或月日等,就写哪个值

       void set(int year, int month, int date)

       可以对指定的字段获取, 设置, 以及增减

十、Math

       提供了一些和数学运算相关的方法,

       static double PI                //获取π(派)的值

       static double floor(double a)   //是小于等于a这个double值的最大整数对应的double值

       static double ceil(double a)    //是大于等于a这个double值的最小整数对应的double值

       static long round(double a )    //四舍五入,返回是一个long值

       static double sqrt(double a)    //开平方

       static double pow(double a, double b) //a是底数,b是指数返回的是a的b次幂


十一、正则表达式

    1.什么是正则表达式

       是一种字符串的约束格式, 例如在某些网站上填写邮箱的时候, 如果乱写会提示输入不合法, 这种验证就是使用正则表达式做的.

    2.匹配

       String里的matches() 验证一个字符串是否匹配指定的正则表达式"18612345678".matches("1[34578]\\d{9}");

    3.分割

       String里的split() 用指定正则表达式能匹配的字符作为分隔符, 分割字符串

    4.替换

       String里的replaceAll("","") 把字符串中能匹配正则表达式的部分替换为另一个字符串

    5.查找

       Pattern.compile() 创建正则表达式对象

       Pattern.matcher() 用正则表达式匹配一个字符串, 得到匹配器

       Matcher.find() 查找字符串中是否包含能匹配正则表达式的部分

       Matcher.group() 获取匹配的部分



       

public class Test {

	public static void main(String[] args) {
		String str = "hid";
		/*********正则表达式-字符类************/
		//字符串中是否以h开头,以d结尾,而且中间只有一个字符,而且是元音字母a、e、i、o、u?
		String regex = "h[aeiou]d";
		System.out.println(str.matches(regex));
		//字符串中是否以h开头,以d结尾,而且中间只有一个小写英文字母?
		regex = "h[a-z]d";
		System.out.println(str.matches(regex));
		//字符串是否以大写英文字母开头,后跟id?
		String s = "A";
		regex = "[A-Z]id";//"[" + s + "-Z]id"
		System.out.println(str.matches(regex));
		//字符串首字母是否非数字?
		regex = "[^0-9]id";
		System.out.println(str.matches(regex));
		/********正则表达式-逻辑运算符**********/
		//判断小写辅音字母:
		String s1 = "ba";
		regex = "[a-z&&[^aeiou]]a";
		//判断首字母为h 或 H ,后跟一个元音字母,并以 d 结尾
		regex = "[hH][aeiou]d";
		
		/*******正则表达式-预定义字符类********/
		regex = "[0-9][0-9][0-9]";//使用字符类的方式
		regex = "\\d\\d\\d";//使用预定义字符类的方式:\\d 相当于[0-9]
		s1 = "23";
		System.out.println(s1.matches(regex));
		
		//2.判断字符串是否以h开头,中间是任何字符,并以d结尾:"h.d"
		regex = "h[.]d";//只匹配:h.d
		regex = "h.d";//匹配:h[任何字符]d
		s1 = "h中d";
		System.out.println(s1.matches(regex));
		//3.判断字符串是否是”had.”:
		regex = "had\\.";//可以
		regex = "had[.]";//也可以
		s1 = "hadd";
		System.out.println(s1.matches(regex));
		//4.判断手机号码(1开头,第二位是:3,4,5,7,8,后跟9位数字):
		regex = "1[34578][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]";
		regex = "1[34578]\\d\\d\\d\\d\\d\\d\\d\\d\\d";
		
		s1 = "19513865765";
		System.out.println(s1.matches(regex));
		
		/******使用限定符***********/
		regex = "1[34578]\\d{9}";//相当于:1[34578][0-9]{9}
		
		//1.判断1位或多位数字
		regex = "\\d+";
		s1 = "1";
		System.out.println(s1.matches(regex));
		//2.判断小数(小数点最多1次):
		regex = "\\d+\\.?\\d+";
		s1 = "3.1415";
		System.out.println(s1.matches(regex));
		//3.判断数字(可出现或不出现小数部分):
		regex = "\\d+(\\.?\\d+)?";
		s1 = "22.";
		System.out.println(s1.matches(regex));
		//4.满足:"22."的格式
		regex = "\\d+(\\.?\\d*)?";
		s1 = "22.";
		System.out.println(s1.matches(regex));
		//5.满足:+20,-3,22.格式:
		regex = "[+-]?\\d+(\\.?\\d*)?";
		s1 = "+-22.3";
		System.out.println(s1.matches(regex));
	}

}

十二、Object类

位置:java.lang.Object

它是所有类的超类(包括数组,自定义类)

一些方法:

public String toString();

public boolean equals(Object obj);

protected void finalize():用于垃圾回收;

public final Class<?> getClass();

public int hashCode();

toString()方法用于打印对象信息:

Student stu = new Student();

System.out.println(stu);

public class Student{
    String name;
    int age;
    @Override
    public String toString(){
        return “Student [name=“ + name +    
                                “,age=“ + age + “]”);	
public static void main(){
   Student stu = new Student();
   System.out.println(stu);
} 

十三、System类

System类提供的设施中,有标准输入、标准输出和错误输出流;

对外部定义的属性和环境变量的访问;加载文件和库的方法;

还有快速复制数组的一部分的实用方法。

System类要掌握的功能 


exit(int state)

       currentTimeMillis();

       getPropertie(Stringkey);

            arraycopy ()     



 






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值