Stage01 每日一考总结

Day01

1.JDK,JRE,JVM三者之间的关系

JDK是Java的工具包,它包含jre,jre中包含jvm

2.为什么要配置环境变量,如何配置

为了能够在任意盘符下运行Java文件;先复制JDK所在的文件地址,右键此电脑点击属性,选择高级系统设置,环境变量里面的系统变量,新建JAVA_HOME,将地址粘贴,然后点击path,新建%JAVA_HOME%/bin,点击确定

3.常用的命令行有哪些(至少写出4个)

mkdir rd del cd exit

4.请描述基于记事本编写程序的步骤

新建txt文件,后缀改成.java,编辑代码,在相应盘符下输入cmd,javac 文件名.java进行编译,然后java 文件名,回车运行

5.请描述程序的执行过程

编写—>编译成字节码文件—>通过JVM运行

6.请描述你理解的注释

对所写代码的解释说明

7.请描述你理解的标识符

在java中凡是可以自己命名的都叫标识符,有26个英文字母,下划线_,数字和$组成

在命名时,需满足标识符命名规范,数字不能开头、不能包含保留字和关键字、不能包含空格,建议15个字符以内,满足见名知意,驼峰规则

8.请描述你理解的变量

用声明的方式将数值存储下来供程序使用,并且值可以根据需求发生改变

9.请描述常用的数据类型有哪些

整型:byte(1字节) short(2字节) int(4字节) long(8字节)

浮点型:float(四字节) double(八字节)

字符类型:char(2字节)

Boolean型(1字节)

引用数据类型

10.请描述int类型做"/"运算时有哪些注意事项

当操作数都为整数类型时,结果一定为整数类型

当操作数都为整数类型时,但计算结果结果为小数,最终的结果也要取整数。

当操作数有一个是小数时,结果也要取小数。

11.请描述"%"做取余运算时有哪些注意事情

取两个数相除的余数,结果正负号与被取模(取余)正负号相同。

当操作数都为整数类型时,结果一定为整数类型

当操作数都为整数类型时,但计算结果结果为小数,最终的结果也要取整数。

当操作数有一个是小数时,结果也要取小数

12.请描述"++"的作用及前置++和后置++的区别

++表示自增1

前置++表示先自增一,然后再运算

后置++表示先运算再自增1.

13.请描述标识符的命名规则

由26个英文字母,数字0-9,下划线_,美元符号$组成

字母不能开头,不能使用关键字和保留字,但能包含关键字和保留字。

标识符不能包含空格

14.请描述数据类型存在的意义

因为数据是有明确的类型划分的,为了确保变量保留的数据其类型的唯一性,要使用数据类型进行变量的修饰。

15.请描述在使用变量时的注意事项

变量名不可重复使用,定义变量需要赋值,否则无法使用。

定义Long类型时,为防止整数过大,在末尾加L

定义float类型时,为防止类型不兼容,在后面加F

16.请描述/n、/t的作用

/n表示换行,/t表示空格

17.请描述赋值运算符+=和=的区别

+=是前面加上后面的数的和,=是把后面的值赋给前面

18.请描述三目运算符的使用场景

二选一或者多选一

19.请描述实现从键盘输入的步骤

导包、创建scanner的实例对象:Scanner scanner = new Scanner(System.in);

将输入的值赋值给变量:int a = scanner.nextInt:

20.源文件名是否必须与类名相同?如果不是,那么什么情况下,必须相同?

否,前面有public修饰时,必须相同

21.程序中若只有一个public修饰的类,且此类含main方法。那么类名与源文件名可否不一致?

否,必须一致

22.为什么要设置path(或者说,设置path的目的是什么)?

为了能够在任意文件位置运行Java文件

23.问题:System.out.println()和System.out.print()什么区别呢?

前者输出完毕后会换行。

Day02

1.请描述你理解的循环

按照一定的次数执行程序,直到达到次数上线,将重复的代码只编写一次,然后反复执行

2..请描述嵌套for循环执行的过程

初始值—>终止条件—>循环体—>更新—>终止条件—>循环体—>更新。。。

3..请描述你理解的数据类型

数据都是有明确的类型划分的,为确保变量保留的数据的类型的唯一性,要使用数据类型对变量进行修饰。

4.请描述你理解的数据类型的转换

等号两边数据类型不一致时,要进行数据类型转换,小的数据类型转化成大的数据类型会发生自动数据类型转换,大的转化成小的要进行强制数据类型转换,在数据前加(数据类型)或者在数据后面加要转化的数据类型的首字母。

5.请简述你对程序流程控制结构的理解

需求不同时就会出现多种流程控制,有顺序结构、选择结构、循环结构。

6.请简述选择结构的分类及每一种分类的使用场景

二选一时使用if else 多选一时使用if elseif elseif else,等值匹配时使用switch case

7.看图说话

e64c5e9b1a2d49b88943521231f07ebf.png

1.无输出

2.能,结果时a

8.判断

583362ad7c9a4e519dc1fba69ceaa4b5.png

bcd e

5、哪个选项和show()方法重载

class Demo{

    void show(int a,int b,float c){}

}

A.void show(int a,float c,int b){}//yes

B,void show(int a,int b,float c){}//一模一样。不可以出现在同一个类中。

C.int show(int a,float c,int b){return a;}//yes。

D.int show(int a,float c){return a;}//yes

6、方法重载(overload)必须满足__bce______

A. 在不同class中定义的方法     B.在同一类型中定义的方法

C. 方法名必须相同              D.返回类型必须相同

E. 参数一定不同                F.参数可以相同

7、写出输出结果

class Demo{

public static void main(String[] args){

int x = 1;

for(show('a'); show('b') && x<3; show('c')){

show('d');

x++;

}

}

public static boolean show(char ch){

System.out.print(ch);

return true;

}

}

//答案:

abdcbdcb

Day03

1.请简述你对面向对象的理解

找一个对象帮助我们做事情(万物皆为对象),用虚拟思想去模拟现实生活

 

2、请简述你对类和对象的理解

对象是一类事物的具体体现,对象就是类的一个具体实例,对象具备该类事物的属性和行为。

类是事物相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征来描述该类事物。

3、类由什么组成?

由类的属性和方法

4、什么是类?什么是对象?类与对象的关系是什么?

对象是一类事物的具体体现,是类的一个具体实例,具备该类的属性和方法。

类是事物相关属性和行为的集合。

类是对,对象的抽象表示,对象是类的一个实例

5请简述对象的内存分配过程

类的属性存放在栈中,方法存放在方法堆里,当创建该类的实例对象的时候,内存会在堆空间里开辟一个地址,里面存放对象的属性和方法

Day04

1.请简述你对static关键字的理解?

static表示静态的

可以修饰属性、方法、代码块、内部类以及实现静态导入

在类中声明的变量,称为属性或者叫做成员变量、或者叫做字段。那么属性面前如果加入static关键字修饰,称为静态变量,也叫做类的变量,类变量是全局变量,是共享数据。

如果属性前面没有编写static关键字,称为实例变量,也叫做对象变量

修饰方法,称为静态方法也叫做类方法

修饰代码块,称为静态代码块

静态导入,import static package.ClassName.变量名;

2.请简述静态块和非静态块的区别?

静态代码块用static修饰,静态代码块不需要我们人为的调用执行,因为没有名字。当类加载到内存时,执行静态代码块,并且只执行一次。并且在构造器执行之前

非静态代码块在创建对象时执行,在静态代码块执行之后构造方法之前执行。

3.请简述你对单例设计模式的理解?

只能创建一个对象,分为饿汉式和懒汉式分别为:

饿汉式:

public class Hungry{

    private Hungry(){

}

    private static Hungry h = new Hungry();

    public static Hungry getInstance(){

       return h;

}

}

懒汉式:

public class Lazy{

    private Lazy(){

}

    private static Lazy lazy;

    public static Lazy getInstance(){

       if(lazy == null){

private Lazy = new Lazy();
}else{

       return lazy;

}

}

}

4.请谈谈你对引用数据类型的理解

数据都是有明确的类型划分的,为了保证变量存储的数据的类型的唯一性所以要用数据类型修饰。

5.请谈谈你对参数传递过程的理解

主要分为值传递和地址传递

值传递:传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。

引用传递:传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参。

说明:对象传递(数组、类、接口)是引用传递,原始类型数据(整形、浮点型、字符型、布尔型)传递是值传递。

6、请描述你对变量分类的划分

按照数据类型划分:

b556bc4c88af468ab15f739c1de6f7b1.png

按照声明位置划分:

dea6d560f8fa43c8aef1629c9469567f.png

局部变量:在方法中声明

成员变量:在方法外面即在类中声明的变量,称为成员变量也叫做属性。

7、请简述你对封装的理解?

封装就是隐藏类的内部信息(属性和方法),不允许外部程序直接访问,而是通过公有的方法才能完成访问(赋值方法get()和取值方法set()),就是利用private关键字去修饰属性或者方法 ,被private关键字去修饰的属性或者方法只能在本类中被访问。

8、请简述你对构造方法的理解?

构造方法是一个特殊的方法,主要特殊点如下

构造方法的名字与类的名字一致

它不声明返回值类型。(与声明为void不同)

不能被static、final、synchronized、abstract、native修饰,

不能有return语句返回值

构造方法声明格式:

public 类名(参数1,参数2,参数3){

}

作用:完成对属性的赋值

9、请简述你对构造方法重载的理解?

在同一个类中至少出现2个或者2个以上的参数列表必须不同的构造方法,这里的参数列表包括参数的个数、参数类型、参数类型顺序三要素,三要素若仅有一要素不同,那么就构成方法的重载。

10、请谈谈你对this关键字的理解

在同一个类中,局部变量的名字可以和成员变量的名字是可以相同的,不报错,但是局部变量优先,也就是:就近的优先,如果非要访问成员变量,则必须使用this

"this"关键字用于引用当前对象,区分成员变量和局部变量,调用其他构造方法以及传递当前对象给其他方法。

11、请谈谈你对static关键字的理解

12、什么是局部变量和全局变量?

静态变量对于类而言在内存中只有一个,能被类的所有实例所共享。

实例变量对于类的每个实例都有一份,它们之间互不影响。

13、下列关于变量的叙述哪个是错的( c)

A、实例变量是类的成员变量

B、在方法中定义的局部变量在该方法执行时被创建

C、实例变量用关键字static声明

D、局部变量在使用前必须进行初始化

14、阅读程序给出答案

public class Test1 {

    public static void main(String[] args) {

         new A(new B());

    }

}

class A{

    public A(){

         System.out.println("A");

    }

    public A(B b){

         this();

         System.out.println("AB");

    }

}

class B{

    public B(){

         System.out.println("B");

    }

}

答案:

BAAB

 Day05

1.Java类是否可以多继承,怎么实现多继承?

不能,通过接口、内隐类,继承、实现,互相配合,达到多继承的效果 

2.写出重载与重写的区别?

重载是同名不同参,重写是建立在继承的基础上,子类对父类方法的重写

bb4fe53be93b4b6f998195c2d83c5192.png

3.读程序给出结果

class Demo{

int show(int a,int b){return 0;}

}

下面那些函数可以存在于Demo的子类中。A   

A.public int show(int a,int b){return 0;}

B.private int show(int a,int b){return 0;}

C.private int show(int a,long b){return 0;}

D.public short show(int a,int b){return 0;}

E.static int show(int a,int b){return 0;}

4.为什么要重写toString()方法?

为什么要重写toString ()方法 在Object类里面定义toString()方法的时候返回的对象的哈希code码,这个hashcode码不能简单明了的表示出对象的属性。 所以要重写toString()方法。 当需要将一个对象输出到显示器时,通常要调用他的toString ()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toString ()方法。

5.Overload的方法是否可以改变返回值的类型?

可以

6.this与super的区别

3616f0643ab94154b6d2ee7ad6ad33f7.png

7.在静态方法中是否可用this来调用本类的类方法?

不可以

8.请谈谈你对代码块的理解

代码块是一种常见的代码形式。它用大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块。分为静态代码块(用static修饰)和匿名代码块

9.请再谈谈你对变量的理解

10.请写出空指针异常的名字(英文),并描述其产生的原因

Exception in thread "main" java.lang.NullPointerException

产生原因:对象为空,但是引用这个对象的方法

11.基本数据类型和引用数据类型有什么区别?

1.基本数据类型是存储数据的简单类型,而引用数据类型是存储对象的引用或地址。

2.基本数据类型在内存中分配固定的空间,而引用数据类型在内存中分配一个地址,实际数据存储在另外的位置。

3.基本数据类型是直接存储在栈(stack)中的,而引用数据类型在栈中存储的是一个地址,这个地址指向堆(heap)中的实际数据。

4.基本数据类型有8种:byte、short、int、long、float、double、char、boolean,而引用数据类型有类(class)、接口(interface)、数组(array)、枚举(enum)等。

5.基本数据类型是直接存储值,而引用数据类型是存储指向对象的引用。

6.基本数据类型的默认值是0或false,而引用数据类型的默认值是null。

7.基本数据类型的传递是按值传递,而引用数据类型的传递是按引用传递。换句话说,基本数据类型的值在传递时是复制的,而引用数据类型的值在传递时是引用的副本。

Day06

1..请描述你对多态的理解

描述一个事物的多种形态,多态体现为父类引用变量可以指向子类对象。

前提条件:必须有子父类关系

在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法

2.类似:两个对象a和b,请问a==b和a.equals(b)有什么区别?

a==b :比较的是两个对象的地址值是否一致

a.equals(b):重写之前比较的是两个对象的的地址值相当于==;重写之后比较的是a和b各个属性的值

1.请描述你对多态的理解

描述一个事物的多种形态,多态体现为父类引用变量可以指向子类对象。

前提条件:必须有子父类关系

在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法

2.类似:两个对象a和b,请问a==b和a.equals(b)有什么区别?

a==b :比较的是两个对象的地址值是否一致

a.equals(b):重写之前比较的是两个对象的的地址值相当于==;重写之后比较的是a和b各个属性的值

3、以下代码如何优化

if(username.equals(“admin”){

  ....

}

答案圈①if(username != null && username.equals(“admin”)){

}②if(admin.equals(”username”))

 

 

 

 

 

Day07

2、请描述abstract class 和interface的区别?

4.1相同点

都不能创建对象,其实:抽象类和接口都是多态的一种形式

抽象类和接口中都可以编写抽象方法

子类或实现类都必须要重写抽象类或接口中的所有的抽象方法,否则子类或实现类就是抽象类

4.2不同点

抽象类

使用abstract关键字

抽象类中包含:普通类中包含的所有内容,也可以包含抽象方法

子类继承抽象类,并且是单继承

抽象类的出现就是为了统一标准,但是有单继承局限

接口

使用interface关键字

在JDK8.0中,接口包含:抽象方法(默认有public abstract)、公有静态常量(默认有public static final)、public static修饰的方法、public default修饰的方法

实现类实现接口,并且是多实现

接口的出现是为了统-标准,同时没有单继承局限

接口也弥补了Java单一继承的弱点,也就是类可以实现多个接口。

3、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

接口可以继承接口,实现类可以同时实现多个接口。

抽象类可以实现接口,从而提供接口方法的具体实现。

抽象类可以继承实体类,以复用实体类的功能,并且可以在抽象类中添加新的抽象方法或具体方法。

4、请描述你理解的模板方法设计模式?

模板设计模式在一个方法中定义了一个算法的基本结构,而将一些步骤的具体实现留给子类来完成。这样,子类可以在不改变算法结构的情况下,重新定义某些步骤的具体实现,以实现不同的行为。

适用场景:

多个子类有共同的行为,但其中某些步骤的实现可能不同。

有一个算法的框架,其中的某些步骤需要延迟到子类中实现。

需要复用一些代码,将算法的公共部分放在抽象类中,将可变部分留给子类实现。

注意事项:

在设计模板方法模式时,需要合理划分算法的不变部分和可变部分,确保算法的骨架在抽象类中,而具体实现留给子类。

确保子类实现的抽象方法不会改变算法的结构,否则就破坏了模板方法设计模式的原则。

Day08

1、Java能动态分配数组吗?

可以

2、我怎么知道数组的长度?

通过数组的length属性

3、数组有没有length()这个方法? String有没有length()这个方法

数组没有length()这个方法,只有length属性;String有length()方法

4.请描述冒泡排序的思想

重复地遍历待排序的元素列表,比较相邻的元素,并交换它们的位置,直到整个列表按照指定的顺序排列。

5.请描述数组的初始化方式

静态初始化:

静态初始化是在声明数组的同时进行初始化,指定数组的元素值。静态初始化使用花括号({})将元素值括起来,并用逗号(,)分隔不同的元素值。

动态初始化:

动态初始化是在声明数组时仅指定数组的长度,而不指定元素的值。后续可以使用索引来逐个为数组元素赋值。

6、请描述数组中可能会出现的异常

空指针异常(NullPointerException):

当试图访问一个空引用的数组元素时,即数组对象为null,会导致空指针异常。

数组下标越界异常(ArrayIndexOutOfBoundsException):

当试图访问数组中不存在的索引位置时,即索引超过数组的长度或小于0,会导致数组下标越界异常。

非法数组大小异常(NegativeArraySizeException): 当试图创建一个非法大小(负数)的数组时,会导致非法数组大小异常。

类型转换异常(ClassCastException):

当试图将一个不兼容的类型转换为数组的元素类型时,会导致类型转换异常。

7、请描述你理解的对象数组

可以通过创建对象数组来存储对象的引用。每个数组元素都指向一个具体的对象,这些对象可以是用户自定义的类的实例,也可以是Java内置的类(如String、Integer等)的实例。

8、请描述数组的扩容机制

数组的扩容是通过创建一个新的更大的数组,然后将原始数组中的元素复制到新数组中来实现的。

9、请描述基本类型数组元素的删除过程

找到要删除的元素位置:首先需要确定要删除的元素在数组中的位置(索引),通常通过遍历数组来查找。

移动元素:将要删除元素后面的所有元素向前移动一个位置,覆盖要删除的元素。

更新数组长度:由于基本类型数组的长度是固定的,删除元素后会产生一个空位置。因此,需要使用一个特定的值(如0对于整型数组)填充空位置,或者通过将数组的最后一个元素复制到空位置来保持数组的连续性。

10.请描述你理解的动态数组

动态数组是一种可以动态调整大小的数组数据结构。与传统的静态数组不同,动态数组可以在需要时自动扩容或缩减,以适应不同数量的元素

11、请描述你理解的数组拷算法思想

确定源数组和目标数组:首先需要确定源数组和目标数组,源数组是要被拷贝的数组,目标数组是拷贝后的结果数组。

确定拷贝范围:确定要拷贝的元素范围,通常指定源数组的起始位置(源数组的索引)和要拷贝的元素个数。

进行元素复制:通过遍历源数组的指定范围,将元素逐个复制到目标数组中相应的位置。

12、请描述你理解的数组反转算法思想

确定数组的中心位置:对于数组长度为 n,中心位置为 n/2。这里 n 是数组的长度,如果数组长度为奇数,则中心位置为中间元素,如果数组长度为偶数,则中心位置为中间两个元素的前一个元素。

使用一个循环进行交换:从数组的两端开始,依次交换首尾元素,然后逐渐向中心靠拢,直到两个指针相遇。在交换时,可以使用一个临时变量来暂存交换过程中的元素。

13、请描述你理解的数组查找算法思想

线性查找(顺序查找):从数组的第一个元素开始逐个遍历数组元素,直到找到目标元素或遍历完整个数组。这是最简单直观的查找方法,但在最坏情况下的时间复杂度为O(n),其中n是数组的长度。

二分查找(折半查找):二分查找要求数组是有序的。该算法先确定数组的中间元素,然后与目标元素进行比较。如果中间元素等于目标元素,则查找成功;如果中间元素大于目标元素,则在左半部分继续查找;如果中间元素小于目标元素,则在右半部分继续查找。通过不断缩小查找范围,二分查找可以在最坏情况下的时间复杂度为O(log n)内找到目标元素。

Day09

 

1.请描述你理解的二维数组

1.  二维数组就是用来存储一维数组的数组

2.  二维数组的存储数据类型是引用数据类型(一维数组是引用数据类型)。

3.  二维数组是有明确的行,列之分的。

2.请描述二维数组的遍历过程

通过双层嵌套for循环完成二维数组的遍历。

外层循环控制行,内层循环控制列

3.请描述快速排序算法的排序思想

(1) 从待排序的序列中挑选出一个基准元素(往往是数列中的第一个值)

(2) 将数列中所有比基准元素小的元素摆放在基准元素的左侧,所有比基准元素大的元素摆放在基准元素的右侧(相同的元素可以到任一边);

(3)按上述步骤((1)(2)),再对这左右两部分序列分别进行快速排序,直至整个序列变成有序序列。

4.请描述快速排序算法的代码实现过程

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

private static void quickSort(int[] arr, int leftIndex, int rightIndex) {//0 7

       //未在合法索引范围内进行快排,直接return结束排序

       if (leftIndex >= rightIndex) {

           return;

       }

       int left = leftIndex;//左指针-0

       int right = rightIndex;//右指针-7

 

       //待排序序列中的第一个元素作为基准元素(也就是索引为0的元素-arr[0])

       int key = arr[left];//key-基准元素

       //从左右两边交替扫描,直到left = right 进行基准元素的归位

       while (left < right) {//0 7

           //从右往左扫描,找到第一个比基准值小的元素

           while (right > left && arr[right] >= key) {

               right--;

           }

           //找到比基准元素小的元素,将该元素arr[right]放入坑中(原有索引为0的位置)arr[left]中

           arr[left] = arr[right];

           //从左往右扫描,找到第一个比基准值大的元素

           while (left < right && arr[left] <= key) {

               left++;//1

           }

           //找到这种元素将arr[left]放入arr[right]中

           arr[right] = arr[left];

       }

       //基准值归位

       arr[left] = key;

       //对基准值左边的元素进行递归排序

       quickSort(arr, leftIndex, left - 1);

       //对基准值右边的元素进行递归排序。

       quickSort(arr, right + 1, rightIndex);

   }

5.运行时异常与一般异常有何异同

二者都是Exception的父类

(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。 (2)一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。 (3)运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。

6.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

会在return执行之前执行,finally中即使改变ruturn的值,最后ruturn返回的值也不改变

7.error和exception有什么区别

Error:通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;

Exception:通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

8.请仔细阅读下列测试代码,请问如何处理才能使程序正常输出“这是个异常,不是错误”,并且不会报告任何错误或者异常信息?

public class Test{

    public static void main(String[] args) {

        int[] arr ={1,1,1,1};

        for(int i = 0 ; i < 5;i++){

           System.out.println(arr[i]);

        }

        System.out.println("这是个异常,不是错误");

    }

}

9.请描述你理解的try-catch-finally

3d99c68cab39477691a9e746da1ab916.png

4c6e2c077c504330b6ef0d3121f801ec.png

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值