Java(十一)——面向对象的三大特征—封装、继承和多态

【小白级理解】面向对象三大特征:封装、继承、多态 文章目录前言一、面向对象的基本概念1、对象2、类二、面向对象的三大特征1、封装(1)概述(2)原则(3)总结2、继承(1)概述(2)继承的好处和弊端3、多态总结 前言 面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。   对 Java 语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计 阅读详情

1.封装

封装指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

比如Person对象的age变量,只能随着岁月的流失,age才会增加,通常不能随意修改Person对象的age。对一个类或对象实现良好的封装,可以实现以下目的:

  • 隐藏类的实现细节。

  • 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法中加入控制逻辑,限制对成员变量的不合理访问。

  • 可进行数据检查,从而有利于保证对象信息的完整性。

  • 便于修改,提高代码的可维护性。

访问控制符

Java提供了3个访问控制符:private、protected、public来实现封装。这三个访问控制符分别代表了3个访问控制级别,另外还有一个不加任何访问控制符的访问控制级别。如下表所示:

privatedefaultprotectedpublic
同一个类中√√√√
同一个包中√√√
子类中√√
全局范围内√

关于访问控制符的使用,存在如下几条基本原则:

  • 类里的绝大部分成员变量都应该使用private修饰,只有一些static修饰的、类似全局变量的成员变量,才可能考虑使用public修饰。除此之外,有些方法只用于辅助实现该类的其他方法,这些方法被称为工具方法,工具方法也应该使用private修饰。
  • 如果某个类主要用做其他类的父类,该类里包含的大部分方法可能仅希望被其子类重写,而不想被外界直接调用,则应该使用protected修饰这些方法
  • 希望暴露出来给其他类自由调用的方法应该使用public修饰。因此,类的构造器通过使用public修饰,从而允许在其他地方创建该类的实例。因为外部类通常都希望被其他类自由使用,所以大部分外部类都是用public修饰。

2.继承

继承是面向对象的三大特征之一,也是实现软件复用的重要手段。Java语言摒弃了C++中难以理解的多继承特征,Java的继承具有单继承的特点,每个子类只有一个直接父类。

Java里子类继承父类的语法格式如下:

修饰符 class SubClass extends SuperClass
{
	// 类定义部分
}
2.1 重写父类方法

举一个形象的例子:鸟类都包含了飞翔方法,其中鸵鸟是一种特殊的鸟类,因此鸵鸟应该是鸟的子类,因此它也将从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,为此,鸵鸟需要重写鸟类的方法。

下面程序先定义一个Bird类。

public class Bird
{
	// Bird类的fly()方法
	public void fly()
	{
		System.out.println("我在天空里自由自在地飞翔...");
	}
}

下面再定义一个Ostrich类,这个类扩展了Bird类,重写了Bird类的fly()方法。

public class Ostrich extends Bird
{
	// 重写Bird类的fly()方法
	public void fly()
	{
		System.out.println("我只能在地上奔跑...");
	}

	public static void main(String[] args)
	{
		// 创建Ostrich对象
		Ostrich os = new Ostrich();
		// 执行Ostrich对象那个的fly()方法,将输出"我只能在地上奔跑..."
		os.fly();
	}
}

这种子类包含与父类同名方法的现象被称为方法重写(Override),也被称为方法覆盖。

方法的重写需要遵循“两同两小一大”规则:
两同即方法名相同、形参列表相同;
两小即子类方法返回值类型比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
一大即子类方法的访问权限应比父类方法的访问权限更大或相等。

尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖的方法。可以使用super(被覆盖的是实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。

2.2继承与组合

继承是实现类复用的重要手段,但继承带来了一个最大的坏处:破坏封装。相比之下,组合也是实现类复用的重要方式,而采用组合方式来实现类复用则能提供更好的封装性。下面将详细介绍继承和组合之间的联系与区别。
2.2.1 使用继承的注意点
子类扩展父类时,可以从父类继承得到成员变量和方法,如果访问权限允许,子类可以直接访问父类的成员变量和方法,相当于子类可以直接复用父类的成员变量和方法。确实非常方便。

继承带来了高度复用的同时,也带来了一个严重的问题:**继承严重破坏了父类的封装性。**在继承关系中,子类可以直接访问父类的成员变量(内部信息)和方法,从而造成子类和父类的严重耦合。子类可以改变父类方法的实现细节(例如,通过方法重写的方式改变父类方法实现),从而导致子类可以恶意篡改父类的方法。

为保证父类有良好的封装性,不会被子类随意改变,设计父类通常应该遵循如下规则:

  • 尽量隐藏父类的内部数据。尽量把父类的所有成员变量都设置成private访问类型,不要让子类直接访问父类的成员变量。
  • 不要让子类可以随意访问、修改父类的方法。父类中那些仅为辅助其他的工具方法,应该使用private访问控制符修饰,让子类无法访问该方法;如果父类中的方法需要被外部类调用,则必须以public修饰,但又不希望子类重写该方法,可以使用final修饰符来修饰该方法;如果希望父类的某个方法被子类重写,但不希望被其他类自由访问,则可以使用protected来修饰该方法。
  • 尽量不要在父类构造器调用将要被子类重写的方法。

注意:如果父类构造器调用了被其子类重写的方法,则变成调用被子类重写后的方法。


如果想把某些类设置成最终类,即不能被当成父类,则可以使用final修饰这个类,例如JDK提供的java.lang.String类和java.lang.System类。除此之外,使用private修饰这个类的所有构造器,从而保证子类无法调用该类的构造器,也就无法继承该类。对于把所有的构造器都是用private修饰的父类而言,可另外提供一个静态方法,用于创建该类的实例。

到底何时需要从父类派生新的子类呢?不仅需要保证子类是一种特殊的父类,而且需要具备以下两个条件之一。

  • 子类需要额外增加属性,而不仅仅是属性值的改变。
  • 子类需要增加自己独有的行为方式(包括增加新的方法或重写父类的方法)。

2.2.2 利用组合实现复用
组合是把旧类对象作为新类的成员变量组合进来,用以实现新类的功能,用户看到的是新类的方法,而不能看到被组合对象的方法。因此,通常需要在新类里使用private修饰被组合的旧类对象。

到底该用继承?还是该用组合呢?
继承是对已有的类做一番改造,以此获得一个特殊的版本。简言之,就是将一个较为抽象的类改造成能使用于某些特定需求的类。比如Wolf和Animal的关系,用继承更能表达其现实意义。反之,如果两个类之间有明确的整体、部分的关系,例如Person类需要复用Arm类的方法,此时就应该采用组合关系来实现复用。
**总之,继承要表达的是一种“是(is-a)”的关系,而组合表达的是“有(has-a)”的关系。

##3.多态
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态 (Polymorphism)。

下面看一个例子:

class BaseClass
{
	public int book = 6;
	public void base()
	{
		System.out.println("父类的普通方法");
	}
	public void test()
	{
		System.out.println("父类的被覆盖的方法");
	}
}

public class SubClass extends BaseClass
{
	// 重新定义一个book实例变量隐藏父类的book实例变量
	public String book = "海底两万里";
	public void test()
	{
		System.out.println("子类的覆盖父类的方法");
	}
	public void sub()
	{
		System.out.println("子类的普通方法");
	}

	public static void main(String[] args)
	{
		//下面编译时类型和运行时类型不一样,多态发生
		BaseClass ploymophicBc = new SubClass();
		// 输出6——表明访问的是父类对象的实例变量
		System.out.println("ploymophicBc.book");
		// 下面调用将执行从父类继承到的base()方法
		ploymophicBc.base();
		// 下面调用将执行当前类的test()方法
		ploymophicBc.test();
		// 因为ploymophicBc的编译时类型是BaseClass
		// BaseClass类没有提供sub()方法,所以下面代码编译时会出现错误
		// ploymophicBc.sub();
	}
}

上面程序的main()方法中显式创建的引用变量ploymophicBc的编译时类型是BaseClass,而运行时类型是SubClass,当调用该引用变量的test()方法(BaseClass类中定义了该方法,子类SubClass覆盖了父类的该方法)时,实际执行的是SubClass类中覆盖的test()方法,这就可能出现多态了。

因为子类其实是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型(upcasting),向上转型由系统自动完成。

当把一个子类对象直接赋给父类引用变量时,例如上面的BaseClass ploymophicBc = new SubClass();这个ploymophicBc引用变量的编译时类型是BaseClass,而运行时类型是SubClass,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。

上面代码注释了ploymophicBc.sub();会在编译时引发错误。虽然ploymophicBc引用变量实际上确实包含sub()方法(例如,可以通过反射来执行该方法),但因为它的编译时类型为BaseClass,因此编译时无法调用SubClass类的sub()方法。

**注意:**引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,编写Java程序代码时,引用变量只能调用声明该变量时所用类里包含的方法。例如,通过Object p = new Person();代码定义一个变量p,则这个p只能调用Object类的方法,而不能调用Person类里定义的方法。

与方法不同的是,对象的实例变量则不具备多态性。比如上面的ploymophicBc引用变量,程序中输出它的book实例变量时,并不是输出SubClass类里定义的实例变量,而是输出BaseClass类的实例变量。

**注意:**通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。

Field _II 仿真 学习笔记 参考Field II的使用说明,进行了四个例子的练习。仿真程序和结果如下: PURPOSE1:Calculate the received response from all elements of a linear array and plot the responses and the summed response 【计算来自所有线性阵元的接收响应,并绘制该响应以及叠加响应。】 >> 阅读详情

相关推荐

大模型LLM部署方式

建议根据实际需求选择方案,企业级服务优先考虑vLLM或TGI,个人用户可尝试Ollama或Hugging Face本地加载。若需完整代码示例,可参考网页2的VLLM实战或网页5的TGI部署案例。:高并发、低延迟的API服务,需分布式推理支持。:快速创建可分享的Web应用。:个人开发、快速原型验证。

u010249118的博客 516

java、面向对象的三大特征封装、继承、多态

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 一、封装        1、什么叫封装?               (1) 封装就是包装。               (2)隐藏内部实现细节,隔离外界对内的直接操作。               (3)仅对外提供公共访问方式。               理解

qinqinnibaobaoni的专栏 774

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

本篇博客详细介绍了使用YOLOv8-pose进行姿态估计的全过程,包括不同版本模型的性能比较、训练与验证步骤,以及预测代码的实现。它对模型参数、训练过程和输出结果进行了解释,同时提供了详细的配置文件示例和标签数据格式说明。此外,还演示了如何使用预训练模型进行图像预测,并如何处理和理解预测结果。最后,它还讨论了如何评估和比较不同模型的性能。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。

CDBmax的博客 3万+

面向对象编程的三大特性在JAVA中的体现

  面向对象的三大特性有封装,继承,多态这三种。封装: 封装就是private public 一般属性是private主要是防止别的类直接访问这个属性对应的setter和getter方法是public,提供对该属性的获取和修改继承:从一个类派生出一个新的类,派生出的类称为子类(派生类),被派生的类称为父类(基类),子类继承父类的方法和属性声明方式:   public class 子类名  ex...

MLXX94的博客 538

从压电传感器到示波器:手把手教你用CA3140搭建电荷放大器(含PCB布局与调零技巧)

本文详细介绍了如何使用CA3140运算放大器搭建专业级电荷放大器,从压电传感器信号特性分析到PCB布局与调零技巧,全程实战演示。重点解析了CA3140的低通滤波器设计、反馈网络参数计算及抗干扰增强方案,帮助电子爱好者高效实现微弱电荷信号的稳定转换与测量。

weixin_31355483的博客 597

深入解析LVDS电平标准在LCD屏接口设计中的关键作用

本文深入解析了LVDS电平标准在LCD屏接口设计中的核心作用。文章不仅阐释了LVDS低电压差分信号的工作原理、关键电气参数及抗噪优势,还详细对比了VESA与JEIDA两种主流数据格式,并提供了从PCB布局布线到信号调试的实战避坑指南,是确保高速、稳定显示的关键技术参考。

weixin_28419039的博客 334

JAVA 继承基本类、抽象类、接口

Java是一个面向对象的语言,java面向对象一般有三大特征:封装、继承、多态。 封装:就是把一些属性和方法封装到一个类里。 继承:就如子类继承父类的一些属性和方法。 多态:就如一个父类有多个不同特色的子类。 这里我就不多讲解,下面我主要说明一个继承。继承是OOP(面向对象)的一个特色,java只支持单继承(如果继承两个有同样方法的父类,那么就不知道继承到那个父类的,所以java只支持单继...

weixin_34159110的博客 300

学习stm32H7之路开始(STM32H7系列1) 前期准备,HAL库框架

2020.01.07 几个重要的参考网址 1.电子工程世界网 http://tags.eeworld.com.cn/tags/STM32H7 链接: link. 2.转:https://blog.csdn.net/simon223/article/list/2?t=1 链接: link. ———————————————— 版权声明:本文为优快云博主「Simon223」的原创文章,遵循 CC 4....

kengkengkeng963的博客 3409

java面向对象三大特征:封装、继承、多态

一、面向对象三大特征:封装、继承、多态 二、封装: 1、封装两大特征:合理隐藏数据、合理暴露数据 2、把数据使用private修饰,可以通过定义一个public的方法把数据暴露出去 三、继承 1、java是单继承,但是可以间接继承,extends 2、在java中,任何类,除了Object,所有的类都有父类 3、子类可以继承父类的哪些属性和方法? 同一个包下:public、默认、p

sicilysh的专栏 587

部署资源管理系统chemx

资源管理系统的部署教程

weixin_40784215的博客 822

华为自研 ERP、Oracle EBS 与 SAP 上线时系统配置思路设计差异深度分析

本文对比分析了华为自研ERP、Oracle EBS和SAP S/4HANA三大ERP系统在上线配置思路上的核心差异。从架构设计看,华为采用分布式微服务架构,SAP采用分层服务架构,Oracle采用集中式一体化架构;在模块配置上,华为以业务场景为导向,SAP基于行业模板,Oracle强调模块独立性;数据迁移方面,华为侧重业务规则清洗,SAP注重数据质量监控,Oracle依赖标准化工具;流程适配上,华为系统随流程调整,SAP在框架内优化,Oracle需定制开发;定制开发模式差异明显,华为采用插件化扩展,SAP使

金牌架构师 1453

疯狂Java笔记-面向对象1

面向对象上 一、类和对象 1.定义类 定义类的语法格式: [修饰符] class 类名{ 零到多个构造器 零到多个成员变量 零到多个方法 } 修饰符:public、final、abstract,或者省略 类名由一到多个有意义单词连缀而成,每个单词首字母大写,其余字母小写,单词间无分隔符 类里各成员之间的定义顺序没有区别,可以相互调用,但static修饰的成员不能访问无static修饰的成员 (1)定义构造器 构造器是一种特殊的方法,如果类中没有定义构造器,系统自动提供默认构造器(默认构造器无参数),

Nujabes的博客 272

MIPI D-PHY TX 一致性测试实例解析 Part 03

本文之前,已经讨论了MIPI D-PHY TX的1.3.x和1.4.x的测试项,1.5.x的测试项相对较少,主要是用于时钟和数据通道相关的时序测量

一只豌豆象的博客 5185

面向对象的三大特征(封装、继承、多态)

封装继承和多态

yu的博客 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java面向对象三大特性(封装、继承、多态)

文章目录前言一、封装1.封装的概念2.private实现封装3.getter和setter方法4.封装的好处二、继承1.extends实现继承2.super 关键字三,多态总结 前言 OOP 语言:也就是面向对象编程。 面向对象的语言有三大特性:封装、继承、多态。三大特性是面向对象编程的核心。下面就来介绍一下面向对象的三大特性。 如果想了解面向对象可以看一下这一篇博客类和对象 一、封装 1.封装的概念 在我们写代码的时候经常会涉及两种角色: 类的实现者和类的调用者 封装的本质就是让类的调用者不必太多的.

爱敲代码的三毛的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Java】面向对象的三大特征:封装、继承、多态

本章详细解析了Java面向对象编程中的三大特性:封装、继承、多态

yican2580的博客 3412

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java面向对象三大特征(封装,继承,多态)

什么是多态?多态是在继承、实现情况下的一种现象,表现为:对象多态、行为多态。多态体现为父类引用变量可以指向子类对象。比如:Teacher和Student都是People的子类,代码可以写成下面的样子。

szm0225的博客 1903

Java面向对象 - 封装、继承和多态

简介 面向对象的三个基本特征是:封装、继承和多态。 封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类)。封装和继承的目的都是:代码重用。而多态则是为了实现另一个目的 —— 接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。 本实训主要学习面向对象三大基本特性:封装、继承和多态。 第1关:什么是封装,如何使用封装 任务描述 相关知识 什么是封装 封装的意义 编程要求 测试说明 任务描述 本关任务:构造

aiains的博客 7052

【Java SE语法篇】8.面向对象三大特征——封装、继承和多态

掌握封装、继承和多态的特征

QQ3447387928的博客 2194

java中面向对象三大特征:封装、继承、多态

java中面向对象三大特征:封装、继承、多态一、面向对象特征之一:封装和隐藏二、面向对象特征之二:继承性三、方法的重写四、面向对象特征之三:多态性 一、面向对象特征之一:封装和隐藏 1、使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。 2、信息的封装和隐藏 Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx(...

仰望与追逐的博客 1004

面向对象的三大特征——封装、继承与多态

面向对象编程(OOP)作为现代软件开发的核心方法之一,通过封装、继承和多态三大特征,显著提升了代码的可重用性、灵活性和可维护性。本文旨在深入探讨面向对象的这三大特征,分析其原理、优点,并通过具体代码示例展示其在实际开发中的应用。

yyhhh1的博客 1746

Java面向对象三大特征之继承和多态

本文将介绍面向对象三大特征的剩下两个特征——继承和多态,继承和多态是三个特征中比较重要且理解起来稍有难度的两个特征,本文将尽可能的用浅显易懂的方式从各个方面介绍清楚这两个特征。

weixin_45676761的博客 1165

JAVA面向对象的三大特征--封装、继承、多态

面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。举例来说(办证)需要几步?按照面向过程思想:第一步:找到办事的人第二步:给办事的准备资料第三步 :办完证,证件反馈给我这里我们就看出来,面向过程就是把一件事按步骤一步一步来实现代码表示依次调用这些方法就行对 Java 语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。

weixin_67224308的博客 3515

面向对象的三大特征——封装、继承、多态

Java面向对象学习笔记(第七篇) 包: 概念:物理上是文件夹,管理类 作用:1.避免类重名 2. 按照不同的功能管理类 3. 控制访问权限 命名规范:在包名中,可以使用.号来区分包的级别;包名一般情况下是小写 第一级 指该项目的类型,如com,org,gov等, 第二级 指项目所开发或者运行的公司名称,如:oracle,sun,huawei等 第三级 指项目的名称,如:bcms,oa,erp,cms等 第四级 指项目模块的名称,如:bean,action,exception等 (包可以更好的管理逻辑相

qq_45039852的博客 1万+

面向对象三大特征(封装、继承、多态)详解

面向对象的三大特征 万物皆可归类,类是对于世界事物的高度抽象,不同的事物有不同的关系:一个类自身与外界的封装关系;一个父类与子类的继承关系;一个类和多个类的多态关系。 万物皆对象,对象是具体的世界事物,面向对象的三大特征:封装、继承、多态,封装说明一个行为和属性与其他的类的关系,继承是父类和子类的关系,多态是类与类之前的关系 封装 概念 封装就是把抽象的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作,才能对数据进行操作 理解和好处 1、封装隐藏了实

qq_45976767的博客 4755

Java中面向对象三大特征(封装、继承、多态)

一个对象在不同条件下表示的不同形态就叫多态,在程序中,多态是父类引用指定子类对象。// 多态System.out.println(name + "小头爸爸");System.out.println(name + "大头儿子");father.name = "大头儿子";另一种多态的使用方式是在方法的参数上,一般我们在使用工厂设计模式时会使用多态。//@Override@Override} else {在参数列表上,使用父类去接收,也是一种多态的使用方式/

AXDRXS的博客 1422
上一篇: Java(十)——Java中方法的参数传递机制以及形参个数可变的方法
下一篇: Java(十二)——Java的类型转换
Undergoer_TW
博客等级 码龄11年 185粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值