迅速学java——100条小知识点快速入门

1.首先java是一种高级语言是一个面向对象的编程语言同时最重要的是它的可移植性。

2.java语言的产生及发展历史,由James Gosling领导的小组在Sun公司开发,发展主要用于开发可嵌入家电产品的软件之后java的重心转移到Internet编程到现在面向网络应用,类库不断丰富性能不断提升应用领域不断扩展。

3.java具有三大平台:J2ME(嵌入式平台)、J2SE(标准平台)、J2EE(企业级平台)。

4.java即是编译性有是解释性,它采用了基于国际标准的数据类型,java的数据类型仔任何机器上的都是一致的,不支持特定于具体硬件环境的数据类型,编译器所产生的可执行代码并不基于任何具体的硬件平台,而时基于一种抽象的机器——JVM虚拟机。

5.java语言的运行机制是源程序编译成为字节码文件解释运行成为可执行文件。

6.java平台=java应用编程接口(API)+java虚拟机(JVM),java软件开发工具箱JDK,然后JDK和JVM合起来是java平台。

7.java程序分为两类一类是应用程序Application这是一个独立程序能够在任何具有java解释器的计算机上运行,另一种是小程序Applet可以兼容的运行在java的web浏览器上。

8.java的标志符由字母,数字,下划线,美元符组成,不能以数字开头,不能与关键字保留字同名,另外java区分大小写。

9.java数据类型分为基本数据类型和引用数据类型,基本数据类型为char、byte、short、int、long、float、double、boolean,引用数据类型分为class、interface、array、null。

10.java数据类型所占位数和范围:
char占16位数范围是0~65535
byte占8位数范围是-2^7~2^7-1
short占16位数范围是-2^15~2^15-1
int占32位数范围是-2^31~2^31-1
long占64位数范围是-2^63~2^31-1
float占32位数范围是3.4e^-38~3.4e^+38
double占64位数范围是1.7e^-308~1.7e^+308

11.java的字符采用统一码Unicode,是一种16位的编码方案占两个字节同时Unicode包含AscII码,可以利用类型转换将字符转换为数值编码反之亦然。

12.布尔类型来自于布尔代数,值域包括真和假即true和false,用布尔值进行运算的运算符是比较运算符(关系运算符)和布尔运算符(逻辑运算符)。

13.数据类型转换的自动类型转换,不同的类型先转化为同一个类型转换从低级到高级,byte、short、char——>int——long>——float>——>double,当两个类型不同的运算对象进行二元运算时,java自动把精度较低的类型转换为另一个精度较高的类型,如果不进行类型转换不能将高精度类型的值赋给低精度类型的变量。

14.强制类型转换即容量大的类型转换成容量小的类型必须使用强制类型转换会导致溢出或者损失精度舍弃小数等等。

15.java的常量和变量,变量的值在程序执行的过程中可能会变常量则表示永远不会变的数据,使用final定义一个常量,必须在使用前给予说明和初始化。

16.java的循环控制结构分为顺序语句、分支语句(if-else,switch-case)、循环语句(while,do-while,for)、转移语句(break,continue)。

17.java的数组声明有两种声明方式一种是c语言风格的声明 数据类型 数组名[]而还有一种java风格的声明 数据类型[] 数组名 ,创建数组的格式 数组名=new 数据类型[数组大小],还可以声明和创建同时进行,可以使用循环初始化数组,数组具有length属性存放数组的长度。二维数组是一维数组的数组并且二维数组的每维长度可以是不同的。

18.java类与对象的概念,类的含义为了更好的分析和解决问题,人们通常将事物安照特征进行分类,属于同一个类的对象拥有相同的特征属性和行为,java中用类来描述对象的共同特征属性和行为,其中共同的特征属性表现为数据成员变量行为表现为成员方法,对于类也可以理解成为一个新的数据类型

19.类体内包含三种成员,第一种是静态数据叫成员变量,第二种是动态的方法包括成员方法和构造方法,最后一种是隶属于该类的其他的类或接口,类是分类存放函数的容器。

20.编程语言中的对象与显示时间的对象含义是相同的队形就是一个独立的事物,所以类的对象有称为类的实例。

21.类的定义 :
类声明{
成员变量的声明;
成员方法的声明和实现:
隶属于该类的其他类或接口;
}

22.java的成元变量表示类的状态和属性通过成员方法来操作。成员方法实现对类中成员变量的操作通过对象来调用。

23.对象的创建和应用,首相要进行对像的声明:类的名字 对象的名字,之后进行初始化 :对象名字 = new 类的名字()。

24.对象的引用是通过运算符.来运用对象的变量和方法。

25.java类的构造方法,构造方法的名字必须与类名相同,构造方法用于创建类的实例并对实例的成员变量进行初始化,构造方法在被new的时候调用。

26.方法的重载关键在于方法的名字相同但是参数不同,参数的个数不同或者类型不同。

27.java的this可以理解为一个代词,代表当前对象,如果方法形参与对象成员变量同名,那么可以用this区分。

28.在java中由static修饰的变量是类变量,由对象共享这个变量也可以由类来引用,同理由static修饰的方法是类方法但是只能通过类访问只能处理static属性的变量。

29.java类的继承使用extends来继承父类创建子类,子类继承父类访问权限为public、protecte变量和方法,不继承private的变量和方法所有的类都直接或者间接的继承了java.lang.Object类。

30.在类的继承过程中,会出现成员变量的隐藏即子类变量与父类变量同名则父类变量被隐藏,还会出现方法重写即子类重新定义父类已有方法。

31.java的super,this表示当前对象而super表示父类对象,可以通过它来调用父类的构造方法,并切在子类构造方法中super必须是第一条构造方法。

32.对象的赋值相容性和向上转型。

33.abstract抽象类,不能实例化即不能创建对象主要作为基类或父类存在,同时继承abstract类的子类要实现所有的abstract方法,由于抽象方法在抽象类中没有具体的方法实现,所以抽象方法必须被子类覆盖,抽象方法不能为private,不能将构造方法、类成员方法声明为抽象方法,abstract抽象方法不能和static同用,父类的非抽象方法可以被子类的抽象方法覆盖。

34.最终类不能被继承所以abstact和final不能同用。

35.interfance接口是方法定义和常量值的集合,接口是特殊的抽象类,只包含常量和方法的定义而没有方法的实现,接口声明:
interface 接口名{
//常量和方法定义
}

36.接口使用的关键字是implements在类名后使用关键字implements+接口名,在使用时注意类体中必须实现接口定义的所有方法,接口中的方法和常量必须是public的,实现时方法头要一致,父类被继承时接口同时被继承,接口也可以被继承关键字是extends,接口一般表示功能类一般表示属性。

37.java内部类就是在一个外部类的内部在定义一个类,内部类的特性可以随意使用外部类的成员变量包括私有,而不用生成外部类的对象,程序编译后会产生两个class文件,分别是Out.class和Out$In.class,必须先有外部类的对象才能生成内部类的作用就是为了访问外部类中的成员变量。
38.java内部匿名类即没有名字的内部类,使用匿名内部类还有一个前提必须继承一个父类或者实现一个接口。格式是:
new 类或者接口{
//类体
}

38.在java中所有的类都直接或者间接的继承Object类,在这个类中没有定义数据只定义了方法,这些方法意味着是所有java类中都具备的特性。

39.数组类Arrays包含用来操作数组的各种方法

40.String分为两大类字符串常量和字符串变量,它被当作对象来处理,其中的常用方法有length(返回字符串的个数),indexOf和lastIndexOf检索特定字符或字符串,查找成功返回匹配的字符位置,没有查找到返回-1。两个字符串之间可以使用+号来连接,charAt(int index )可以返回字符串中index位置上的字符,使用substring得到字符串中指定范围内的字符串,toLowerCase将字符串的所有字母都转为小写,toUpperCase将字符串中的字符转换成大写,equals和equalslgnoreCase可以判断两个字符串是否相等前者区分大小写后者不需要

41.在java中基本数据类型不作为对象使用,但许多java方法需要对象作为参数所以java提供了一个方便的方法将基本数据类型包装成为对象,这些类对应了基本数据类型有:Boolean、Character、Byte、Short、Interger、Long、Float、Double。类型转换通过实现Number类中定义的抽象方法成为longValue、intValue等方法,并覆盖了Object类中定义的toString和equals方法。其中还有静态方法valueOf该方法创建一个新对象,并将它初始化为指定字符串表示的值

42.java的Math类包含常用数学计算比如执行基本的数学运算的方法,如初等指数、对数、平方根、三角函数

43.java.util包提供了一组集合相关的类库定义及实现,称为集合API

44.Vector向量类能够用来存储数目不确定的元素,一个向量能跟据需要动态伸缩,通过addElement和insertElement来添加和插入元素,使用setElement和removeElement来修改和删除

45.java的List接口,保证元素可以按照规定的顺序排列,可包含重复的元素,对元素可进行添加和删除操作,LinkedList类允许将链表应用于堆栈、队列和双端队列,ArrayList允许快速访问元素,适用于遍历。

46.java的HashMap类,哈西表的Map接口用来存放一组无序的KeyValue例如学号和成绩,学号是key成绩是value

47.java的随机数类是Random

48.java的GUI使用框架、面板、简单用户界面GUI组件分为AWT和Swing

49.布局管理器有FlowLayout、GridLayout、BorderLayout

50.JComponent类的常见组件Button、Checkbox、CheckboxGroup,choice,Label,List、Canvas、Scrollbar等。Container类则用来表示各种GUI组件的容器,add()添加一个组件,remove()删除一个组件,setLayout()设置布局,常见Container类有Frame、Panel、Applet等

51.顶层容器:Swing顶层容器包括JFrame、JDialog、JApplet等,所有顶层类都提供获取和设置内窗格的方法,getContentPane()、setCOntentPane()

52.非顶层容器的主要目的是为了更好的管理布局和布置组件

53.框架JFrame是一个不被其他窗体所包含的独立的窗体,是容纳其他用户接口组件的基本单位,用来创建一个窗体。它的默认布局管理器是BorderLayout。给JFrame添加组件其实是添加到了JFrame的内容窗格。

54.布局管理提供了一个抽象,自动把用户界面映射到所有的窗口系统上,java的GUI组件放在容器中放置,这些组件由GUI组件由容器进行管理使用setLayout

55.FLowLayout最简单的布局管理器,按添加组件的顺序由左到右将组件排列到容器中,一行排满后在排新的一行
BorderLayout分为东西南北和中五个区域,Frame的缺省布局管理器,组件根据他们最适合的尺寸和在容器的位置来放置,南北组件可以水平扩展、东西组件能够竖直拉伸,中央组件可以水平也可以竖直扩展以填满空白空间。
GridLayout根据构造方法定义的行数和列数以网格的形式排列组件,组件添加的顺序从左到右排列

56.面板组件是非顶层容器,可以将其他的控件放在JPanel中以组织一个子界面,通过嵌套使用JPanel,面板是分组放置用户界面组件的更下的容器,通常将组件放置在框架中也可以在一个面板中在放置面板,面板的Swing版是JPanel,默认情况下JPanel使用FlowLayout,给面板添加组件是直接添加到你面板的。

57.各种用户组件:JButton、JLable、JTextField、JTextArea、JComboBox、Jlist、JCheckBox、JRadioButton、JMenuBar、JMenu、JMenuItem、JCheckBoxMenuItem、JRadioButtonMenuItem、JScrollBar、JScrollPane、JTabbedPane等
JButton组件表示一个命令按钮,一般用于完成某个特定功能
JLable标签是简单的Swing组件,用于显示一行文本、一个图标
JTextField用于显示和编辑单行文本
JPasswordField允许用户在其中输入单行密码,但输入的字符会以“*”代替
JRdioButton的默认图标是一个小圆圈被选中时圆圈内会有一个小圆点,在添加单选按钮时还应该设计ButtonGroup按钮组类,用于将多个单选按钮归于一组
JCheckBox复选框可以用来实现多项选择,一个复选框选中与否的状态变化,不会影响其他复选框,通常情况复选框由一个方框和一个标签组成

58.菜单能够简化选择,广泛用于各种视窗应用程序,一个JFrame和一个JApplet可以拥有一个JMenuBar用来存放菜单,可以看作是
存放菜单的上层组件,菜单由用户可选择菜单项组成。
菜单栏JMenuBar是窗口中,用于容纳菜单JMenu的容器,而菜单JMenu是若干个菜单项JMenuItem或子菜单的容器,能被添加到JMenuBar或其他JMenu中,菜单项JMenuItem是组成菜单或快捷菜单的最小单位,不可分解完成特定功能。

59.java的事件处理机制,事件可以定义为程序发生了某些事情的信号,事件源是在其上发生事件的GUI组件被称为事件的源对象,一个事件是事件类的实例,事件类的根类是EventObject,事件对象包含与事件有关的一切属性,可以使用EventObject类中的实例方法getSource()获得事件的源对象

60.组件事件处理,先注册监听者对象通过方法addActionLister()事件源会触发事件ActionEvent事件,调用并传递参数实现接口监听者actionPerformed()

61.JButton按钮事件单击按钮引发动作事件ActionEvent对应的监听接口是ActionListener对应的方法是actionPerformed

62.JTextField文本框事件的ActionEvent当按回车时产生,TextEvent当文本内容变化时产生,会响应文本域的ActionEvent事件

63.弹出对话框JDialog实例必须要依赖于某个窗口,消息对话框是有模式对话框,进行一个重要动作之前最好能弹出一个消息对话框
public static void showMessageDialog (Compotent parent , Object message )throws HeadlessException

64.鼠标事件MouseEvent java提供了处理鼠标事件的两个监听器接口MouseListener和MouseMotionListener,MouseListener接口监听鼠标的按下松开进入退出和点击行为,MouseMotionListener接口监听鼠标的移动和拖动行为。
当鼠标进入或离开组件的时候调用:mouseEntered()和mouseExit()
当鼠标按下或者松开时调用:mousePressed()和mouseReleased()
当按下鼠标并松开后调用:mouseClicked()
当不按按钮移动鼠标时调用:mouseMoved()
当按下按钮移动鼠标时调用:mouseDragged()

65.键盘接口是KeyListener,java在KeyEvent中为许多键定义了常量包括功能键在内分别由getKeyChar和getKeyCode方法获得前者获得键字节码后者获得键编码

67.程序运行过程中,如果出现一个不可能执行的操作就会出现运行时的错误,运行时错误会引起异常,异常是程序运行过程中出现的事件,中断正常的程序控制流,没有异常处理代码的程序可能非正常结束引起严重的问题,java给程序员提供了处理运行时错误的功能称为异常处理。

68.语法错:如果编译程序不通过,说明程序中存在语法错误,语法错误是由于违法语法规则产生的,java编译器能发现语法错误,并给出错误的位置和性质
语义错:编译通过了但程序在运行时因为出现错误而被迫终止运行,则称这种错误为异常,java解释器在运行时发现了异常,一旦发现将停止程序运行并给出异常的位置和性质,一些错误的发生不受程序本身所控制必须进行异常处理
逻辑错:程序编译通过也能正常运行,但运行结果与期望不符说明存在逻辑错误。

69.java的异常是Throwable子类的一个实例,Throwable包含在lang中它的子类在不同的包中,与图形相关的错误包含在awt中,数值异常包含在lang中。

70.java的异常处理基于三种操作,声明异常、抛出异常、补货异常。通过try-catch捕获异常,通过throws Exception声明异常,通过throw new Excception抛出异常

71.一般来说每一个方法都必须在方法头说明它可能遇到的异常类型,这一过程称为声明异常,在java中执行的语句必然属于某个方法,当一个语句引起错误时,含有这个语句的方法就会创建一个异常对象并将它传递给系统,异常对象包含有关异常的信息,包括它的类型和出错时程序的状态,这一过程称为抛出异常,一个方法抛出异常后,java运行系统开始寻找用来处理错误的代码,处理错误的代码称为异常处理器,从当前的方法开始,通过方法调用链向后搜索,查找这一代码,处理器必须抛出的异常类型相匹配,如果未发现异常处理器,程序就会终止。这个寻找异常处理器的过程称为捕获异常。

72.声明异常就是告诉编译器在执行方法的过程中可能出现的错误,在方法声明中使用关键字throws可以声明异常,在方法头中用关键字throws进行声明,但是声明了抛出异常的方法未必会真的抛出异常

73.抛出异常在声明了异常的方法中,如果出现异常,就可以抛出一个异常对象,throw new TheException,一个方法只能抛出在方法声明中声明的异常以及异常Error、RuntimeException和以上这些异常的子类

74.当调用一个显示声明异常的方法时必须使用try-catch块括住抛出异常的语句

75.若程序中有多个catch语句要注意它们的顺序,正确的做法是先捕获最特殊的异常(子类异常),之后逐渐一般化(父类异常),对一段可能抛出大量不同类型异常的程序来说逐个捕获处理异常可能会比较繁琐,而仅仅捕获它们父类的异常则会比较方便,实际使用中需要避免捕获最一般的异常使得用户往往不能确切的判断异常的具体类型,并作出相应的处理

76.有时不论异常是否出现或者是否被捕获,都希望执行某些目的的代码,java的finally子句可以用来达到这一个目的。
try{
//有异常抛出的函数调用
}
catch(捕获的异常 变量){
//异常处理
}
finally{
//无论有无异常抛出都执行这里的语句,主要用于资源的释放。
}

77.程序是一段静态的代码,而进程是程序的动态执行过程,线程是进程中单一顺序的控制流,多线程是计算机同时运行多个执行线程的能力。程序加载后进程会分为主线程和其他线程。

78.创建线程的方法一是继承Thread类,直接定义Thread类,覆写run方法在方法里定义要执行的具体操作,也可以实现Runnable接口,只定义了run接口在类定义时实现run方法。

79.Thread类的创建线程,Thread(Runnable target,String threadname )分别是线程目标对象和名称,主要方法是start():启动线程从新建状态进入就绪排队状态,run():定义线程操作需要定义run方法。步骤是继承Thread类之后覆写run方法,之后在创建用户线程实例调用start方法启动线程。

80.Runnable接口需要实现run方法将该类对象作为参数创建类Thread的对象调用start方法启动线程。

81.两种创建线程方式的比较,直接继承Thread类:该类具有Thread类声明的方法其对象本身就是线程对象,可以直接控制和操作但该方法仅适用于单继承,不适用于多继承,实习Runnable接口:该对象本身并不是线程对象,还需要与一个Thread线程对象绑定在一起,作为线程对象的目标对象来使用,适用于多重继承。

82.线程状态:
新建态(NEW):使用new创建一个线程对象后,即处于新建态,此时系统还未给他分配资源。
可运行态(RUNNABLE):处于新建态的线程调用start()方法后就可以进入克运行状态,等待被CPU调用。
阻塞态(BLOCKED)、等待态(WAITING)、定时等待(TIMD_WAITING):处于可运行态的线程因某种原因不能继续运行的状态,只当引起阻塞的原因被消除,或等待的条件满足时线程才转入可运行状态。
终止态(TERMINATED):线程正常或异常结束后即进入该状态。

83.在新建状态时通过start()进入RUNNABLE运行状态,可以通过sleep()、wait()、synchronized()、run()分别进入到等待状态、等待态、阻塞态、终止状态。

84.可以通过sleep()使线程暂时进入休眠,而setPriority()可以设置线程的优先级,MIN_PRIORITY代表最小优先级,NORM_PRIORITY代表普通优先级,MAX_PRIORITY代表最高优先级。

85.线程同步资源竞争,在多线程的环境中,可以同时做多件事情,但是如果两个或者多个线程同时使用同一个受限资源的时候就会出现资源访问的冲突,并发执行的交互线程之间存在与时间有关的错误,交互的并发线程执行时由于在不同时刻对同一个共享变量进行操作,线程之间相互影响、相互干扰,因此计算结果往往取决于这一组并发线程的相对速度,各种时间有关的错误就可能出现。

86.线程之间的竞争关系会出现两个问题:
1.死锁:一组线程如果都获得了部分资源,还想要得到其他线程所占用的资源,最终所有的线程将陷入死锁。
2.饥饿:一个线程由于其他线程总是优先于它而被无限期拖延。

87.线程互斥和临界区管理,线程互斥是解决线程间竞争关系的手段,指若干个线程要使用同一个共享资源时,任何时刻最多允许一个线程去使用,其他要使用该资源的线程必须等待,知道占有资源的线程释放该资源,临界资源则是共享变量代表的资源,临界区是并发线程中与共享变量有关的程序段。

88.操作系统对共享同一个变量的若干线程进入各自临界区的调度原则是:一次至多一个线程能够在它的临界区内,不能让一个线程无限期的留在它的临界区内,不能让一个线程无限的等待进入它的临界区,进入临界区的任意线程不能妨碍正等待进入的其他线程的进展。

89.java提供synchronized关键字用于声明一段程序为临界区,使线程对临界资源采用互斥使用方式,使用的两种方法一是使用synchronized声明一条语句为临界区,该语句称为同步语句,二是声明同步方法,同步方法的方法体是调用该方法成为临界区,互斥使用的是调用该方法的对象。

90.java的数据流:是连续单路流动数据的抽象,在java中所有的I/O都是数据流的形式进行处理的,流是一个形象的概念,当程序需要读取数据的时候,就开启一个通向数据源的流,这个数据源是可以是文件、内存或是网络连接。流采用了缓冲区技术对流进行读写操作的最小单位是字节,传输效率低下为提高传输效率可将一块内存空间设计成缓冲区暂存带传送的数据这样一次可读写若干字节,配备缓冲区的流称为缓冲流,在缓冲区写满之前若要进行数据传输,称为立即传输操作。

91.流的分类:按数据的传输方向分为输入流和输出流,按处理的单位分为字节流和字符流,按照功能的不同分为节点流和过滤流。
流的作用:从根本设计流的目的是为了使数据传输独立于相关设备,程序中需要根据待传输数据的不同时特性而使用不同的流,数据传输给指定设备后的操作由系统执行设备驱动程序完成,这样程序中不需要关注设备实现细节使得一个源程序能够用于多种输入输出设备,从而增强了程序的可重用性。

92.控制台的输入输出:交互式输入输出有两种类型,一种是从键盘进行简单的输入和以纯文本形式进行简单的输出,另一种是在图形环境中进行输入输出,前者称为是文本交互式输入输出,后者称为图形交互式输入输出。

93.文本输入输出都是使用类System,这个类包含了三个I/O对象,分别是System.in、System.out、System.err,用于从键盘输入、向屏幕输出和显示错误信息。同时java不直接支持键盘输入。

94.Scanner是SDK1.5新增的一个类,可以使用该类创建一个对象,然后对象调用方法读取用户在命令行输入的各种数据类型,这些方法都会造成堵塞等待用户进行输入。

95.字节流类每次读写8位二进制数,由于只能将数据以二进制的原始方式读写,不能分解、重组和理解这些数据,所以可以使之变换、恢复到原来有意义的状态,因此字节流又被称为二进制字节流,Inputstream和Outputstream类是抽象类,定义了字节流的基本输入输出操作,由于不能创建实例对象,故而派生出不同的子类,每个子类实现一种特殊的字节流操作。

96.字符流一次读写16位二进制数,并将其作为一个字符而不是二进制位来处理,Reader和Writer提供了基于字符的IO,基于字节的流无法正确处理基于十六位的unicode字符经常出现乱码,Reader和Writer在所有的IO操作上提供对unicode的支持。

97.文件字符输入输出流FileReader和FileWriter用于文本文件的输入输出处理,与文件字节输入输出流功能相似,但处理的基本单位是字符。

98.文件是存储在外部存储介质上的具有标识名的一组相关信息的集合,文件系统性提供按名存取实现文件的存储和检索,具有树形目录结构,文件分为二进制文件和文本文件,文件的存取方法有顺序存取、随机存取和索引存取。

99.File类主要描述系统中文件在磁盘中的存储情况,而File类的对象主要用来获取文件本身的信息,还可以利用File对象来对文件系统做一些查询和设置的动作,但不涉及对文件的读写操作,不管是文件还是目录在java中都以File的实例来表示。该类专门提供一个抽象,用于机器无关的方式进行处理大多数机器有关的、复杂的文件和路径名问题,File是文件的一个包装类。

100.文件流的创建因为必须使用文件数据流对磁盘进行读写,FileInputStream和FileOutputStream用于字节流,FileReader和FileWriter用于字符流。在FileInuputStream中实现了InputStream像read()之类的抽象方法,在FileOutuputStream中也是如此。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值