1、面向过程的思想和面向对象的思想html
2、简单理解面向对象java
3、面向对象的设计思想编程
4、对象和类的概念学习
5、如何抽象出一个类?spa
6、类(对象)之间的关系设计
7、Java与面向对象code
8、为何使用面向对象编程?htm
面向对象和面向过程的思想有着本质上的区别, 做为面向对象的思惟来讲,当你拿到一个问题时,你分析这个问题再也不是第一步先作什么,第二步再作什么,这是面向过程的思惟,你应该分析这个问题里面有哪些类和对象,这是第一点,而后再分析这些类和对象应该具备哪些属性和方法。这是第二点。最后分析类和类之间具体有什么关系,这是第三点。对象
面向对象有一个很是重要的设计思惟:合适的方法应该出如今合适的类里面blog
就是在程序里面首先分解出来的应该是注意再也不是一步一步的过程了,而是首先考虑在这个问题域里面或者程序里面应该具备有哪些对象,因此从如今开始考虑任何问题脑子里不要再想着我实现这件事我第一步应该干什么,第二步应该干什么,若是这样想,那就是面向过程的思惟了。面向对象的思惟是,当我碰到这个问题域的时候,碰到这个程序的时候,我首先应该把这个问题里有哪些对象,对象与对象之间有什么关系抽象出来。
面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽量运用人类的天然思惟方式。
面向对象更增强调运用人类在平常生活的逻辑思惟中常常采用的思想方法与原则,如抽象、分类,继承、聚合、多态等。
人在思考的时候,首先眼睛里看到的是一个一个的对象。
对象是用于计算机语言对问题域中事物的描述,对象经过“属性(attribute)”和“方法(method)”来分别对应事物所具备的静态属性和动态属性。
类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具备的静态属性和动态属性
类能够当作一类对象的模板,对象能够当作该类的一个具体实例。
eg.什么叫瓶子?
瓶子的定义:具备某些类特征的东西就是瓶子,比分说什么样的形状,比方说有个口,能倒水,能装水,通常有个盖等等。给瓶子下定义的过程,其实就是把瓶子里的某些东西抽象出来了,因此瓶子在这里是叫作一类事物的一个抽象,在你脑子里有瓶子的概念,可瓶子的概念在你脑子里究竟是什么呢?瓶子的概念在你脑子里叫作一类事物的一个抽象。怎么抽象的呢?你每每抽象的是这两个方面:第一个方面咱们叫它静态的属性,瓶子应该具备哪些特征,比分说瓶子应有个口,这是它的具备的一个静态属性,瓶子通常有一个盖,这也是它的具备一个静态属性,除此以外,你还可能给它总结动态的属性,什么动态的属性呢?比放说瓶子能倒水,这是它的动态属性。瓶子这个概念在你脑子里若是你细细的思惟的话,其实你给它作了两方面的总结,一方面是静态的,一方面是动态的。反映到JAVA的类上,一个就是成员变量(静态属性),一个就是方法(动态属性)方法是能够执行的,能够动的。成员变量是某一个类的静态属性。因此你脑子里瓶子的概念其实是一类事物的一个抽象,这种东西咱们叫它类,椅子是类,桌子是类,学生是类。什么是对象呢?这一类事物的具体的某个实例就叫作对象。因此一类事物的具体的某一个东西,符合这类事物具体的特征的某个东西就叫作对象。瓶子是一个类,某个瓶子就是瓶子这个类里面的一个对象。
有两个方面,一方面是它的静态属性,另外一方面是它的动态属性。反映到JAVA里面的类怎么包装它呢?一方面成员变量,另外一方面是方法。
eg.职员这个类该怎么抽象出来?也是从两个方面,一方面是它的静态属性,另外一方面它的动态属性
职员有哪些属性呢?有姓名,年龄,目前工资数额等属性,他有哪些方法呢?让这个职员来显示姓名,显示年龄,修改姓名,领取工资。固然显示姓名,显示年龄,修改姓名,领取工资这些也可让别人来作,但面向对象的设计思惟是最合适的方法应该出如今最合适的类里面。显示姓名,显示年龄,修改姓名,领取工资由谁来作更合适呢,那就是职员本身最合适。因此这些方法应该出如今职员这个类里面。
对于类来讲,它有一些属性或者称为成员变量,之后说属性或者成员变量指的是同一回事。具体的对象他有没有相关的一些属性或者叫成员变量呢?有,每个人都有一份,只不过是取值不一样而已。如从职员这个类实例化出来的两个职员:职员A和职员B,他们都有姓名,年龄,目前工资数额这些属性,但他们的名字,年龄,领取的工资数额都不同。这样就能把职员A和职员B区分开来了,正是由于他们的属性值不同,因此这个对象才能和另外的对象区分开来,因此经过属性是能够区分两个对象的。猫是一个类,这只猫是一个对象,这只猫和另一只猫该怎么区分开来呢?那就得看你的猫这个类是怎么定义的了,猫有猫毛,毛有颜色。OK,这只猫是黑猫,另外一只猫是白猫,这样经过猫毛的颜色区分开来了。若是只定义一个,如捉老鼠,白猫也能捉,黑猫也能捉,这样就没办法区分出黑猫和白猫了,因此根据方法是没办法区分两个对象的。因此每一个对象都有本身的属性,属性值和另一个对象通常是不同的。
必定要区分类和对象,什么叫作类?什么叫作对象?类是一类事物的一个抽象,具备共同特征的一类事物的一个抽象。对象是这个类具体的某一个实例,因此之后说实例(instance)或者说对象(object)指的是同一回事。
类和类之间是有关系的,如学生和老师这两个类,老师能够教学生,学生能够向老师学习。这就是他们之间的关系。关系和关系之间是不一样的,你和你老婆的关系和你和你其余女友的关系是不能混为一谈的。关系最弱的一种关系叫关联关系。关联关系反应到代码上每每是一个类的方法里面的参数是另外一个类的具体的某一个对象,好比教授教研究生,教哪一个研究生,教是教授这个类里面的一个方法,某个研究生是研究生这个类里面的一个具体的对象。关联关系是最弱的一种关系,我们两个类之间有关系,或者两个对象之间有关系,但关系不是很紧密。
继承关系封装了这样一种逻辑:“XX是一种XX”,只要这东西能说通了,就能够考虑用继承关系来封装它。如:游泳运动员从运动员继承,游泳运动员是一种运动员,这能说得通,因此游泳运动员就是从运动员继承过来的,游泳运动员和运动员就是一种继承关系。学生是一我的,学生从人继承,老师是一我的,老师也从人继承,学生是一种老师,这说不通,因此学生和老师就不存在继承关系。因此未来作设计的时候要分清继承关系很简单,你只要说通这么一句话:“XX是一种XX”。OK,那他们之间就是继承关系。篮球运动员是一种球类运动员,这说得通,因此篮球运动员从球类运动员继承,这样继承颇有可能会产生一棵继承树,运动员派生出来,派生出来的意思是游泳运动员这个类、球类运动员这个类、射击运动员类从它继承,至关于运动员派生出来了这些个不一样的运动员,包括游泳的,球类的,射击的。球类的再派生足球的,篮球的,排球的。这就是一棵继承树,不过这棵树是比较理想化的状况,只有一个根节点。但实际当中,咱们真实世界当中的继承关系不必定只从一个类继承,一个类可能从多个类继承过来,好比说:金丝猴从动物这个类继承,这很正常,但我还有另一个专门的类:“应该受到保护的东西”,这也是一个类,金丝猴应该受到保护,因此金丝猴是一种应该受到保护的东西。因此金丝猴从“应该受到保护的东西”这个类继承过来。因此在现实状况当中,一个类完彻底全有可能从多个不一样的类继承,C++正是由于想封装这种继承关系,因此C++存在多重继承。
什么是聚合?聚合就是一个总体与部分的关系。咱们说“XX是XX的一部分”,只要说得通,那么他们之间的关系就是聚合关系,队长是球队的一部分,队员是球队的一部分。因此队长和球队是聚合关系,队员和球队也是聚合关系。脑壳是人的以部分,身体和胳膊也是人的一部分,所以脑壳,身体和胳膊与人都是聚合关系。聚合关系分得再细一点的话就能够分红汇集关系和组合关系,好比球队、队长,队员,这三者是汇集关系,假如这个队长既是足球的队长,同时也是篮球的队长,一我的分属两个不一样的球队,这是能够的,球队与队长之间没有我离不了你,你离不了我这种状况,因此若是分得更细的话,这种就叫作汇集关系。还有一种状况叫组合,组合说的是我们俩密不可分,我是你必不可少的一部分。一我的的脑壳不可能既属于你又属于别人,身体也同样,不可能既属于你又属于别人。因此你的身体,脑壳和你是密不可分的,这是一种更加严格的聚合关系,专门给它取了个名字叫组合。
做为父类来讲,我以为我应该具备这样一个方法,但我不知道怎么去实现,谁去实现,个人子类去实现,这就是实现关系。和实现关系息息相关的还有一种关系叫多态。
对象和类是分不开的,必须首先定义类才能有对象。首先定义方法才能调用。对象是JAVA里面的核心,作任何东西你首先都得给我造出一个对象才能作。静态属性简称属性,也叫成员变量,之后说属性或者说成员变量它们指的都是同一回事。
整个类能够看做是静态的属性还有方法他们之间的一个综合。怎么抽象出一个类的概念,仍是那句话,你必须抽象出两个方面来,第一方面是看他们的静态属性,他们有哪些成员变量,第二方面是看他们的有哪些方法。
写JAVA程序时,咱们一上来写的就是public class(声明一个类),在这个class里面咱们写的是成员变量和方法。
每个JAVA里面的class(类)都对应了咱们现实生活中某一类事物的一个抽象。好比说要在JAVA里面封装一只狗,具体怎么封装,如何写代码,代码以下:
1 package cn.javastudy.summary; 2 /** 3 * 一类事物封装到JAVA里面首先得写class,定义这个类,类名是什么能够本身取。 4 * 这里把类名叫作Dog 5 */ 6 public class Dog { 7 /** 8 * 接下来就是写这个狗这个类的属性或者叫成员变量, 9 * 好比说狗这个类的毛的颜色,怎么定义这个属性呢, 10 * 首先得定义毛的一个类型,如使用int来定义毛的颜色类型 11 */ 12 int furcolor; //定义属性:毛的颜色 13 float height; //定义属性:狗的高度 14 float weight; //定义属性:狗的体重 15 16 /** 17 * 狗的颜色,高度,体重这些属性定义完了,接下来要定义的就是方法了。 18 * 如写一个CatchMouse()方法,捉老鼠的方法。 19 * CatchMouse这个方法里面有一个对象类型的参数,捉哪一只老鼠,这个对象参数是属于Mouse这个类的 20 * @param m 21 */ 22 void CatchMouse(Mouse m){ 23 //在方法体内写捉老鼠这个过程,怎么捉,跑着捉,走着捉 24 System.out.println("我捉到老鼠了,汪汪!,老鼠要尖叫了!"); 25 /** 26 * 老鼠尖叫一声,表示被狗咬到了,咬到了能不叫吗,很天然而然地想到, 27 * 尖叫(scream())这个方法是属于Mouse这个类里面的某一个方法。 28 * 老鼠本身调用它,让它本身尖叫。这就是面向对象的思惟。 29 */ 30 m.scream(); 31 } 32 33 public static void main(String[] args) { 34 Dog d = new Dog();//首先用new关键字建立一只狗 35 Mouse m=new Mouse();//造出一只老鼠。 36 d.CatchMouse(m);//而后用这只狗去抓老鼠,让狗调用CatchMouse()方法去捉某只老鼠。 37 } 38 }
1 package cn.javastudy.summary; 2 /** 3 * 封装的老鼠类 4 */ 5 public class Mouse { 6 /** 7 * 老鼠本身有一个发出尖叫的方法 8 * 当被狗咬到时就会发出尖叫 9 */ 10 public void scream() { 11 System.out.println("我被狗咬到了,好痛啊!"); 12 } 13 14 }
从这个意义上来说,JAVA里面的每定义一个类实际上就至关于一种新的数据类型。就跟int ,float, String等同样,不过是一种新定义的类型而已。
面向对象编程:一组对象互相配合经过沟通完成特定功能
作软件苦苦追求的一种境界是可重用性(reusable),可扩展性。若是是面向过程,通常状况是属性和方法它们是分开的,他们不是聚合的关系,不是合在一块儿的,这样要复用起来比较麻烦,复用的层次只是局限于方法这个层次上,而面向对象则不一样,它是把属性和方法综合在一个里面。综合在一块儿复用的时候是整个对象进行复用。因此面向对象和面向过程相比,前者更加容易让咱们达到可重用性。