类?对象?实例?
写在前面##
时光匆匆,转眼间发现已经学习Java一年半了。从当初懵懵懂懂的无知少年,到现在依然模棱两可,可以看出Java虽然是一门高级的编程语言,想要学好Java并非易事。哈哈,好吧!还是我太渣了。废话不多说,进入 正题......
类?##
当我在初学类的时候,我的老师是这样告诉我们的:
现在有很多形状不同的三角形,但是我们现在需要一个梯形(也可能是其它形状),你会怎么办?让我们一起看下面那幅图。
![](https://img.haomeiwen.com/i2763521/54b43701de398c68.png)
看过上面那幅图,如果大家有学过C语言就会联想到想到C语言中的结构体。
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生信息登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。 它相当于其它高级语言中的记录。“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。让编程序的人自定义一个数据类型。
其实这里就解决了这样一个问题:如何用已有的数据类型(基本数据类型)来表示我们所需要的数据类型?
几乎任何一门语言是有一定共通性的,我们Java中要是想表示一些不存在的数据类型怎么办?这时就出现了类的概念。
类是一种复杂的数据类型,它是将不同类型的数据与这些数据相关的操作封装在一起的集合体,这有点像C语言中的结构体,唯一不同的就是结构体没有定义所说的“数据相关的操作”,“数据相关的操作”就是我们平常经常看到的“方法”。因此类具有更高的抽象性,类中的数据还有隐藏性和封装性。
类的结构(也即类的组成)是用来确定一类对象的行为的,而这些行为是通过类的内部数据结构和相关操作来确定的。这些行为是通过一种操作接口来描述的(也就是我们平时看到的类的成员函数),使用者只关心的是接口的功能(也就是我们只关心类的各个成员函数的功能),对它是如何实现的并不感兴趣。而操作接口也被称为这类对象向其它对象提供的服务。
是不是看概念可晕?这样说吧,“类”就是“类型”的同义词。
![](https://img.haomeiwen.com/i2763521/674810e7629d3abd.jpg)
我们世界上有很多人,但是他们(对了还包括你和我哦)都属于“人类”这一类型。我们都有相同的地方:我们都有眼、鼻子、脚、手等一些共同的特性,也有吃、喝、玩等一些行为。我们把这些特性和行为抽象出来就形成了我们所说的人类这个“类”。
一句话说完就是
类是一群对象的集合,里面包含了N多的对象。而对象只是类的一个特例。
对象##
谈到对象我们就会自然而然地想到那句耳熟能详的一句话:
![](https://img.haomeiwen.com/i2763521/cbd030162d4aeb0d.jpg)
对象-对象具有状态和行为。例如:狗有状态 - 颜色,名称,繁殖以及行为,摇头晃脑,吠叫,吃。对象是类的实例。
就比如说“安贝贝”是一条狗,它只是狗中的一个特例(它和其它狗不一样,它的毛色、体重、长度、等一些属性确定了它在狗中是唯一的),因此我们就把它叫做一个具体的对象。
当然我们也可以通过“安贝贝”这个对象抽象出“狗”这个类。
实例##
马上就要过中秋节了(温馨提示:今年中秋节在9月15日),那么我们就拿月饼说事儿。
![](https://img.haomeiwen.com/i2763521/63fa86568321b40e.jpg)
现在我们这里的实例就是图中的那个月饼(下面我们用"mc"代称),比如我们有个 mooncake 这个类。我们要对它进行实例化---》 mooncake mc=new mooncake();
这里的mc(月饼)就是一个实例,或者说“mc”就是“月饼类”中的一个对象。new是在堆中为对象“mc”申请了一块空间。其中new也实际上是在调用了“mooncake类”的构造方法。
new的作用
1.创建对象,实例化对象
2.实例化对象,赋予对象空间,即堆内存地址
3.调用构造函数
其实这里对象的实例化就是把所有的材料放到模具中做出成品的这个过程。这里的类就相当于这个模具,只有当实例化之后,我们才可以看到这个让我们口水直流的对象(即月饼mc)。
new出来的“东东”可以叫对象也可以叫实例,类和对象在这个角度上是等价的。
小结##
说了这么多,总结为一句话:每个对象都是某个类(class)的一个实例(instance).
以上是我在Java学习中的一点薄见,望各位大神指点。