面向对象编程(OOP)是当今最流行的程序设计技术。它具有代码易于维护、可扩展性好和代码可常用等优点。面向对象的设计方法的基本原理是按照人们习惯的思维方式建立问题的模型,模拟客观世界。从现实世界中客观存在的事物(也就是对象)触发,尽可能运用人类的思维方式来构造软件系统。而 Java 就是一种面向对象的程序设计语言。
什么是对象
- 对象是一个自成一体的实体,它仅包含属性和行为。
- 对象是对事物的一种实例化描述。
- 一个精心设计的对象,有明确的边界,执行一组有限的行为。
面向对象编程
- 面向对象程序设计(Object-oriented programming),简写OOP。
- 面向对象编程,注重:
- 数据和其行为打包封装
- 程序的接口和实现的解耦
- 面向对象是一种思想,是我们考虑事情的方法,通常表现为我们是将问题的解决按照过程方式来解决呢,还是将问题抽象为一个对象来解决它。很多情况下,我们会不知不觉的按照过程方式来解决它,而不是考虑将要解决问题抽象为对象去解决它。有些人打着面向对象的幌子,干着过程编程的勾当。
面向对象的特性
- 封装:
- 封装就是把客观事物封装成抽象的类。并且可以把类的属性和行为只给可信的类或者自己操作,对不可信的信息隐藏。
- 封装通过私有属性和私有方法,保护了内部数据和逻辑不被外部锁访问。
- 继承:
- 通过继承父类,可以得到父类的属性和行为,为自己所用。
- 通过继承创建的新类成为“子类”或“派生类”,被继承的类成为“父类”或“基类”。
- 继承的实现有两种,实现继承和接口继承。实现继承是子类直接使用父类的方法和属性,无需额外的编码。接口继承是仅使用父接口的属性名和方法名,其实现类必须手动实现该接口。
- 多态:
- 顾名思义表示不同形态。意思是,根据实现方法的对象,相同的方法名称具有不同的行为。
- 从面向对象角度来解释的话,多态就是不同对象中同种行为的不同实现方式。举个例子:比如人吃饭,不同的人吃饭方式都是不同的,比如你可能是委婉型的,小口小口慢慢地吃,我是大口大口豪放型的吃。这就是吃饭这个行为的不同表现形式,统称「多态」。
- 多态的条件:继承,重写,向上转型。
- 多态的实现:
- 接口:接口Animal, 实现类Dog, 实现类Cat。Animal animal = new Dog(); Animal animal = new Cat(); 这个时候,就实现了多态。
- 抽象方法:抽象类Animal。子类Dog, 子类Cat。Animal animal = new Dog(); Animal animal = new Cat(); 这个时候,就实现了多态。
- 方法重写:父类Animal。子类Dog, 子类Cat。Animal animal = new Dog(); Animal animal = new Cat(); 这个时候,就实现了多态。
面向对象的原则
-
单一职责原则SRP(Single Responsibility Principle):是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
-
开放封闭原则OCP(Open-Close Principle):一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能, 那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
-
替换原则LSP(Liskov Substitution Principle) 子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工, 也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
- 依赖原则DIP(Dependency Inversion Principle) 传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也称为高层依赖低层!所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!
- 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
- 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
- 将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。
- demo: 母亲给孩子讲故事。书中的故事,报纸中的故事。定义接口故事。书和报纸,实现故事接口。
- https://blog.csdn.net/zhengzhb/article/details/7289269
- 接口分离原则(the Interface Segregation Principle ISP):模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
值传递和引用传递
- Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。
- 基本数据类型在声明时系统就给它分配空间。引用则不同,它声明时只给变量分配了引用空间,而不分配数据空间:
- 值传递:引用基本类型时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
- 引用传递:也称为传地址。传递对象时,实际参数的引用被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址。在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。