用比较专业的话来说:

对象是类的实例,类是对象的模板。

这句话对没接触过编程的人来说有点抽象。

现在我们用非常不专业的话来理解什么是类,什么是对象。

所谓类,其实就是字面意思,可以认为是一类东西,最简单最常用的例子应该是人类这个例子。

假设现在人类找到了外星人,然后友好的跟他们打招呼:我们是人类,我们有两只眼睛一张嘴,两个耳朵一个鼻子。
到头来外星人还是不知道人类到底长个啥样子。
对于我们自己来说,一提到人类,你肯定也会想到这些能反映人类特征的例子,但是你应该不会去想一个特定的人,因为个人不能代表人类,当然女娲除外(前提是存在女娲)
除此之外,还有很多类的举例,比如:
垃圾桶(你只会想到这是一个容器,可以装垃圾,具体样子却不能确定)
我需要一个门(只知道门的基础特征,那么您是需要水火不侵的防盗门还是要造价便宜的茅草门呢?)

很多时候我们都不会去谈论一个类怎样怎样,因为类很抽象,相当于一个模板,有点类似于你只有图纸却没有制作出来东西。

那么要怎么变得不抽象呢?
你直接给个对象得了呗。当然这个对象不是你下象棋的对象,也不是过年回家你七大姑八大姨让你找的那个对象。
外星人表示还是不知道人类是啥样子,只是有了粗浅概念。那这个简单啊,你直接找个人给他们看看不就完事了。大活人往那一站,什么问题都解决了。
用人类这个模板创造出一个具体的人,那么创造出来的这个人就是人类的一个具体对象。(女娲看了表示很赞)
所以到这里,应该能对类与对象有一个基本的概念了,一句话概括:

类是模板,对象是具体产品。


那么问题来了,编程为什么需要类与对象概念呢?

当然是面向对象编程。也就是基于类与对象的概念进行程序编写。

这里要先来了解下历史,历史上编程原本并不存在面向对象的概念。当时的人们是面向过程。
那么什么是面向过程和面向对象,这里有一个别人写的非常好的例子:

用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。

 蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。

 蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。

  到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。

  盖浇饭的好处就是”菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是”可维护性“比较好,”饭” 和”菜”的耦合度(耦合度为关联性,关联性太高就是两者之间谁也离不开谁)比较低。蛋炒饭将”蛋”“饭”搅和在一起,想换”蛋”“饭”中任何一种都很困难,耦合度很高,以至于”可维护性”比较差。

到这里的话基本上可以理解什么是面向过程和面向对象了。还是总结一下:

面向过程是一个完整的过程,这个过程不能缺少或更改任何一个步骤,否则会导致出错,你要吃啥我就炒啥。面向对象就是将整个过程根据不同对象进行划分,我把菜单独炒出来,我把饭单独蒸出来,浇头单独拿出来,客人要啥我当场组合,由此会出现多种多样的组合,满足了多样的需求。反映在程序上就是写好每个对象,然后把很多对象组合起来,由此完成一个程序的编写。

代码上: class就是类的意思,使用new单词去利用人类模板创建一个具体的人。

class Human{...};  //这里是一个人类模板

Human qing = new Human; //创建一个人类的具体对象,对象名字是Qing,使用的模板是Human模板。

由此完成了一个对象的创建。

至此类与对象的概念基本了解完了。