前言:整理这份资料的目的是为了帮助我的同学能够更直观的理解面向对象的编程。让后来者能够少走一些弯路。但其中不免有许多漏洞及错误,也还请前辈提出宝贵的更改意见,毕竟交流会让我们不断的进步。
技术是日新月异的,他不会等待你的成长。技术要拿出来于别人交流,自己学是自己主观意识上的理解,有对有错!交流会让进步变得更快。我认为如果计算机的体系结构不发生革命性的变化,我们现在所应用的程序语言也就百变不离奇踪了!学编程学的是什么?思想!精通一门编程语言(最好是面向对象的语言)后再去搞其他的编程语言,你会发现过程是如此的行云流水!为什么?你已经把编程的思想掌握了,再去学其他的,无非是学习一种新的语法格式了。
我在这里并不是和你讨论怎么去用C++或JAVA,也不是和你讨论怎么去学他们,我要和你讨论的是怎么去理解面向对象。其中主要会涉及到“类、对象、继承、属性、方法、静态、重载、隐藏、重构、声明、定义、初始化、赋值等”其中有许多相关技术我只会一代而过,让你有一种到此一游的意味我就达到目的了,而更详细的技术内幕,就请参考其他相关书籍而深入研究吧!因为我只是在和你探讨如何去更好的理解面向对象!
如何去提高效率?重复使用资源,把别人的东西拿来就用。这是很不错的主意!而对于你来说,最大的资源就是信心以及积极性!好,打起精神来,让我们一同到面向对象的编程中去寻幽访胜吧!
注:文章中所有程序实例我都使用JAVA写的,当然在C++中也就大同小异了了,不同的地方我会指出!
注:文章中的正文文字用黑色,说明文字用蓝色,强调文字用橙色,批改文字用红色!
正文:
1.基本概念:
1.1 类与对象的初探
要我说,无论是面向过程的语言也好,面向对象的语言也罢,我首先要给他讲的都是类和对象!--------“这个世界是由什么组成的?”这个问题如果让不同的人来回答会得到不同的答案。如果是一个化学家,他也许会告诉你“还用问嘛?这个世界是由分子、原子、离子等等的化学物质组成的”。如果是一个画家呢?他也许会告诉你,“这个世界是由不同的颜色所组成的”。……呵呵,众说纷纭吧!但如果让一个分类学家来考虑问题就有趣的多了,他会告诉你“这个世界是由不同类型的物与事所构成的”好!作为面向对象的程序员来说,我们要站在分类学家的角度去考虑问题!是的,这个世界是由动物、植物等组成的。动物又分为单细胞动物、多细胞动物、哺乳动物等等,哺乳动物又分为人、大象、老虎……就这样的分下去了!
现在,站在抽象的角度,我们给“类”下个定义吧!我的意思是,站在抽象的角度,你回答我“什么是人类?”首先让我们来看看人类所具有的一些特征,这个特征包括属性(一些参数,数值)以及方法(一些行为,他能干什么!)。每个人都有身高、体重、年龄、血型等等一些属性。人会劳动、人都会直立行走、人都会用自己的头脑去创造工具等等这些方法!人之所以能区别于其它类型的动物,是因为每个人都具有人这个群体的属性与方法。“人类”只是一个抽象的概念,它仅仅是一个概念,它是不存在的实体!但是所有具备“人类”这个群体的属性与方法的对象都叫人!这个对象“人”是实际存在的实体!每个人都是人这个群体的一个对象。老虎为什么不是人?因为它不具备人这个群体的属性与方法,老虎不会直立行走,不会使用工具等等!所以说老虎不是人!
由此可见-------类描述了一组有相同特性(属性)和相同行为(方法)的对象。在程序中,类实际上就是数据类型!例如:整数,小数等等。整数也有一组特性和行为。面向过程的语言与面相对象的语言的区别就在于,面向过程的语言不允许程序员自己定义数据类型,而只能使用程序中内置的数据类型!而为了模拟真实世界,为了更好的解决问题,往往我们需要创建解决问题所必需的数据类型!面向对象编程为我们提供了解决方案。
1.2 内置数据类型与函数:
计算机程序在存储数据时必须跟踪3个基本属性为:
1. 信息存储在何处;
2. 存储的值是多少;
3. 存储的信息是什么类型的;
让我们来看看编程语言的内置数据类型都有哪些!(呵呵,这个不大好说,因为每门语言都有自己独特的数据类型,但这毕竟是少数,比如在JAVA中有byte类型的数据,而在C++中就没有,希望你能举一反三!)比如整数”int ”,浮点类型的数据”float”!字符串”String”,以及数组还有结构体等等。然而在写程序的时候,根据需要我们会创建一个类型的变量或常量,例如:由于我们需要创建一个整形的变量i为5,我们就可以这样做,int i = 5;而根据需要我很有可能改变i的值,也就是从新给它赋值,比如让它等与6,就可以在所需的地方改成i = 6;由此我们知道,在“值”上可以发生变化的量就叫变量。不会发生变化的量就叫做常量了,在C++中用count关键字来声明,而在JAVA中则使用final关键字来声明。由于不同语言的声明格式不一样,这里就不做一一介绍了,详细的内容清查阅相关书籍!
在这里我们主要讨论一下函数,我们可以把函数想象成一个“实现某种特定功能的黑匣子”-------这个功能是由你来设定的,举个例子来说:现在我问你“2+3等于多少”?我相信你能很快的回答我等于5。让我们来分析分析这句话包含什么信息!首先我要把你的大脑想象成是一个黑匣子,我并不知道也没有必要知道你的大脑是如何工作的(也就是怎么运算的),我关心的只是我传给你的是什么信息?你对信息做了哪些处理? 以及你返回给我的是什么信息?需要提醒你一下的是每个方法都会返回一个信息给调用者的,除了构造函数外(稍候我会作详细的介绍)。我现在需要把自己当作是一名程序员,而你呢?当然就是计算机了!计算即可没有人那么聪明,它只会按事先约好的特定的格式运行,我想让它具有如上所述的功能,我就要先定义这个黑匣子!首先我要告诉这个黑匣子会有两个整数值给你(这就是所谓的参数,是程序员需要给黑匣子的信息),然后就要定义这个黑匣子内部实现这两个整数相加的运算(这就是黑匣子对数据所做的加工,根据需要,你可以做任何的加工。)。最后再标注它返回给我一个同样是整型的数值(这是黑匣子返回给程序员的信息)。一个函数就这样定义完了,让我们来看看书写格式:
int addnum(int x,int y){
return x+y;
}
具体的含义是这样的:
int /*返回值类型*/ addnum /*方法(黑匣子)名称*/ (int x,int y/*传入的参数*/){<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
return x+y; /*内部是想方法(实现相加运算,)并用return返回给调用者结果*/
}
首先请注意上明的“return”语句!return 关键字的含义是向调用者返回紧跟在它后面的信息!就像上面一样,因为我问你,你才会回答我,如果我不问你,你就不用回答我的!在计算机中也一样,定义好这个函数在哪里调用呢?我只能告诉你,哪里需要就在哪里调用!当然,你可以根据需要去更改参数、返回值以及内部实现,具体到如何定义如何调媚阒缓萌ゲ慰枷喙氐淖柿狭耍≡谡饫镂抑皇歉阋桓鏊枷耄?/SPAN>
有时你会遇到这样的问题,我让你记住,我的年龄是20岁!从字面上理解,你并没有给我返回信息!然而事实上,你确实给我返回了信息,信息的内容是“无信息,也就是无返回值类型void”。具体的程序如下:
int myAge = 0;
int a=20;
void remAge(int a){
myAge=a;
}
具体的函数说明如下:
int myAge =0; //定义并初始化我的年龄为0;
int a=20; /*定义变量a等于20*/
void /*返回值类型为无返回值类型*/ remAge /*函数名称*/(int a /*传入的参数*/){
myAge=a; //内部实现方法,注意,没有return返回!!!
}
关于函数的话题还有很多很多,这里就不一一介绍了,我的目的是让你知道函数是怎么一会事儿!为下面的讨论作铺垫!
1.3 指针以及引用:
指针及引用是在C++中有的,JAVA中没有。JAVA中取消了对内存的操作,随之而来的事也取消了操作符重载的操作。不过在稍候我还是会介绍一些操作符重载的功能等。引用主要还是用在函数参数的传递上。所以我在这里就不做过多的介绍了。他们很实用,有兴趣的同学可以参阅C++相关书籍。
.4 运算符及控制语句:
还是自己看看相关书籍吧,这里就不再熬述了!
2.深入探讨面向对象:
2.1“类型”的内部细节:
有了上面的知识,我们现在就可以深入的挖掘类的内部实现了。所有的知识点我都会围绕着类与对象展开,在此之前,我希望你能够确信对以上所介绍的基本内容已完全掌握了!
是的,面向对象的编程语言最大的特色就是可以编写自己所需的数据类型,以更好的解决问题。我想我必须要帮你搞清楚“类,对象,属性,方法它们之间的关系”!就像我前面所说的,人这个“类”是什么也做不了的,因为“人类”只是一个抽象的概念,它不是实实在在的“东西”,而这个“东西”就是所谓的对象。只有人这个“对象”才能去工作。而类呢?类是对象的描述!对象从类中产生出来!此时,对象具有类所描述的所有的属性以及方法。-------一定要理解这句话!!!
也许你已经有些不知所措了,没关系!好好的回味一下,我再举个例子!例如电视机,电视机都有工作原理图,那么什么叫电视机呢?只要它能够实现工作原理图的所有功能的物体,我们都叫它电视机。你想想是不是这么一回事儿?可是,电视机原理图是不能工作的,也就是这个原理图不能收看节目,只有电视机这个“实体——即所谓的对象”才能收看节目,也就是说,从类生成出对象之后才算得上是真正的有意义!才能开始工作。此时,电视机拥有电视原理图所描述的所有的属性及方法!明白了吧,呵呵!
我先前介绍过,类是属性与方法的集合。而这些属性与方法可以被声明为私有的(private),公共的(public)或是受保护(protected)的,他们描述了对类成员的访问控制。下面我分别做一下介绍:
1. 公共的(public):把变量声明为公共类型的之后,那么就可以通过对象来直接访问,一切都是暴露无遗的!也就是说,你的信用卡密码别人也能够直接得到。
2. 私有的(private):如果把变量声明为私有的情况就好多了,想要得到我的信用卡密码,对象必须要调用专用的方法才能够得到。
3. 受保护的(protected):介绍继承时再讨论。
4. 默认控制访问符(friendly)://JAVA中有而C++中没有。
为了实现数据的封装,提高数据的安全性,我们一般会把类的属性声明为私有的,而把类的方法声明为公共的。这样,对象能够直接调用类中定义的所有方法,当对象想要修改或得到自己的属性的时候就必须要调用以定义好的专用的方法才能够实现。你想想,你会把你的信用卡密码公布出来嘛?呵呵!所以,我们提倡的是:“对象调方法,方法改属性”;
2.2通过实例看内存分配:
说了这么多,让我们来看一个实例吧!比如:现在我们要编写某家公司员工管理系统,你认为最合适的数据类型是什么?我认为是员工个人!但是在面向过程的语言中,这样做是不允许的,因为它只能使用语言中的内部数据类型!而员工不在这个内部数据类型之内!也许有人会说可以用C语言中的struct,好注意!毕竟它是类的基础!如果你以前是一名面C或B的程序员,请你忘掉这些,让我们一起看看如何用类来实现这一切吧!
某家公司的员工是人类的一个特殊群体,它除了具备人类的所有特性与方法外,它还有额外的特性与方法,比如她有她的工资、信用卡密码、作息时间等等,这些特性以及工作内容,工作量等等这些方法。而在计算机中我们该如何定义这个类呢?下面我将写出它的格式,让你看看在计算机中它是张什么样子的!
/*在此我需要再次声明的是,我用的是JAVA格式,在语法格式上它与C++大不相同!许多细节以及内部操作都有诸多区别,而在思想上确实大同小异的*/
//employee.java
public class employee{
private String name; //员工姓名
private int age; //员工年龄
private char sex; //员工性别
private float emolument; //员工薪水
private boolean lunch; //员工午餐
//……等等
public void heater(){ //这个方法是用来加工员工的午餐
lunch = true;
}
public void setName(String a){ //这个方法是修改员工的姓名
name= a;
}
public String getName(){ //这个方法是得到员工的姓名
return name;
}
//……等等
}
这样我们就定义完了我们所需要的数据类型。现在,让我们来看看它能够干什么以及怎么工作!
我想要做的是,工作室里有一个光杆司令叫“jingwei”,我修改它的名字后对对它进行输出,看看我是怎么做的吧!
注意:请仔细观察对象是如何调用方法的,它使用了“.”操作符!事实上是这样的,对象调用公共的属性或方法时就会使用“.”操作符。
然而在C++中,如果定义一个同类型的指针,该指针调用此对象的方法时,就会使用“->”操作符。更详细的内容清参阅相关书籍了!
//workstation.java
import java.awt.Graphics;
import java.applet.Applet;
public class workstation extends Applet{
private employee jingwei ; //对象的声明,此时并不分配内存!
public void init(){
jingwei = new employee(); /*此时创建对象会调用构造函数,稍候介绍*/
jingwei.setName(癹w”); //设置我的名字
}
public void paint(Graphics g){
g.drawString("my age is "+jingwei.getName(),10,10);//显示我的年龄
}
}
输出结果是:
my name is jw
这串字符串是在输出窗口的x坐标轴为10 px , y坐标轴为10 px的位置。
我现在要做的是,把上面的程序做个大解剖,让你能够看清楚它到底是怎么一回事儿!(我可不时带你去看里面的汇编,呵呵,那个我也不会:)
首先还是来看看我们自定义的数据类型employee,在应用的时候它和int类型的数据没什么两样,一样的需要创建变量(对象),只不过前者是咱自己定义的,而后这是它内置的。Employee这个类中有许多属性,也有许多方法。而此时,我们不能直接用我们所创建出来的对象调用它的属性进行修改。因为它是private受保护类型的!我要想修改我的姓名我就要用对象调用setName()这个方法,而我想得到我的姓名就要调用getName()这个方法。我们完全是按照航线来行走的,这个航线就是“对象调方法,方法改属性”
好的,我真的相信你已经明白了这是怎么一回事儿了!呵呵!仰起航帆,继续前行!
现在让我们一起来看看workstation这个类。这是个主类,和C++中的main()函数的味道差不多。其中,在JAVA中,一个文件只允许有而且必须有一个主类,这个主类用public来声明!他就跟C++中必须要有一个main()函数是一样的。
让我们来看看这个类中的第一条语句!private employee jingwei ;这条语句的作用是声明一个employee的对象jingwei(在C++中就不用声明了)。我想要和你说的是“声明”与“定义”之间的区别。声明只是告诉计算机将要有这样的一个变量(对象),在内存中它并不为这个变量(对象)分配内存!而只有在定义的时候才会给这个变量(对象)分配内存。(需要说明一下的是init()方法是完成初始化操作的,在此处定义对象,为对象分配内存。start()方法用来启动浏览器的主线程,paint()方法来显示Apple的界面。这些是Applet程序所需的,至于Application程序就不需要了,当然了,C++中也不需要他们。关于他们的详细内容清参阅相关书籍)
紧接着就开始定一个对象了,对jingwei这个对象进行操作才会有实际的意义。千万不要有这种想法:“试图对类进行操作!”就像前面我说的,电视机原理不能看电视一样!这是毫无意义的!看这条语句jingwei = new employee();它的意思就是定义一个employee类型的对象jingwei。此时,我想告诉你的是:“jingwei这个对想拥有了些什么”。它拥有了类所描述的所有的属性及方法。下面我一一给你列出来:
/*所有的employee对象都拥有这些属性。每创建一个对象就会从新分配一块内存来存放相应对象的这些属性。我的意思是每个对象都有自己“独特”的一份*/
private String name; //员ば彰?/SPAN>
private int age; //员工年龄
private char sex; //员工性别
private float emolument; //员工薪水
private boolean lunch; //员工午餐
/*所有的employee对象都拥有这些方法。但在内存中只有一份*/
public void heater(){ //这个方法是用来加工员工的午餐
lunch = true;
}
public void setName(String a){ //这个方法是修改员工的姓名
name= a;
}
public String getName(){ //这个方法是得到员工的姓名
return name;
}
/*但是,实际上在创建jingwei这个对象时计算机只给这个对象的所有的属性分配了内存,而并没有给方法分配内存。方法只有一个,是属于所有的对象的,所以无论创建了多少个对象,计算机只会为一个方法分配一块内存。*/
我想我还是举个例子吧,不然你非晕倒不可。呵呵!
看我这条语句“private boolean lunch;”公司不管午餐,每个员工都需要带饭。我们现在这样想,公司的空间是所有的内存容量,你的办公桌就是计算机中的内存中的一部分(每个员工都有一份,是在创建对象时分配的)。你把午饭带到了公司,放在了你的办公桌上。“午饭”占据了你的办公桌的一角(占了你自己“对象”的一块内存容量)。这份午饭只属于你自己,同样别人的也只属于她自己!所以每个员工(对象)都需要一快空间(内存)来存放自己的午餐(属性)。在计算机中也是这样的,每创建一个对象,就会在内存中从新分配一块内存来放“午餐——lunch”这个属性(对象所拥有的所有的属性)。
计算机只会为对象的属性分配内存。因为每个对象的都不一样!就像你往公司带的午饭和我往公司带的午饭不一样是一个道理!但方法就不同了。早晨带的饭中午就凉了,你需要用微波炉来加热。微波炉可不用你带,公司就有(只占公司的一块空间),它放在了午餐桌上。你想想,微波炉属于谁的?它属于所有员工的!因为每个员工都可以用它。而不必每个员工都带一份。由此可见,每个员工(对象)都有一份午饭(属性),但所有的员工(对象)只一个微波炉(方法)。所有的员工(对象)都可以通过这个微波炉(方法)来改变自己午餐(属性)的冷热状态。殊途同归!在计算机中也就是这样,方法只有一份,供所有的对象使用!而属性是每个对象一份,因为每个对象的都不一样。别和我说你还不明白,不然我会撞墙的,呵呵:)
分享到:
相关推荐
面向对象编程思想 面向对象编程思想是当前计算机界关心的重点,它是 90 年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用...
Java面向对象编程思想 Java 面向对象编程思想是 Java 编程语言的核心思想之一,通过封装、继承和多态三个特征,实现代码的重用和可维护性。 一、封装 封装是 Java 面向对象编程的三大特征之一,通过 Java 的类来...
### Delphi面向对象编程思想 #### 一、Delphi与面向对象编程简介 Delphi是一种基于Object Pascal的集成开发环境(IDE),它以其强大的可视化工具和高效的编译器而闻名。Delphi支持面向对象编程(OOP)的概念,并且...
### Delphi面向对象编程思想 在探讨Delphi的面向对象编程(Object-Oriented Programming,简称OOP)思想之前,我们需要明确几个概念:面向对象编程是一种编程范式,它使用“对象”来设计软件和实现计算机程序。这些...
《Delphi面向对象编程思想刘艺》是一本深入讲解Delphi编程中面向对象技术的专业书籍。作者刘艺以其丰富的经验和深厚的理论功底,系统地阐述了面向对象编程的基本概念、原则以及在Delphi中的实际应用。这本书对于想要...
面向对象编程(Object-Oriented Programming,简称OOP)源自于面向过程编程,但在很多方面超越了它,尤其是在大型项目开发中展现出强大的优势。 在面向对象编程中,我们关注的是“对象”而不是过程。对象是类的实例...
其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机执行Java程序的原理、在实际项目中的运用、设计模式和性能优化技巧。同时,本书还贯穿了Sun公司的SCJP(Sun Cer......
刘艺老师的"面向对象编程思想"课程或资料,很可能详细讲解了这种编程方式的核心理念与实践技巧。 在Delphi这一集成开发环境中,OOP的应用尤其广泛。Delphi以其高效的VCL(Visual Component Library)组件库和强大的...
面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用的编程范式,它以对象为核心,将数据和操作数据的方法封装在一起,通过类和对象来构建复杂的系统。这种编程方式强调数据抽象、封装、继承和多态...
《Delphi面向对象编程思想》是一本专注于介绍如何在Delphi环境下运用面向对象编程技术的专业书籍。这本书由刘艺撰写,旨在帮助读者深入理解和熟练掌握面向对象编程的基本概念、原则和技巧,以及如何在实际的Delphi...
《Delphi面向对象编程思想》是由刘艺编著的一本深入探讨面向对象编程在Delphi环境中的应用的书籍。这本书因其深入浅出的讲解和实用的示例,曾深受程序员们的喜爱,虽然现在已经绝版,但其PDF版本仍然在开发者之间...
Java 的核心是面向对象编程.所有的java程序都是面向对象的。 以前总听老师说c语言是面向过程的,c++和java是面向对象的,这些糊涂老师却从来不说明何为面向过程,何为面向对象,搞得我一直对此稀里糊涂。 最近看了...
《Delphi面向对象编程思想》是一本专注于介绍如何在Delphi环境下运用面向对象编程的书籍。面向对象编程(Object-Oriented Programming,OOP)是一种强大的软件开发方法,它通过将数据和操作数据的方法封装在对象中,...
面向对象编程是计算机语言的一种先进的编程模式,在工业控制系统的PLC程序中也可以采用这种设计思想,虽然我们无法实现面向对象的很多特点如“继承”,甚至于它根本就不具备面向对象编程语言的特点,但面向对象编程...
《Delphi面向对象编程思想》是一本深入探讨Delphi编程技术的书籍,其核心主题是面向对象编程(Object-Oriented Programming, OOP)。在 Delphi 中,面向对象编程是构建强大、可维护和可扩展软件系统的关键。下面将...
《Delphi面向对象编程思想》随书源码.rar《Delphi面向对象编程思想》随书源码.rar《Delphi面向对象编程思想》随书源码.rar《Delphi面向对象编程思想》随书源码.rar《Delphi面向对象编程思想》随书源码.rar《Delphi...
《Delphi面向对象编程思想》是一本专注于介绍如何在Delphi环境下运用面向对象编程的书籍。面向对象编程(Object-Oriented Programming,OOP)是一种软件设计范式,它基于“对象”的概念,将数据和操作这些数据的方法...
### JAVA面向对象编程思想 #### 一、面向对象的基本概念 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它通过模拟现实世界中的对象及其交互方式来构建软件系统。Java作为一种典型的面向...
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它的核心思想是将现实世界的实体抽象成计算机程序中的对象,通过对象之间的交互来完成任务。C#是一种完全支持面向对象编程的语言,它强调“一切皆...