对于刚接触JAVA或者其他面向对象编程语言的朋友们来说,可能一开始都很难理解面向对象的概念以及对象的关系。

面向对象

首先,一言不和先百度,得到如下定义:

一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

我们知道,编写程序的目的是为了解决现实生活中的问题,编程的思维方式也应该贴近现实生活的思维方式。面向对象的编程方式就是为了实现上述目的二出现的。它使得编程工作更直观,更易理解。需要注意的是这里说的编程不光是coding还包括了设计的过程也是面向对象的

为什么说面向对象更贴近实际生活

想象一下,当我们向别人描述一样事物时,我们都是怎么说的?”它有像鸭子一样的嘴巴”,”它有4条退”,”爪子里还有蹼”,”它是哺乳动物但却是卵生”。

这种HAS A 和 IS A的表达方式往往可以简单而高效的描述一样事物。HAS A描述事物的属性或行为,IS A 则说明了事物的类属。

当我们把这一系列的属性组合起来便得到的鸭嘴兽这一,同时哺乳动物一词简单精炼的表面了所有哺乳动物的特性而不用一一列出,这是继承特性的体现,同时卵生又是多态的体现。

这就是面向对象的思维特点,抽取(抽象)有用的属性和行为(抛弃哪些无需关系的)组织(封装)成一个类。这个过程中你也许会发现很多属性或方法是和另一个类相同的,那么你就可以采用继承的方式避免重复(当然这个过程也有可能是,当你设计完一个个类后,才发现他们有共同点,然后再抽取出基类)。更重要的是,继承是可以不原样照搬的,我们可以通过重载实现相同行为或属性的特有实现方式,这种特点称之为多态,例如同样的生产行为,实现方式由胎生变为卵生。请大声念出,并牢牢记住面向对象的四个特征:

  • 抽象

  • 封装

  • 继承

  • 多态

与早期结构化编程相比

早期结构化编程是面向过程的(功能),换句话说程序是由功能的集合组成,而调用者是作为功能的参数传入的。而在面向对象的程序中,对象是主体,程序是由对象的集合组成。一个对象中包含一系列符合设计的功能供其他对象调用。这么说可能还是比较抽象,
,例如当我们设计一个五子棋游戏时,
面向过程的设计思路就是首先分析问题的步骤:
1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。
把上面每个步骤用分别的函数来实现,问题就解决了。

而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:
1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。

第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。


随便写点代码,大家看看就好,不要太认真….

/**玩家类**/public class Player {   String name;       //棋手名称   boolean isFirst;  //是否先手   int color_flag;  //代表颜色  0-白 1-黑   Table table;//棋盘对象

 public Player(String name,boolean isFirst;int color_flag){          this.name=name;          this.isFirst=isFirst;          this.color_flag=color_flag;   }

 /** 下棋,x,y为落子坐标 **/ public void play(int x,int y) throws Exception{     if(this.table==null){        throw new IllegalArgumentException("玩家还未注册到棋盘!");     }   table.setNewPieces(x,y); }

   public void setTable(Table table){      this.table=table;   } }/**棋盘类**/public class Table{ List<Player> playerList=new ArrayList<Player>(); Referee referee ; public Table(){  referee =new Referee(this); } /**   注册玩家 **/ public void registPlayer(Player player) throws Exception {     //检测棋盘中的玩家是否已满,先手玩家和玩家选色是否冲突。     .......    playerList.add(player);    player.setTable(this); }

  /**   落子  **/

  public void setNewPieces(int x , int y){         //重新绘制棋盘         ......        //调用裁判对象,判断结果     if(referee.isEnd){         End();       }  }

  public void End(){     ....... }}/**裁判类**/public class Referee(){ Table table; public Referee(Table table){   this.table=table;}

  public boolen isEnd(){     //判断输赢     ....   return false;   }}

然而事实上,通过上述示例代码,我们不难发现,即使我们使用面向对象的方式,上面例子里面向过程中提到的几个下棋过程我们还是都实现了的,只不过程被封装到了类的方法中。所以说其实面向对象和面向过程并不是编程的区别(需要实现的业务逻辑的量不会产生变化),而是设计的区别!

类与对象

类是抽象的,而对象是具体的

如何理解上面的话呢? 例如鸭嘴兽是类型,具体的鸭嘴兽A、鸭嘴兽B就是对象了。在JAVA中对象是通过new关键字声明的。 再例如,《红色警戒》中美国大兵是一兵种,点击制造后从兵营里出来的那个会开枪的家伙就是对象了:

的定义就是一个模板,它描述的一类对象的属性与行为。类往往是抽象的、没有实体的。哺乳动物是的概念,是抽象的,现实中没有哺乳动物这一实体,只有具体的如老虎,狮子等。编程工作中套用这一思维模式,我们将程序中的实例抽象为类,例如一个系统中的用户有张三、李四我们会把他们抽象为Person类,或者称之为一个名为Person的数据类型。

对象则是根据所属模板创造出来的实实在在的事物。在程序中我将这个实实在在的事物称之为实例,我们为它的属性赋上特定的值,让它成为张三或者李四。在内存里来说,对象是表示的就是具体数据。

前面说的都是概念性的东西,下面我们说说实际的运用过程中的理解。

从数据类型来说

以java为例,数据类型分为基本数据类型引用数据类型

基本数据类型就是byte,short,int,long,double,char,boolean;其它的,需要用到new关键字来赋值的都是引用数据类型。 类与对象指的便是引用数据的类型与其值(这里指的类不光是class,还包括接口、数组、枚举、注解)。 而引用指的是内存地址的引用,关于这点在后面说的内存时会细说。
看下面的代码:

int a =1; Person b=new Person();

a 和 b 都是本身无意义的变量名。需要关注的是:a的类型是基本数据类型int值为1,而b的类型是Person属于引用类型,其引用的是new Person()这个对象。我们往往会说对象xx,比如这里的对象b。但实际上b只是对象的引用,真正的对象是后面的new Person()!

需要注意的是String也是引用数据类型,只不过因为使用率非常高,所以对于String,jvm支持其可 以像基本数据类型一样使用:String a = “abc”; 同等于 String a = new String(“abc”);

总之呢,简单来说指的的引用数据的类型,对象是具体赋的值。为了更深入理解,我们下面需要解释下这个引用是如何体现的。

什么是引用(从内存来说)

要深入理解什么是类,什么是对象,什么又是引用,就离不开说说java的内存使用方式。

在java中内存被大致划分为栈(stack)堆(heap) (之所以是大致,是因为还包括其它几部分就不在这细说)。堆栈的介绍可以参考这里

在这里我们只说一点:java中,基本数据类型以及对象的引用都保存在栈(stack),而对象则保存在堆(heap)中,例如当如下代码:

int a=1;Person p;

内存中的状态大致如下:

int a = 1 是直接在栈中开辟空间,而对于未进行实例化的Person p因为没有有效的内存地址引用它的值是null。而当代码进行如下修改时:

int a =1 ;Person p = new Person();

内存中的状态大致如下:

Person p=new Person();使得p的值=0x8da23也就是对象new Person();中的地址。所以,到这里后就不难理解之前说的对象的引用了,所谓引用其实就是堆内存地址的引用。

谈谈我对面向对象以及类与对象的理解相关推荐

  1. Java入门姿势【面向对象:1】啥事面向对象、类和对象如何理解

    面向对象是编程开发的一种编程范式. 这次我们来详细了解一下Java面向对象,面向对象的思想已经涉及到软件开发的各个方面,如:面向对象的分析,面向对象的设计.以及我们经常说的面向对象的编程实现 其余的一 ...

  2. 谈谈对面向对象、类、对象的了解

    谈谈对面向对象.类.对象的了解 面向对象 强调具备了功能的对象,以类 / 对象为最小单位,考虑让谁来做. 面向对象编程语言中都有类的概念,代码的组织靠类(代码的最小组织单位是类),面向对象编程中执行一 ...

  3. 面向对象编程——类和对象

    面向对象编程 类和对象 类(Class):用来描述具有相同属性和方法的对象的集合 class Student:name='stu'#属性def say(self):#方法print("hel ...

  4. Java-入门之面向对象以及类和对象的概念(一)

    面向对象,类,对象? 前言:只有光头才能变强! 一:面向对象 当我们初学java时,扑面而来的一个词就是面向对象,那什么是面向的对象呢 ? 在说面向对象之前,大家先要知道对象是什么,如果你脑子里第一想 ...

  5. python【面向对象(类和对象)】

    1.面向对象(类和对象) 1.编程思维 根据面对问题不同人呈现出来的思维模式不同,可以将编程思维分为三种: 1.面向过程编程(穷人思想)-- 会基本的逻辑和语法(遇到问题马上想到的是解决问题的具体逻辑 ...

  6. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  7. Day16:面向对象编程——类和对象

    一.面向对象的程序设计 在此之前用到的事面向过程的程序设计,它的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大的降低 ...

  8. PHP 面向对象:类和对象

    2019独角兽企业重金招聘Python工程师标准>>> 从OOP的视角看,不应区分语言.无论是C++.无论是Java.无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便 ...

  9. python面向对象(part1)--类和对象

    学习笔记 开发工具:Spyder 文章目录 概述 面向过程 面向对象 类和对象 举个例子 语法 定义类 创建对象(实例化) 实例成员 实例变量(对象的变量) 实例方法(对象的方法) 类成员 类变量 类 ...

最新文章

  1. Linux文件分割与合并:splitcat(转载)
  2. windows10配置jenkins
  3. 根据时间比较选择数据
  4. 上传图片到linux返回url,Springboot 将前端传递的图片上传至Linux服务器并返回图片的url(附源码)...
  5. 网站推广下吉利关联公司公开“车辆故障预测方法”将在事故发生前预警
  6. python 3.8.0安卓_Python 3.8.0稳定版正式发布
  7. 【Linux网络编程学习】I/O多路复用——select和poll
  8. 《 FRIDA系列文章 》
  9. 链表、头指针、头结点
  10. iPhone11系列新配色售空 暗夜绿溢价超过500元
  11. qtabbar设置不同宽度_透水地坪需要设置伸缩缝吗?
  12. 如何将字节数组转换为十六进制字符串,反之亦然?
  13. 百度网盘svip下载时显示下载请求中无下载速度
  14. 微信小游戏代码包侵权的避开技巧(含处理脚本代码)
  15. Java经典小案例(不定时更新)
  16. 使用VNC远程登录百度智能云服务器
  17. 山东腾飞科尔沁 国稻种芯·中国水稻节:内蒙沙漠万亩水稻
  18. 服务端判断客户端是移动端浏览器还是PC端浏览器
  19. BurpSuite抓包出现建立安全连接失败(Software is Preventing Firefox From Safely Connecting to This Si)
  20. html 视频超出隐藏,html – 如何阻止视频标签溢出其容器div.

热门文章

  1. 西安市高新区将建智慧程度最高的城市地下综合管廊项目
  2. 高校计算机教研室工作计划,高校教研室工作计划
  3. 小程序毕设答辩问题【论坛/校园墙小程序】
  4. 回首8102,展望9102
  5. TCP三次握手的原因
  6. 简单的canvas动画原理
  7. 使用 Kube-capacity CLI 查看 Kubernetes 资源请求、限制和利用率
  8. 使用并行的方法计算斐波那契数列 (Fibonacci)
  9. javaSE进阶练习—— Collection的三种遍历方式练习
  10. Vue: v-html