面向过程和面向对象的区别:
经常听到有人说,计算机语言可以归为面向过程语言和面向对象语言,那么到底什么是面向对象,什么是面向过程呢?
答:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
——摘自《C#编程词典》
车开动去新疆,车开动的这个方法应该写在车里还是司机里呢?应该写在车里,因为对于车开动这个过程,车本身比司机更加了解其中的过程,因此方法应该写在最直接拥有的类中
对象的作用域 可以存活在{}之外,但是引用它的变量只能存活在{}之内,不被引用的对象,java的垃圾回收(GC)起会判断其实无用的,然后释放这些对象的内存空间,可以理解为如果引用死了,对象就要跟着殉情...但是你根本确定不了什么时候回收没有引用的对象
面向对象优势:加功能不用更改以前程序、动态分配内存
把类之间的调用想象成类之间的交谈
面向对象语言的五个基本特性:
(1)万物皆对象:将对象视为奇特的变量,它可以存储数据。也可对自身进行操作,理论上可以抽取任何物体将其表示为程序中的对象,其实可以把基本类型也看成是是对象,只是它们使用了一个更简洁的初始化方式,创建一个并非是引用的“自动”变量,直接存储值
(2)程序是对象的集合,它们通过发送消息告知彼此要做的,要想请求一个对象,就必须对该对象发送一条消息,也就是对某个特定对象的调用请求(对象先创建后使用)
(3)每个对象都有自己的由其他对象所构成的存储:可以将一个对象放到另一个对象之中,构成复杂模型
(4)每个对象都拥有其类型:每个对象都是一个类的实例
(5)某一特定对象的所有对象都可以接收同样信息:比如圆形类型的对象同时是几何类型的对象,所以一个圆形对象必然能接受到发送给几何形对象的消息,也就是拥有其属性和方法。
(6)面向对象的目标就是去创建能够提供理想的服务来解决问题的一系列对象。
思维方式:将问题从表象中抽取出来,思考什么样的对象可以马上解决问题
类与对象的关系
类是构造对象的模板或蓝图,类是一个抽象的,实例化成具体东西后变成对象。类指的是一类东西,而对象指的是具体东西,比如狗是一个类,而具体的一条狗就是一个对象。
类描述了具有相同特性(数据类型)和行为(功能)的集合,由此可以把它看做是一个数据类型
类的创建(类对应名词,名词里的状态名词表示属性,方法对应动词,比如狗是个名词表示一个类,狗的状态比如狗的名字,狗的年龄表示属性,狗会跑就是一个动作表示方法)
<修饰符>class<类名>{
<属性(状态)>
<构造方法>
<普通方法>
}
构造器(构造方法)
对类进行初始化 语法:修饰符 类名(参数){ } 让对象在创建的时候有初始值
(1)与类名相同,不可写返回值,在new时被调用。
(2)每个类自带一个无参构造器,赋默认值,引用类型为null,若写了一个构造器,无参构造器会变成不合法,若想使用无参构造器需要手动写一个(每个类最好有一个无参构造器)。
(3)构造函数参数是什么类型,对象传参时就是什么类型,若想传入Animals型,则构造函数参数为Animals型
(4)构造代码块{ }是给对象用的(成员方法,成员函数),在执行父类构造方法后执行子类构造代码块,不管执行哪个构造函数,都会先执行构造代码块,构造代码块在构造函数执行前执行。父构造代码块,父构造函数,子构造代码块,子构造函数
对象创建
Animal xb=new Animals();(创建对象new+构造方法(构造器)调用类的构造器)
xb是引用对象的一个变量相当于遥控器,而对象相当于电视机,只要能握住这个遥控器,就能保持与电视机的相连。 new可以表示给我一个新对象,而Animals表示的是这个引用可以引用什么对象。
状态(实例变量):内部数据,描述对象的特征的信息
行为:方法
标识:每个对象都有唯一的标识和其它对象区分开,就是每个对象在内存中都有唯一的地址
访问对象成员:xb.color 属性 xb.run()方法
对象创建步骤
1.将Animals.class加载进内存
2.栈内存分配一个xb变量的空间
3堆内存分配空间,创建对象,提供对象地址(对象存在堆内,更具对象大小分配空间,虚拟机觉察对象不用时自动回收 )
4.对对象属性进行初始化
5.调用构造方法对对象初始化 对象被使用前取得对象遥控器,对对象进行改变
6.将对象内存地址赋给给xb指向对象,方法对象的多次使用。.(堆上的对象不被引用会变成无用)
如果要处理联系人的数据更新
应该创建数组将每一个联系人的对象放进去,虽然这样占的内容比较多,但是这样可以随时获取每一个人联系人,如果直接建立多个联系人对象,虽然省内存,但是只有一个数据引用,引用的总是最后一个创建的对象,不能获取以前的联系人
例:创建5个Person对象,保存到数组里,想要实现根据id查找到Person的信息,这时因为要对Person对象进行操纵,所以必须创建另一个类,人员管理类。
对一个类进行操纵是在另一个类中进行的这也就是以后所说的has-a关系。