轻松理解Java面向对象
学过面向对象编程的程序员都是自我感觉不缺对象的,甚至觉得是一件很简单的事情,不信你看:
new girlfriend();
偷偷告诉你,玩这个梗的基本上都是真正的单身狗了!
面向对象初探
啥是面向对象嘞?我们常说面向对象编程是啥意思嘞?难道是天天对着自己的对象敲代码嘛?
这就扯远了,所谓的面向对象编程也就是OOP,它其实是一种程序设计的规范或者说是方法吧,也就是它会指导你如何进行程序的设计代码编写,是一种思想,编程思想,其实谈到思想这个层次就觉得高大上了不少,一般所谓的思想都是比较抽象的了。
面向对象说白了就是一种程序设计的规范,一般说的面向对象编程思想就是指的你得知道面向对象的程序该怎么去设计。
面向对象是一种编程思想,你有这个思想觉悟嘛?
面向对象思想具体是什么
那所谓的面向对象编程思想是什么呢?一般面向对象思想指的就是你可以以现实世界中客观存在的事物也就是对象去设计程序,啥意思嘞?比如说大家都吃过水果吧,那么都知道水果一词就是个总的概括,就是一个抽象,只说水果你也不知道具体指的是什么,因为苹果,香蕉和橘子等等都是水果。
上述说的水果这些就是现实世界中客观存在的,那么在代码层面我们如何去表达这些呢?通过面向对象编程的思想,我们是可以把水果在代码层面给表示出来的,那怎么表示呢?
在面向对象的程序设计中,水果就是一个类别,就是一个类,然后像苹果啊,香蕉和橘子这些就是一个个具体的对象,好比水果是一个大的类别,其下有苹果,香蕉和橘子这些子类,也就是有一个类,就可以产生多个对象,然后像类别比如还有人类,那么由人类这个类别产生出来的对象有大人,小孩,或者是男人和女人,当然可能还有……
到这里需要重点告诉你的就是,对于面向对象而言,重点关注的就是对象,我们从字面意思理解也可以知道谁是重点,面向对象嘛,自然是以对象为中心去操作,所以面向对象编程的核心时对象。
面向过程
提到面向对象,那就不得不提面向过程,这里先声明一下,这里说的面向对象和面向过程,我们指的都是一种程序的设计思想。
对于面向过程大家应该不陌生,因为大多数计算机专业的都会学习C语言,而C语言就是一门面向过程的编程语言。
当然,对于Java那么大的名气,想必大家早就有所耳闻,Java是一门面向对象的编程语言。
我们上面一直在提思想思想的,总觉得有点抽象,这里提到C和Java,正好一个是面向过程的,一个是面向对象的,我们可以比较下看看面向过程和面向对象有什么不同。
面向过程是怎样的
对于面向过程而言,它的关注点是过程,也就好比你做一件事情,重点在于做这件事情的过程,比如你想吃饺子,那按照面向过程的思想那就需要把吃饺子这个事情细分几个步骤,比如擀面皮,剁饺子馅,包饺子等等,然后就需要按照这些步骤去做了。
在代码层面,就拿C语言来说,这些一个个的步骤对应的就是C语言中的一个个函数,在C语言中,一个函数就代表一种功能,既然是功能最终就是达到一个目的,比如上述的擀好了面皮,剁好了饺子馅以及包好了饺子,所以,按照面向过程的思想就是要这样一步步来操作。
面向过程关注的就是其中的过程,主要就是通过一个个的函数来完成特定的功能,组合起来来完成整体的功能。
所以,面向过程就是这样通过一个个的函数来完成相应功能,如下图这样:
再来看看C语言的代码,看看是不是以函数为主去实现相应的功能:
#include <stdio.h>
void interchange(int u, int v); /* 声明函数 */
int main(void) /* 主函数 */
{
int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(x, y);
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}
void interchange(int u, int v) /* 定义函数 */
{
int temp;
temp = u;
u = v;
v = temp;
}
大家可以感受一下面向过程是怎样的,那么面向对象又是怎样的呢?
面向对象是怎样的
还拿上面的吃饺子为例,如果时按照面向对象的思想来,那你想吃饺子怎么整?还要自己亲自动手去做嘛?当然不用啊,那怎么整,必须是:
new girlfriend();
对呀,new一个对象啊,在面向对象程序设计中,关注点就是对象了,一切的核心就是对象,想吃饺子,找个女朋友来给你做啊,没女朋友?那简单啊,new一个你马上就有对象了。
然后吃饺子这件事情就变成这样了:
感受到差距了嘛?衣来伸手饭来张口就是这种感觉,有对象真好!
在面向对象程序设计中,都是通过一个个的对象来进行各种功能的实现,关注点就是对象,通过上述对比可以看出面向对象设计起来更加高效。
小总结
对于面向过程,关注点就是过程了,主要就是通过一个个的函数去完成相应的功能,主要就是关注数据的流向,就是数据在各个函数之间的传递,而面向对象呢?它的关注点是对象,面向对象的程序设计中,主要就是通过各个对象去完成相应的功能,关注的就是各个对象之间的互相操作。
纯粹的Java
说到面向对象,那咱一定要说Java了,Java是一门纯粹的面向对象编程语言,对了Java是基于C++的,但是它别C++更加面向对象,为啥?
主要是Java在设计上是汲取了C++的优点的,具体表现为继续使用C++面向对象技术的核心,另外在C++中的指针是很容易引起错误的,所以这点Java是舍弃的,只不过在Java中使用了引用来代替指针,另外也舍弃了C++中的运算符重载和多继承的特性,使用了接口来代替等。
类和对象
我们上面说了面向过程,对于面向过程而言,它最小的程序设计单元就是函数,那么对于面向对象嘞?它的最小程序设计单元是啥呢?
这里可不是对象,而是类,在面向对象编程设计中,其最小的程序设计单元就是类,那找个类和对象有啥关系呢?
还记得上面说的那个水果的例子嘛?水果就是一类东西,其下有苹果等等各种水果。
面向过程程序设计中是各个函数,而面向对象中则是各个类,这些个类可以生成多个对象,这些对象其实就对应这具体的某些事物了,比如水果类,生成苹果,香蕉这些对象,人类生出男人和女人这些对象。(听着咋那么别扭呢?)
那么这个类是个什么样子呢?一般的这些个类都有一些内部状态数据,说白了就是对于类而言,它包括属性和方法,比如苹果这个对象,它有甜度,大小等等这些属性特征,然后苹果还可以被吃,这属于一种行为特征,其实就是一种方法,这里的方法其实就是面向过程中的函数,表示一个功能,这里就可以表示苹果被吃了,所以来看类,它是长这个样子的:
在Java代码层面就是这样的:
class Data{
//属性
int a = 20;
String b = new String("666");
//方法
public void someDatas(){
int c = 30;
}
}
在Java中,一切皆对象,写Java代码基本上大多数都是要定义各种类,然后由类可以产生一个个具体的对象,类中可以包含两个基本的类型:属性和方法,然后生成的具体的对象会被保存在Java内存中的堆内存中,也就是每个对象都有一个属于其自己的空间,这个空间来存储对象包含的数据。
面向对象的基本特征
对于面向对象而言,它是有一些基本特征的,就是如下三个基本特征:
1、封装 2、继承 3、多态
对于Java而言,它是完全支持面向对象的这三个基本特征的,对于这三个特征来说,是值得好好学习的,这里不展开叙述了,下次单独介绍,毕竟今天主要是介绍面向对象的。
附加知识点
Java和C++都是典型的面向对象编程语言,但是Java是基于C++的,上述也说了其主要的区别点,这里再单独介绍下关于Java中的引用和C++中的指针问题。
Java是舍弃了C++中的指针,然后使用引用来代替的,那指针是干嘛的,是用来操作内存的,为啥要操作内存呢?我们使用编程语言写一些代码,其实都是在处理各种各样的数据,这其中要牵涉到数据的保存,那保存在哪里,一般的话我们写好的代码刚开始是在我们电脑上的硬盘中,但是当程序要运行的话,就需要把程序加载进内存中才能运行,那想一下加载进内存中,这些数据就存放进去了,那始终还是要操作这些数据的,那该怎么操作,对于我们程序员来说,主要就是代码层次的操作了,我们需要一个特殊的方法啥的,在代码层面与这些内存中的数据建立一种连接,这个怎么弄?
C++中就是用指针来操作内存中的这些数据,指针就是一个连接物,那放在Java中没有指针了,就是使用引用来解决和这个问题了。在经典的《Java编程思想》一书中举了一个遥控器和电视的例子,遥控器就好比是引用,电视机就好比是内存中的数据,这里其实就是对象,两者链接起来,就可以使用遥控器来遥控电视机,当然,遥控器是可以独立存在的,知道那种万能遥控器吗?刚开始没有和指定的电视机配对,是不能使用的,这时候相当于是个独立存在的个体,代码层面就是这样的:
String s;
你看这个就是创建了一个引用s,但是这个引用并没有指向具体的对象,好比一个没有配对的万能遥控器,那怎么配对呢?需要把它与一个实际对象建立起来
String s = new String("hello");
好了,今天的分享就到这里,我们下次再见!