C++程序员学Java系列之十七:面向对象

来源:互联网 发布:网址推广联盟 乐乎 编辑:程序博客网 时间:2024/05/29 18:55

这一章节的学习其实和C++基本一致,所以比较简单

一,理解什么是面向过程、面向对象

1)面向过程与面向对象都是我们编程中,编写程序的一种思维方式。

面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。

例如:

公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生打扫干净了。


2)面向对象的程序设计方式,是遇到一件事时,思考“我该让谁来做”,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了。

例如:

公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向对象的程序设计方式会思考“我该让谁来做,如小明擦玻璃、让小丽扫地、让小郭拖地、让小强倒垃圾等”,这里

的“小明、小丽、小郭、小强”就是对象,他们要打扫卫生,怎么打扫是他们自己的事,反正最后一群对象合力把公司卫生打扫干净了。

二,面向对象思维方式的好处

通过生活中的真实场景使用面向对象分析完之后,我们开始分析面向过程和面向对象的差异做出总结:

1)面向对象思维方式是一种更符合人们思考习惯的思想

2)面向过程思维方式中更多的体现的是执行者(自己做事情)面向对象中更多的体现是指挥者(指挥对象做事情)

3)面向对象思维方式将复杂的问题简单化。


三,类和对象

对象在需求中的使用

在具体问题中如何使用面向对象去分析问题,和如何使用面向对象?

我们把大象装冰箱为例进行分析。

在针对具体的需求,可以使用名词提炼的办法进行分析,寻找具体的对象。

需求:把大象装冰箱里

对象:大象、冰箱

分三步:

1、打开冰箱门

2、将大象装进去

3、关闭冰箱门

分析发现打开、装、关闭都是冰箱的功能。即冰箱对象具备如下功能:

冰箱打开

冰箱存储

冰箱关闭

用伪代码描述,上述需求中有两个具体的事物大象 和  冰箱

描述大象:

class 大象

{

}

描述冰箱

class冰箱

{

  void 打开(){}

  void 存储(大象){}

  void 关闭(){}

}

当把具体的事物描述清楚之后,需要使用这些具体的事物,Java使用具体的事物,需要通过new关键字来创建这个事物的具体实例。

使用对象:
1、创建冰箱的对象

冰箱 bx = new 冰箱();  

2、创建冰箱的对象

大象 dx = new 大象();

3、调用冰箱的功能,使用规则:对象.功能();
bx.打开();

bx.存储(new 大象());

bx.关闭();

总结:
1、先按照名词提炼问题领域中的对象
2、对对象进行描述,其实就是在明确对象中应该具备的属性和功能
3、通过new的方式就可以创建该事物的具体对象
4、通过该对象调用它以后的功能。

四、类和对象的区别

面向对象的编程思想力图在程序中对事物的描述与该事物在现实中的形态保持一致。

为了做到这一点,面向对象的思想中提出两个概念,即类和对象。

其中,

类是对某一类事物的抽象描述,

而对象用于表示现实中该类事物的个体

例如:

可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例。


五、局部变量和成员变量区别

理解清楚了类和对象之后,我们发现在描述类的属性和定义变量差别不大,唯一区别就是位置发生了改变,那么类中定义的变量,和在方法定义的变量有啥差别呢?

区别一:定义的位置不同

定义在类中的变量是成员变量

定义在方法中或者{}语句里面的变量是局部变量

区别二:在内存中的位置不同

成员变量存储在对内存的对象中

局部变量存储在栈内存的方法中

区别三:声明周期不同

成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失

局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失

区别四:初始化不同

成员变量因为在堆内存中,所有默认的初始化值

局部变量没有默认的初始化值,必须手动的给其赋值才可以使用。


六、基本类型和引用类型作为参数传递

引用类型数据和基本类型数据作为参数传递有没有差别呢?

基本类型作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法show(),当在show()方法中x接受到了复制的值,再在show()方法中对x变量进行操作,这时只会影响到show中的x。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的x值还是原来的值。

当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.x=6时,会根据d所持有的引用找到堆中的对象,并将其x属性的值改为6.show方法弹栈。

由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。


七、封装
封装,就是将具体功能封装到方法中

封装,它也是面向对象思想的特征之一。面向对象共有三个特征:封装,继承,多态。

封装表现:

1、方法就是一个最基本封装体。

2、类其实也是一个封装体。

从以上两点得出结论,封装的好处:

1、提高了代码的复用性。

2、隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。

3、提高了安全性。


八、 私有private

总结:

类中不需要对外提供的内容都私有化,包括属性和方法。

以后再描述事物,属性都私有化,并提供setXxx getXxx方法对其进行访问。

注意:私有仅仅是封装的体现形式而已。


九、this关键字

this和C++中的是一样的,其实就是代表这个对象的本身,可以理解为等同于 this == (&这个对象)
this关键字可以解决 成员变量和局部变量同名问题
当在方法中出现了局部变量和成员变量同名的时候,可以在成员变量名前面加上this.来区别成员变量和局部变量



原创粉丝点击