Java中常见问题(一)

面向对象的特征有哪些方面 
(1).抽象: 
    抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 
(2).继承: 
    继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要. 
(3).封装: 
    封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象. 
(4).多态性: 
    多态性是指允许不同类的对象对同一消息作出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题. 

一、ArrayList和Vector的区别 
    就ArrayList与Vector主要从二方面来说. 
    1.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 
    2.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 

二、HashMap和Hashtable的区别 
    就HashMap与HashTable主要从三方面来说。 
    1.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 
    2.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 
    3.值:只有HashMap可以让你将空值作为一个表的条目的key或value 


三、char型变量能不能定义为一个中文?为什么? 
    是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的 

四、多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么? 
    多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 
    同步的实现有四种 
    wait():使一个线程处于等待状态,并且释放所持有的对象的lock. 
    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉的InterruptedException异常. 
    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级.
    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争. 

五、Java中异常处理机制,事件机制? 
    当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2种情况.一种是JAVA类库内置的语义检查.例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException.一种情况就是JAVA允许程序员扩展这种语义检查,序员可以创建自己的异常,自由选择在何时用throw关键字引发异常.有的异常都是java.lang.Thowable的子类. 

六、垃圾回收的优点和原理.考虑2种回收机制. 
    Java语言中一个显著的特点就是引入了垃圾回收机制,使得Java程序员在编写程序的时候不再需要考虑内存管理.于有个垃圾回收机制,java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域".垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存.垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收.回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收. 

七、Error与Exception有什么区别? 
    Error表示系统级的错误和程序不必处理的异常, 
    Exception表示需要捕捉或者需要程序进行处理的异常. 

八、heap和stack有什么区别? 
    栈是一种线形集合,其添加和删除元素的操作应在同一段完成.栈按照后进先出的方式进行处理. 
    堆是栈的一个组成元素 

九、谈谈final, finally, finalize的区别? 
    final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只能使用,不能重载. 
  finally:再异常处理时提供 finally 块来执行任何清除操作.如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话). 
  finalize:方法名.Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作.这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的.它是在 Object 类中定义的,因此所有的类都继承了它.子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作.finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的. 

十、GC是什么? 为什么要有GC? 

    GC是垃圾收集器.Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理.要请求垃圾收集,可以调用下面的方法之一:

    System.gc(); 
    Runtime.getRuntime().gc(); 

十一、 sleep() 和 wait() 有什么区别? 搞线程的最爱 
    sleep()方法是使线程停止一段时间的方法.在sleep 时间间隔期满后,线程不一定立即恢复执行.这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)"醒来"的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞. 
  wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到. 

十二、 Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型? 
    方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading).Overloaded的方法是可以改变返回值的类型. 

十三、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 
    Set里的元素是不能重复的,那么用iterator()方法来区分重复与否.equals()是判读两个Set是否相等. 
  equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值. 

十四、List, Set, Map是否继承自Collection接口? 
    List,Set是 
     Map不是 

十五、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 
    接口可以继承接口.抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数. 

十六、启动一个线程是用run()还是start()? 
    启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.run()方法可以产生必须退出的标志来停止一个线程. 

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

十八、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 
    是值传递.Java 编程语言只由值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用.对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的. 

十九、描述一下JVM加载class文件的原理机制? 
    JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件.它负责在运行时查找和装入类文件的类. 
    在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析 
    装载:查找和导入类或接口的二进制数据 
    链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的 
    校验:检查导入类或接口的二进制数据的正确性 
    准备:给类的静态变量分配并初始化存储空间 
    解析:将符号引用转成直接引用 
    初始化:激活类的静态变量,初始化Java代码和静态Java代码块 

二十、试举例说明一个典型的垃圾回收算法? 
    Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用. 
大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法.垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象.而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收.下面介绍几个常用的算法. 
引用计数法(Reference Counting Collector) 
引用计数法是唯一没有使用根集的垃圾回收算法,该算法使用引用计数器来区分存活对象和不再使用的对象.一般来说,堆中的每个对象对应一个引用计数器.当每一次创建一个对象并赋给一个变量时,引用计数器置为1.当对象被赋给任意变量时,引用计数器每次加1.当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件. 
基于引用计数器的垃圾收集器运行较快,不会长时间中断程序执行,适宜地必须实时运行的程序.但引用计数器增加了程序执行的开销,因为每次对象赋给新的变量,计数器加1,而每次现有对象出了作用域生,计数器减1. 



二十一、String与StringBuffer的区别 
    String的长度是不可变的,StringBuffer的长度是可变的.如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法 

二十二、int和Integer有什么区别? 
    int是java的原始数据类型,Integer是java为int提供的封装类. 
    Java为每个原始数据类型提供了封装类(以下是数据类型) 
     boolean    Boolean 
    char       Character 
    byte       Byte 
    short      Short 
    int        Integer 
    long       Long 
    float      Float 
    double     Double 


二十三、ArrayList,Vector, LinkedList的存储性能和特性 
    ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元 素移动等内存操作,所以索引数据快而插入数据慢. 
    Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差. 
    而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快 

二十四、同步和异步有何异同,在什么情况下分别使用他们? 
    如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率. 

二十五、abstract class和interface有什么区别? 
    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况.不能创建abstract 类的实例.然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例.不能有抽象构造函数或抽象静态方法.Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为.取而代之,在子类中实现该方法.知道其行为的其它类可以在类中实现这些方法.接口(interface)是抽象类的变体.在接口中,所有方法都是抽象的.多继承性可通过实现这样的接口而获得.接口中的所有方法都是抽象的,没有一个有程序体.接口只可以定义static final成员变量.接口的实现与子类相似,除了该实现类不能从接口定义中继承行为.当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法.然后,它可以在实现了该接口的类的任何对象上调用接口的方法.由于有抽象类,它允许使用接口名作为引用变量的类型.通常的动态联编将生效.引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口. 

二十六、常用的集合类都有哪些?主要方法? 
    最常用的集合类是 List 和 Map. List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表. List 适用于按数值索引访问元素的情形.Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值. 


二十七、MVC的各个部分都有那些技术来实现?如何实现? 
    MVC 是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑 
(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现.这些组件可以进行交互和重用. 

二十八、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 
    字节流,字符流.字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter. 
在java.io包中还有许多其他的流,主要是为了提高性能和使用方便. 


二十九、java中实现多态的机制是什么? 
    方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现. 
静态变量和实例变量的区别? 
    static i = 10; //常量 
    class A a; a.i =10;//可变 

三十、什么是java序列化,如何实现java序列化? 
    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题.序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流. 


三十一、应用服务器与WEB SERVER的区别? 

    应用服务器: Weblogic、Tomcat、Jboss 
    WEB SERVER: IIS、 Apache 

三十二、 WEB SERVICE名词解释.JSWDL开发包的介绍.JAXP、JAXM的解释.SOAP、UDDI,WSDL解释. 
    Web ServiceWeb Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作. 
    JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口.这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码. 
    JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API. 
    WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作.这种格式首先对操作和消息进行抽象描述,后将其绑定到具体的网络协议和消息格式上以定义端点.相关的具体端点即组合成为抽象端点(服务). 
    SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议. 
    UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准. 

三十三、说出数据连接池的工作机制是什么? 
    J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接.客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙.如果当前没有空闲 连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定.当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这 个连接. 

三十四、什么是web容器 
    给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接跟容器中的环境变量交互,不必关注其它系统问题.主要有WEB服务器来实现.例如:TOMCAT,WEBLOGIC,WEBSPHERE等.该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准.我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器. 

三十五、什么是EJB容器 
    Enterprise java bean 容器.更具有行业领域特色.他提供给运行在其中的组件EJB各种管理功能.只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理.并且可以通过现成的接口来获得系统级别的服务.例如邮件服务、事务管理 

三十六、什么是JNDI 
    (Java Naming & Directory Interface)JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能. 

三十七、什么是JMS 
    (Java Message Service)JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播. 

三十八、什么是JTA 
    (Java Transaction API)JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可. 

三十九、什么是JAF 
    (Java Action FrameWork)JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略. 
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务.例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用.当然这是要通过一定的规范才能在异构的系统之间进行通信.RMI是JAVA特有的. 


四十、简述"软件系统的两层和多层体系结构"的概念(如有必要,可用图表进行描述),并指出两者的主要区别. 
    一层程序就是我们平常太多见到的应用程序,它把表示层、业务层、数据访问层集中在一起,各自实现代码混杂在一块,逻辑混乱.不易升级,修改其中一部分就要推倒所有重新编译.这种系统在以前常见,现在也有好多. 
   二层系统就是把三个功能逻辑层稍区分开,把数据访问层从中分离出来,形成了C/S架构.但是客户端还是由表示层和业务层混在一块,问题依旧.这种客户端叫做胖客户.我个人觉得这只是一种过渡产品,就象40G硬盘和80G硬盘中间出现了60G硬盘一样.人们已经认识了一层系统的问题,但又不知如何才能改好它,就试着改了一下,挺好的,但还是不够彻底,还要改,于是三层出来了. 
    三层就是把这三个逻辑功能层各自分开,逻辑功能分得较好,可以更好地管理,重组,共享.适用于电子商务等,所以说并不是这个好就可以到处适用,有些地方是大材小用,没有必要.看什么系统用什么 

四十一、怎样访问数据库?写出步骤 
    JAVA连接数据库的方式有多种: 
根据所需要的不同数据库驱动分,分为四种: 
    1类驱动.这就是JDBC-ODBC桥的方式.但这种方式不适合程序的重用与维护,不推荐使用.需要数据库的ODBC驱动. 
    2类驱动.这就是JDBC+厂商API的形式.厂商API一般使用C编写,所以,这种方式也不长使用. 
    3类驱动.这就是JDBC+厂商Database Connection Server+DataBase的形式. 
这种方法就是在JAVA 与 DATABASE之间价起了一台专门用与数据库连接的服务器(一般由数据库厂商提供).他的好处在于能优化连接. 
    4类驱动.这就是纯JDBC+DATABASE的连接方式.也是推荐的连接方式.这使得APPLICATION与数据库分开,开发者只需关心内部逻辑的实现而不需注重数据库连接的具体实现.在这其中有两种连接的方式: 
硬编码方式.就是在程序中硬性编入数据库连接的所须参数。 
JNDI DataSource方式.就是在程序运行的外布环境中又称(Context)设置一个datasource数据源,有一个jndi 名称,程序只须查找此名称就可得到一个数据库连接的对象. 

四十二、什么是XML?为什么要使用XML? 
    XML是用来描述数据的 
    XML的标记不是在XML中预定义的,你必须定义自己的标记 
    XML使用文档类型定义(DTD)或者模式(Schema)来描述数据 
    XML使用DTD或者Schema后就是自描述的语言 
    使用XML可以使企业之间的数据交换将变得更简单,而且语音数据和动态图像数据等在过去的数据库中难以进行处理的数据也必将能够轻松转化成数据库 

四十三、解释和编译的区别 
    解释:程序运行时,取一条指令,将其换化为机器指令,再执行这条机器指令. 
    编译:程序运行时之前,将程序的把有代码编译为机器代码,再运行这个程序. 

四十四、HashMap实现什么接口,继承什么类 
    实现Map、Serializable接口,继承java.util.AbstractMap类 

四十五、LinkList和ArrayList的区别,如果是在集合的开头插入一个对象 
    使用哪种效率高些,在集合的末尾插入一个对象,使用哪种效率高些,为什么 
ArrayList随机访问的效率要比LinkList快,但是LinkList顺序访问的效率则高过ArrayList,另外LinkList在对元素进行插入和删除操作时要比ArrayList的效率高,二者的最佳选择方法是:首先选用ArrayList当发现"向元素中插入和删除操作太多时"引发性能问题时,换用LinkList,当然处理固定元素还是选用数组. 
    LinkedList基于链表实现,插入元素的性能会比ArrayList高. 
    ArrayList基于数组实现,遍历的性能高于LinkedList. 

四十六、Extends和implements的区别? 
       相同点:两者都可以实现父类,减少代码,而且面向对象特征. 
       区别: implements,实现父类,子类不可以覆盖父类的方法或者变量.即使子类定义与父类相同的变量或者函数,也会被父类取代掉.extends,可以实现父类,也可以调用父类初始化 this.parent().而且会覆盖父类定义的变量或者函数.这样的好处是:架构师定义好接口,让工程师实现就可以了.整个项目开发效率和开发成本大大降低.这两种实现的具体使用,是要看项目的实际情况,需要实现,不可以修改implements,只定义接口需要具体实现,或者可以被修改扩展性好,用extends. 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值