Java学习笔记系列-入门篇-面向对象的编程思想

Java学习笔记

Java学习笔记是一个持续更新的系列,工作多年,抽个空对自身知识做一个梳理和总结归纳,温故而知新,同时也希望能帮助到更多正在学习Java 的同学们。

本系列目录:

入门篇

基础篇

本篇是第四次修改,会随着技术的迭代持续更新。


面向对象的编程思想

《think in java》中写到,所有编程语言的最终目的都是提供一种抽象的方法。

什么是抽象

  • 抽象
    是无法亲自看到的,需要充分利用思维,抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。
    例如
    苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。

要抽象,就必须进行比较,没有比较就无法找到共同的部分。

编程语言的诞生,就是为了解决一些同样类型的问题,对这些需求的抽象,也因为受到了一定的局限性,在属于自己的领域里面可能非常方便使用,但是遇到其它问题就会显得十分笨拙,后来的许多“命令式”语言(如FORTRAN,BASIC 和C)也是对汇编语言的一种抽象。

与汇编语言相比,这些语言已有了长足的进步,但它们的抽象原理依然要求我们着重考虑计算机的结构,而非考虑问题本身的结构。

在机器模型(位于“方案空间”)与实际解决的问题模型(位于“问题空间”)之间,程序员必须建立起一种联系。这个过程要求人们付出较大的精力,而且由于它脱离了编程语言本身的范围,造成程序代码很难编写,而且要花较大的代价进行维护。
由此造成的副作用便是一门完善的“编程方法”学科。

不同类型的需求诞生的多门语言,对程序员来说是负担,这促使程序员不停的学习,而面向对象的程序设计思路则在此基础上跨出了一大步。

面向对象

一种新兴的程序设计方法,或者是一种新的程序设计规范(Object Oriented Programming,简称OOP),其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。

从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。

万物皆是对象,可以当他是一种新型的变量,也可以当成一个独立的计算机,他保存数据,也可以对自己进行操作。

理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。

根据面向对象的思想来看程序,它就是一大堆对象的集合。

通过消息传递,每个对象都知道自己要做的事情,想想一下,这种场景其实就像是人类社会。
每个人分工明确,但是人与人之间又有区别,都是独立的个体,有自己个性的东西。在程序中,也可以用面向对象的思想来解决问题。

明确了面向对象的思想,那么就更容易理解java中的类,对象了,接下来进行一些理论性的总结:

面向对象三大特性五大原则

在这里插入图片描述

三大特性

  • 封装
    隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

  • 继承
    提高代码复用性;继承是多态的前提。

  • 多态
    父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。

三大特性的概念

  • 封装
    首先,属性可用来描述同一类事物的特征,方法可描述一类事物可做的操作。封装就是把属于同一类事物的共性(包括属性与方法)归到一个类中,以方便使用。
    概念

    封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。

    好处

    1.实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。
    2. 隐藏信息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。

  • 继承
    就是个性对共性的属性与方法的接受,并加入个性特有的属性与方法

    概念
    一个类继承另一个类,则称继承的类为子类,被继承的类为父类。
    目的
    实现代码的复用。
    理解
    子类与父类的关系并不是日常生活中的父子关系,子类与父类而是一种特殊化与一般化的关系,是is-a的关系,子类是父类更加详细的分类。如class dog extends animal,就可以理解为dog is a animal.注意设计继承的时候,若要让某个类能继承,父类需适当开放访问权限,遵循里氏代换原则,即向修改关闭对扩展开放,也就是开-闭原则。
    结果
    继承后子类自动拥有了父类的属性和方法,但特别注意的是,父类的私有属性和构造方法并不能被继承。另外子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。

  • 多态
    多态的概念发展出来,是以封装和继承为基础的。

    多态就是在抽象的层面上实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。(针对一个抽象的事,对于内部个体又能找到其自身的行为去执行。)

    概念
    相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。
    理解
    子类以父类的身份出现,但做事情时还是以自己的方法实现。

    子类以父类的身份出现需要向上转型(upcast),其中向上转型是由JVM自动实现的,是安全的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现时自己特有的属性和方法将不能使用。

五大原则

  • 单一职责原则SRP(Single Responsibility Principle) 类的功能要单一,不能包罗万象,跟杂货铺似的。

  • 开放封闭原则OCP(Open-Close Principle),对于拓展持开放的态度,对于修改则是封闭的。

  • 里式替换原则LSP(the Liskov Substitution Principle LSP),子类可以重载父类,替换父类自身拥有的一些功能,例如小轿车可以派生出黄色的小轿车,黑色的小轿车,颜色就是被替换的属性值。

  • 依赖倒置原则DIP(the Dependency Inversion Principle DIP),高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
    例如人类是抽象的,具体分为黄种人,白种人,黑种人,而黄种人根据不所属不同国家又分别为中国人,日本人,韩国人,新加坡人,等等,中国人,韩国人等就是高层次的抽象结果,在高一级别就是黄种人,白种人,在抽象一层就是人类,如果还要继续往上可以区分地球人,外星人等等

  • 接口分离原则ISP(the Interface Segregation Principle ISP),设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

基本概念

  • 对象
    对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。

    主动对象是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称作主动服务)。

  • 类是具有相同属性和服务的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。

    在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。

  • 抽象类
    如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

    下面要注意一个问题:在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么
    抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。


  • 由一组支持程序开发的类组成。

  • 接口
    一系列方法体的集合,抽象类的延伸。

  • 消息
    消息就是向对象发出的服务请求,它应该包含下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。服务通常被称为方法或函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值