一、什么是面向对象

面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。

对 Java 语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计,这些对象可以是独立存在的,也可以是从别的对象继承过来的。对象之间通过相互作用传递信息,实现程序开发。

1.1、对象的概念

Java 是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。对象有以下特点:

  • 对象具有属性和行为。
  • 对象具有变化的状态。
  • 对象具有唯一性。
  • 对象都是某个类别的实例。
  • 一切皆为对象,真实世界中的所有事物都可以视为对象。

对应在现实中可以这么理解,学生可以抽象成为一个对象,一一对应的话如下:

  • 学生具有年龄、姓名、学号等属性,并具有学习的行为。
  • 学生这个对象针对不同的人,例如张三、李四会有不同的变化状态
  • 学生这个对象只能描述学生在抽象之后的程序世界里,不能描述老师
  • 学生这个对象属于人(Person)类下的某个实例,人(Person)下还有很多的对象。
  • 我们可以用对象的概念,描述现实世界的一切事物。

二、java的三大核心特性

1、封装

利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。

可以按照如下图进行理解

设计的时候可以将学生中实体封装起来,内部隐藏id这个属性。外部只允许调用公开的属性和方法。

  • 属性是名字、学号、年龄、
  • 行为为学习

优点:

  • 减少耦合: 可以独立地开发、测试、优化、使用、理解和修改
  • 减轻维护的负担: 可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
  • 有效地调节性能: 可以通过剖析确定哪些模块影响了系统的性能
  • 提高软件的可重用性
  • 降低了构建大型系统的风险: 即使整个系统不可用,但是这些独立的模块却有可能是可用的

2、继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。

继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。

Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型

Animal animal = new Cat()

3、多态

多态性是指允许不同子类型的对象对同一消息作出不同的响应。

例如:小猫小狗都是动物的子类,但是小猫会喵喵喵,小狗会汪汪汪

多态分为编译时多态和运行时多态:

  • 编译时多态主要指方法的重载
  • 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定

运行时多态有三个条件:

  • 继承
  • 覆盖(重写)
  • 向上转型

三、类(对象)之间的关系

描述类之间的关系可有使用UML类图表示。这里直接引用大话设计模式中1.11章节提供的UML类图作为示例。

类之间的关系,类与接口之间关系可以分一下几种

  • 泛化关系(Generalization)
  • 实现关系 (Realization)
  • 聚合关系 (Aggregation)
  • 组合关系 (Composition)
  • 关联关系 (Association)
  • 依赖关系 (Dependency)

1、泛化关系

泛化关系其实就是继承关系,在 Java 中使用 extends 关键字。

UML表示方式使用空心三角+实线表示

2、实现关系

用来实现一个接口,在 Java 中使用 implement 关键字。

UML表示方式使用空心三角+虚线

此处表示大雁实现了飞翔的接口,存在飞翔的行为。

3、聚合关系

表示整体由部分组成,但是整体和部分不是强依赖的,整体不存在了部分还是会存在。

UML表示方式:空心菱形+实线箭头

聚合表示一种弱的拥有关系,体现的A(雁群)对象可以包含B(大雁)对象,但B对象不是A的对象的有一部分

4、组合关系

和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了

UML中表示方式:实心菱形+实线箭头

组合是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。例如鸟和翅膀的关系。

6、关联关系

表示不同类对象之间有关联,这是一种静态关系,与运行过程的状态无关,在最开始就可以确定。因此也可以用 1 对 1、多对 1、多对多这种关联关系来表示。

UML表示方式:实线箭头

7、依赖关系

和关联关系不同的是,依赖关系是在运行过程中起作用,动物生存需要在依赖于氧气和水,这个是需要在某一个场景下才能构成依赖。

UML表示方式:虚线箭头

参考资料

大话设计模式1.11章节PDF
Java 全栈知识体系

java基础-面向对象相关推荐

  1. Java基础-面向对象第二特征之继承(Inheritance)

    Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...

  2. Java 基础 - 面向对象(不错N多教程集合)

    著作权归https://pdai.tech所有. 链接:Java 基础 - 面向对象 | Java 全栈知识体系 本文主要介绍Java OOP 面向对象基础和相关类图.@pdai Java 基础 - ...

  3. 基于Java基础-面向对象实现植物大战僵尸简易版

    基于Java基础-面向对象实现植物大战僵尸简易版 前言 游戏设计 游戏对象 游戏内容 游戏优化 放置植物的优化 移除植物的优化 游戏可玩性的优化 添加游戏背景音乐 后续优化 源码分享 前言 从零开始学 ...

  4. (20)Java基础 --面向对象(1)

    目录 面向对象 一.概述 二.生活举例 三.类与对象的关系 四.类的构成 五.类的定义 类的属性 类的方法 创建实例(对象) 内存分配图 六.对象的基本使用 七.局部变量与成员变量的区别 八.面向对象 ...

  5. Java 基础 - 面向对象(不错)

    算法 剑指 Offer 题解 Leetcode 题解 算法 字节跳动内推 操作系统 计算机操作系统 Linux 网络 计算机网络 HTTP Socket 数据库 数据库系统原理 SQL 语法 SQL ...

  6. Java基础-----面向对象

    文章目录 面向对象 类与对象 匿名对象 创建对象的内存分析 栈(stack) 堆(heap) 方法区 PC寄存器 本地方法栈 内部类 成员内部类 局部内部类 匿名内部类 静态内部类 包装类 拆箱和装箱 ...

  7. 黑马程序员 JAVA基础 -面向对象(四)

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 在此,分享一下自己学习JAVA的学习心得.有不对的地方请帮忙改正,也希望对想学j ...

  8. java基础面向对象_Java基础面向对象

    一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该 ...

  9. 黑马程序员——java基础--面向对象(篇一)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一章 1.面向对象     2.成员变量      3.匿名对象     4.封装       ...

  10. Java基础--面向对象(上)

    面向对象的三大特征:封装继承多态 1.类和对象 类:抽象不具体的事物,通常表示一类事物的类别,在程序中表示模板 对象:具体的,真实存在的,可以看到的 1.1 如何创建类 类中放所有对象共有的数据/属性 ...

最新文章

  1. 携号转网:欢迎比阻挠更为有效
  2. 图灵5周年系列活动之“有奖DEBUG”
  3. 【PAT (Advanced Level) Practice】1050 String Subtraction (20 分)
  4. 12v电流表的正确接法_难点分析 | 电表的内外接法
  5. 并查集——食物链(poj1182)
  6. Linux 套接字编程中的 5 个隐患
  7. [SHELL进阶] (转)最牛B的 Linux Shell 命令 (三)
  8. pg 简单备份和恢复
  9. 安全测试工具APPScan下载安装及简单使用
  10. 【网络】TCP报文头部
  11. 软件测试ios打包,苹果测试iOS打包成 ipa包
  12. 谷歌 kaptcha 图片验证码使用教程
  13. 人工智能、机器学习、神经网络和深度学习的发展历程(上)
  14. CRM上线之路 走上了CRM实施顾问-第100天上班 -第21周
  15. VMWare虚拟机启动img文件
  16. 人的一生,到底在追求什么呢?
  17. Unity超链接:支持点击事件,下划线以及自定义颜色
  18. 【java】黑白图像
  19. 降水数据下载地址汇总
  20. 天野商业脚本开发第三期培训

热门文章

  1. 吐血推荐|2万字总结Mac所有应用程序、软件工具和相关资料
  2. 千方百剂医药管理系统对接第三方WMS系统(天力士物流)
  3. JZOJ6734. 【2020.06.18省选模拟】航行
  4. 长文解析Resnet50的算法原理
  5. linux系统用虚拟光驱装win7,用虚拟光驱加载win7或者xp iso镜像文件安装系统的图解步骤...
  6. ubuntu 刷新频率 如何查看_ubuntu如何调整显示的分辨率和刷新率?
  7. 基于linux环境tcp网络编程(在线英英词典)文档【3】
  8. BitTorrent详解
  9. 关于PC套件显示红外连接出现问题而导致连接不上的解决方案(zz)
  10. QT封装exe和安装包详解