面向对象的特征
1、特征一:封装与隐藏
① 问题引入:当创建一个类的对象时,可以通过“ 对象.属性 ”的方式,给对象的属性进行赋值。此时的赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。
但是,在实际问题中,还往往需要给属性赋值添加额外的限制条件。那么这个条件就不能在属性声明时体现,只能通过方法进行限制条件的添加。
比如,为了避免再次直接使用“对象.属性”的方式来调用该属性,需要先将这个属性进行私有化(private),再创造这个属性对应的Set和Get方法来供其他类的对象使用。其实这就是面向对象封装特征的具体体现。那么对于这个类之外的其他类的对象来说,这个属性就相当于是隐藏的。
② 封装性如何体现?(注意:这只是封装性的体现之一,其他体现还有:不对外暴露的是私有方法、单例模式等)
答:将类的属性私有化(private),然后通过公共的(public)方法来获取(get)和设置(set)该属性。
“高内聚,低耦合”:类的内部数据操作细节自己完成,不允许外部干涉。仅对外暴露少量的方法用于使用。
面向对象的封装思想:隐藏对象内部的复杂性,只对外公布简单的接口,便于外界使用。从而提高系统的可扩展性、可维护性。换言之,把该隐藏的隐藏,该暴露的暴露,这就是封装性的设计思想。
③ 封装性的体现,需要权限修饰符来配合:
Java的四种权限修饰符(从小到大):private、缺省(default)、protected、public
说明:以上权限修饰符可以修饰 类 和 类的结构(属性、方法、构造器、内部类)
2、特征二:继承性的理解
(1)优点:
① 减少了代码的冗余,提高了代码的复用性;
② 便于功能的扩展;
③ 为之后的多态性提供了前提。
(2)格式:class A extends B{代码}
A:子类、派生类、subclass
B:父类、超类、基类、superclass
体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的结构(属性、方法)
注意:
① 父类中声明为私有(private)的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只是由于封装性的影响,使得子类不能直接调用父类的结构而已;
② 子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的扩展;
③ 子类和父类的关系,不同于高中数学中子集和集合的关系。
(3)Java中关于继承性的规定:
① 一个类可以被多个子类继承;
② Java中类的单继承性:一个类只能有一个父类;
③ 子父类是相对的概念;
④ 子类直接继承的父类称为直接父类,间接继承的父类称为间接父类;
⑤ 子类继承父类以后,就获取了直接父类和所有间接父类中声明的属性和方法。
(4)Object类的理解:
① 如果没有显示的声明一个类的父类,则此类继承于java.lang.Object类;
② 所有的Java类(java.lang.Object类除外),都直接或间接继承于java.lang.Object类,则意味着,所有的Java类都具有Object类声明的功能。
(5)Object类结构的剖析:
① Object类是所有类的根父类;
② 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类;
③ Object类中的功能(属性、方法)就具有通用性;
属性:无
方法:equals()、toString()、getClass()、hashCode()、clone()、finalize()、wait()、notify()、notifyAll()
④ Object类只声明了一个空参的构造器。
3、特征三:多态性的理解
(1)含义:理解为一个事物的多种形态。
(2)何为多态性:对象的多态性:父类的引用指向子类的对象(或 子类的对象赋给父类的引用)。
(3)何为虚拟方法:子类中定义了与父类同名同参数的方法,在多态情况下,将此时的父类方法称为虚拟方法。
(4)多态的使用(也称虚拟方法调用):有了对象的多态性以后,在编译期间,只能调用父类中声明的方法,但在运行期间,实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边。
(5)多态性的使用前提:① 类的继承性;② 方法的重写。
(6)对象的多态性,只适用于方法,不适用于属性。(即:编译和运行都看左边)
本文来自博客园,作者:萧若風,转载请注明原文链接:https://www.cnblogs.com/XiaoRuoFeng/p/16400290.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现