掀开面向对象的神秘面纱,我们到底该如何深入理解java的面向对象?
1. 故事从一个小场景开始:
是夜,月黑风高,你单枪匹马独自一人来到幽暗森林,想要去窥探java那神秘而充满好奇的世界。突然,眼前一个黑影一闪而过,你顿时血压飙到250,一句“卧槽”脱口而出,心里害怕极了。“刚刚那玩意到底是人是鬼?”,你不禁问自己。还没等你回过神来,一道闪电划破长空,刹那间你瞥见正前方一颗千年老槐树下似是模模糊糊有一人影,它它正在向你徐徐走来。你慌乱之下一不小心顺手掏出火折子擦亮。但见那人影一袭红衣,隐隐约约身材窈窕,似是个妙龄女子。你松了一口气,一颗悬着的心瞬间放了下来。你也向她走去,慢慢地你终于能有机会窥视下她的真面目了:她年约二八,一双眼睛大而深邃有神,眉宇间充满灵气,唯一美中不足的是她戴了一层薄薄的面纱,但纵使这样也能看出她笔直挺拔的鼻子,性感而又具有野性魅力的小嘴,嘴角微微上翘,似是对你微笑亦或是对你惊讶。好了,刹车了,此处省略10000字…。
2. 用java的思维来抽象出以上场景:
如上图所示:
- 将第一次出现的黑影定义为一个接口-Shadow:因为只看见一团黑影,可能幻化出无数各种的东东;
- 将第二次出现的黑影定义为一个抽象类-Blacker:走进了,稍微有点感觉了,但还是有点模糊;
- 将人影定义为一个普通类Monster,创建一个Monster的实例亢金龙:最近看清楚了,是一个美女:她叫亢金龙,有具体的特点(名字,年龄,眼睛,嘴等)和行为(冲你媚笑,向你徐徐走来等)。
以上就是,面向对象的一个基本思维思想过程。
下面来比较官方和正经地梳理下面向对象。
深入理解面向对象
面向对象的基本概念
面向对象是一种程序设计方法或规范,基本思想是使用对象、类、继承、封装、多态等来进行程序设计。面向对象有类和对象(也叫实例)两个基本要素:
- 类:类是对现实生活中一类具有共同属性和行为的事物的抽象。在Java中,类用于定义对象的属性和行为。类是一个抽象的概念,类似于某类事物的模板,如上面小故事中的Monster。
- 对象:对象是上述类的一个实例,具有具体的属性和行为,如上面小故事中的亢金龙,有具体的特点(名字,年龄,眼睛,嘴等)和行为(冲你媚笑,向你徐徐走来等)。
类的结构和特征
- 类的结构:类由属性(成员变量)和行为(成员方法)组成。类还包括构造方法,用于创建对象并初始化对象的属性。
- 封装:封装是面向对象的三大特征之一(封装、继承、多态)。封装将类的内部细节隐藏起来,对外提供访问的接口,如上面小故事中的幽暗森林,它有一个入口(可以定义为方法或者接口)。Java通过访问修饰符(此文不讨论访问修饰符)来实现封装。封装的目的是保护对象的内部状态,防止外部直接访问和修改对象的数据,确保数据的完整性和程序的安全性。同时,封装使得类的实现细节对外部代码不可见,提供了更好的抽象性和模块化。
3.继承:继承是面向对象编程中实现代码复用的重要手段。子类可以继承父类的属性和行为,从而避免重复定义相同的代码,说白了就是省事,复用功能相同的代码。继承的目的是促进代码的复用和模块化。通过继承一个基类,子类可以继承基类的所有特性,同时还可以添加新的特性或覆盖基类中的方法。多态的目的是使程序设计更加灵活,可以对不同的数据类型进行统一处理。多态性允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用不同的处理方式。 - 多态:多态是指同一个动作(类或者实例的方法)作用于不同的对象时产生不同的行为,如同样是吃喜好,猫喜欢吃鱼,狗喜欢吃肉,奥特曼喜欢打小怪兽。多态主要通过方法重载和接口实现。
普通类,抽象类,接口之间的关系
如上图所示,在Java中,普通类、抽象类和接口之间存在着紧密的联系与明确的区别。它们各自扮演着不同的角色,共同构成了Java面向对象编程的基础框架。
1.普通类(Class)
–定义:普通类是Java中最基本的类,它可以包含成员变量、方法、构造函数等,并且可以被实例化,即可以被创建出很具体的对象出来,如上小故事中的亢金龙。
–特点:普通类提供了具体的实现,可以被其他类继承,也可以实现接口,如上小故事中的亢金龙,即可以继承Monster中的方法和属性,也可以实现shadow这个接口。
2.抽象类(Abstract Class)
–定义:抽象类是一种特殊的类,它不能被实例化,但可以作为其他类的父类。抽象类中可以包含抽象方法和具体方法,如上图中的黑影,不能将其实例化,因为你根本不知道它会呈现什么属性和方法,是人是鬼搞不清楚。
–特点:抽象方法没有方法体,必须由子类实现。抽象类可以包含成员变量、构造方法、具体方法、抽象方法等。一个类只能继承一个抽象类(Java的单继承特性)。抽象类主要用于定义类的结构,提供部分实现,并允许子类继承并补充完整实现。
3.接口(Interface)
–定义:接口是一种完全抽象的类型,它只包含方法的声明(即方法签名),不包含方法的实现。如上面小故事中的Shadow,高度抽象,你对此一无所知,想不出来具体的属性和方法,没办法实例化。
–特点:接口中的方法都是抽象的,必须由实现类提供具体实现(在Java 8及以后,接口可以包含默认方法和静态方法,但这些方法仍然有特定的规则)。接口中的成员变量默认为public static final,即常量。接口不包含构造方法,因为接口不能被实例化。一个类可以实现多个接口(Java的多实现特性)。接口主要用于定义类的行为,提供一组相关的方法签名,由实现类提供具体实现。
4. 继承与实现:
–普通类可以继承抽象类,并必须实现抽象类中所有的抽象方法(除非它自身也是抽象类)。
–普通类和抽象类都可以实现接口,并必须实现接口中所有的方法(在Java 8及以后,可以选择实现部分默认方法,但仍然需要实现所有非默认方法)。
5. 抽象类与接口的结合:
–抽象类可以包含接口作为成员变量或方法返回类型。
–接口可以包含抽象类作为方法的返回类型或参数类型(但接口不能直接包含抽象类的实例,因为接口不能被实例化)。
6.Java 8及以后的变化:
–在Java 8及以后的版本中,接口可以包含默认方法和静态方法,这增加了接口的灵活性和功能性。
从现代哲学角度理解面向对象
- 面向对象的哲学本质
面向对象方法本质上描述的是事物之间的一种关系,最主要的是因果关系,代表的是事物之间的独立、平等关系。它强调对问题空间的自然分割,以更接近人类思维的方式建立问题域模型,从而实现对客观实体的结构模拟和行为模拟。这种思想体现了人类对世界的认知过程,即从复杂到简单、从具体到抽象、从个别到一般的归纳和演绎过程。 - 面向对象与哲学的联系
本体论:面向对象哲学与本体论有着紧密的联系。本体论探讨的是存在的本质和构成,而面向对象方法则通过类和对象的概念来抽象和表示现实世界中的实体和关系。在面向对象中,每个对象都是独立存在的实体,具有自己的属性和行为,这与本体论中的“实体”概念相吻合。 - 认识论:从认识论的角度来看,面向对象方法体现了人类对世界的认知过程。它通过对现实世界的抽象和表示,帮助我们更好地理解和解决问题。同时,面向对象方法也强调了对知识的封装和重用,这有助于我们提高认知效率和准确性。
- 方法论:面向对象方法不仅是一种编程技术,更是一种解决问题的哲学方法论。它强调以对象为中心来组织和管理系统,通过封装、继承和多态等机制来实现系统的模块化和可扩展性。这种方法论体现了人类对复杂系统的认知和管理能力,有助于我们更好地应对现实世界中的挑战。
从中国古代哲学角度理解面向对象
《道德经》里面有句话,我很喜欢,里面包含面向对象的思想。
原文为:“道生一,一生二,二生三,三生万物。万物负阴而抱阳,冲气以为和。”这句话揭示了宇宙万物的生成过程,以及阴阳相互依存、相互转化的关系。类和对象的生成也遵循此过程:类派生出对象,从抽象到具象,从共性到特性,从一而二,从佛像到众生相。就像上面小故事里的Shadow到亢金龙。
面向对象的三重境界:
- 第一重境界:表象的超越—看山是山,看水是水
- 第二重境界:本质的洞察—看山不是山,看水不是水;
- 第三重境界:返璞归真的领悟—看山仍然是山,看水仍然是水。
这三重境界的绝妙之处只可意会,言传恐不达意。就像上面小故事中的你,随着境界的深入,最终Shadow的本源其实就是一个大美女-亢金龙。
本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。