在Java中,一切皆为对象,类和对象是一个抽象的概念。我们可以从面向过程来过渡到面向对象。
那么什么是面向过程呢?
举一个简单的例子,现实生活中,你需要买一台手机的时候会经历如下步骤:
这里的每一步都可以理解为一个过程。完成这件事或者说这件任务,需要分步骤去完成。因此这就是我们面向过程的思想,C语言就是典型的面向过程。因为在存粹的C语言中,是没有类和对象这个概念的,只有函数的封装思想。那么一个个的函数封装其实就是一个过程,一个步骤。当我想通过代码完成一件完整的功能的时候,我是需要通过调用这些函数一个个按步骤去完成的。是不是可以很好的理解什么是面向过程。
那么什么是面向对象呢?
还是买手机这个例子,假设你是一个老板,老板一般都会有秘书。秘书的任务就是帮助老板完成一些繁琐复杂的事。现在老板想要买一台手机。它不需要思考上面那么繁琐的步骤,他会直接告诉秘书,我需要一台手机,你帮我买。那么秘书就会买回来,老板就能使用。而这个过程中,繁琐的步骤其实是交给了秘书去干。大大简化了这个过程。
面向对象的思想就是这些实体之间相互合作,比如老板,秘书,手机。这三个实体也称为三个对象。而在面向过程的时候你更关注的是过程(一个个函数)是如何运作的。在面向对象中,比如说我们前面数组中常用到的Arrays.toSting这个方法。(参考数组章节),我们并不关心它到底干了什么,我们关心的是它能完成什么任务,它的功能是什么。至于它的实现步骤,我们并没有关心。这就是面向对象的思想,也是面向对象和面向过程的区别。
那么如何拿到一个对象呢?
这就涉及到类的问题了,想要有一个对象,我们必须现有一个类。类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别。比如说人,是可以看成是一个对象。那么你也是人我也是人,如何把人给描述出来呢,这就靠类,其实我的理解是类就是一个模板。
这就是模板,我们通过这个模板能定义出不同的对象来。现在我们通过这个例子用代码去实现一下,定义一个类:
class Person{
public String name;
public int age;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
看到我们定义了一个类,有属性有行为。行为也称之为方法。现在我们有类了,就可以拿到对象,这个过程我们叫实例化对象。
类其实是一个类型,是用户自定义的。它是一个引用类型,我们前面讲数组的时候强调过什么是引用类型,说白了就是存的是地址。那么就需要用new关键字,在堆上开辟一块空间用于存放这个对象。
如何通过对象去访问成员变量和方法呢?
通过点号就能访问我们定义在类里面的成员变量和方法:
下面我们针对实例化对象,看看内存是如何布局的:
这和我们讲数组是引用类型的布局是很类似的。都是通过地址来找到引用的那块内存,这块在堆上开辟的内存空间是属于对象的。但是这块空间只存属性,也就是只存储了成员变量。那么成员方法在哪呢,它是在另外一片空间名叫方法区。而且 方法是不占用内存的。只有调用的时候才会占用内存。而且是在栈上。类是不占用内存的。只有实例化一个对象的时候,才会出现上图所示的情况。