面向对象程序设计第一部分.docx
- 文档编号:12579015
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:17
- 大小:84.24KB
面向对象程序设计第一部分.docx
《面向对象程序设计第一部分.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计第一部分.docx(17页珍藏版)》请在冰豆网上搜索。
面向对象程序设计第一部分
第四章面向对象程序设计
1、类
2、对象
3、接口
4.1编程语言的几个发展阶段
机器语言如:
汇编语言
过程语言如:
c语言,Fortran语言等
使用面向过程语言,人们只需按着自己的意图来编写各个函数,语言的语法更接近人们的自然语言,所以,习惯上也称过程语言是高级语言.但是,无论那种高级语言编写的源文件,计算机都不能直接执行,因为计算机只能直接识别,执行机器指令.因此,必须把源文件转换成机器指令,然后计算机去执行相应的机器指令.
将高级语言编写的源程序转化成机器指令,经常使用下列两种方式:
(1)编译方式Compilation:
针对当前的机器处理器芯片,将源程序全部翻译成机器指令,称做目标程序,再将目标程序交给计算机执行.
(2)解释方式Interpretation:
这种方式不产生整个的目标程序,而是根据当前的机器处理器芯片,边翻译边执行,翻译一句执行一句.
Java语言的处理方式既不是第1种也不是第二种,Java语言的创造发明之处在于,它不针对特定的CPU芯片进行编译。
Java提供的编译器把源程序编译成称做字节码的一个中间代码.字节码是很接近机器码的文件,可以在提供了Java虚拟机JVM的任何系统上被解释执行.因此,Java本质上是解释执行的程序,当字节码加载到内存之后,再由Java的解释器对字节码按上述2的解释方式执行,即翻译一句,执行一句,不产生整个的机器代码程序,翻译过程如果不出现错误,就一直进行到全部执行完毕,否则将在错误处停止执行.同一个程序,如果是解释执行的,那么它的运行速度通常会比被编译成可执行的机器代码的运行速度慢些.
但是,对Java来说,二者的差别不太大,Java的字节码经过仔细设计,很容易便能使用.JIT即时编译方式编译技术将字节码直接转化成高性能的本地机器码,Sun公司在Java2发行版中提供了这样一个字节码编译器:
---JIT(JustInTime),它是Java虚拟机的一部分.Java运行系统在提供JIT的同时仍具有平台独立性,因而”高效且跨平台”对java来说不再矛盾.
如果把Java的源文件比做”汉语”的话,字节码就相当于”世界语”,世界语不和具体的”国家”有关,只要这个”国家”提供了”翻译”,就可以再快速地把世界语翻译成本地语言.
面向对象编程
随着计算机硬件设备功能的进一步提高,使得基于对象的编程成为可能.基于对象的编程更加符合人的思维模式,编写的程序更加健壮和强大,更重要的是,面向对象编程鼓励创造性的程序设计.
Java是面向对象语言,它的源程序是由若干个类组成,源文件是扩展名为.java的文本文件.
因此,要学习Java编程就必须学会怎样去写类,即怎样用Java的语法去描述一类事物共有的属性和功能.属性通过变量来刻画,功能通过方法来体现,即方法操作属性形成一定的算法来实现一个具体的功能.
类把数据和对数据的操作封装成一个整体.
4.2类
类是组成Java程序的基本要素.类封装了一类对象的状态和方法.类是用来定义对象的模板.
类的实现包括两部分:
类声明和类体.基本格式为:
class类名
{…
类体的内容……
}
class是关键字,用来定义类.”class类名”是类的声明部分,类名必须是合法的Java标识符.两个大括号以及之间的内容是类体.
4.2.1.类声明
以下是两个类声明的例子.
classPeople
{…
}
class植物
{…
}
“classPeople”和”class植物”叫做类声明”People”和”植物”分别是类名。
类命名最好遵守下列习惯:
(1)如果类名使用拉丁字母,那么名字的首写字母使用大写字母,如Hello,Time,People等.
(2)类名最好见名得意,当类名由几个”单词”复合而成时,每个单词的首写字母使用大写。
如BeijingTime,AmericanGame,HelloChina等.
4.2.2.类体
写类的目的是为了描述一类事物共有的属性和功能,描述过程由类体来实现.类声明之后的一对大括号“{”,“}”以及它们之间的内容称做类体,大括号之间的内容称做类体的内容.
类体的内容由两部分构成:
一部分是变量的定义,用来刻画属性;另一部分是方法的定义,用来刻画功能.
下面是一个类名为”梯形”的类,类体内容的变量定义部分定义了4个float类型的变量”上底”,”下底”,”高”和”面积”,方法定义部分定义了两个方法”计算面积”和”修改高”.
class梯形
{
float上底,下底,高,面积。
//变量定义部分.
float计算面积()//方法定义
{
面积=(上底+下底)*高/2.0f。
return面积。
}
void修改高(floath)//方法定义
{
高=h。
}
}
4.2.3.成员变量和局部变量
我们已经知道类体分为两部分:
.
变量定义部分所定义的变量被称为类的成员变量.
在方法体中定义的变量和方法的参数被称为局部变量.
(1)成员变量和局部变量的类型可以是Java中的任何一种数据类型,包括
基本类型:
整型、浮点型、字符型,布尔型。
引用类型:
数组类型和对象。
对象也称作类类型变量。
classPeople
{
intboy。
floata[]。
voidf()
{
booleancool。
Workmanzhangboy。
……
}
}
classWorkman
{
doublex。
Peoplezhiwei。
……
}
People类的成员变量a是浮点数组型变量,cool是局部量,zhangboy是类类型(对象)局部变量,类Workman中的zhiwei是类类型变量,即对象.
classSun
{
intdistance。
intfind()
{
inta=12。
distance=a。
//合法,distance在整个类内有效.
returndistance。
}
voidg()
{
inty。
y=a。
//非法,因为a以失效,而方法g内又没有定义变量a
}
}
(2)成员变量在整个类内都有效,局部变量只在定义它的方法内有效.
成员变量与它在类体中书写的先后位置无关,例如,前述的梯形类也可以写成:
class梯形
{
float上底,面积。
//成员变量的定义.
float计算面积()
{
面积=(上底+下底)*高/2.0f。
return面积。
}
float下底。
//成员变量的定义.
void修改高(floath)//方法定义.
{
高=h。
}
float高。
//成员变量的定义.
}
注意:
但不提倡把成员变量的定义分散地写在方法之间或类体的最后,人们习惯先介绍属性再介绍功能.
(3)成员变量又分为实例成员变量(简称实例变量)和类成员变量(简称类变量)
例如:
classdog
{
floatx。
staticinty。
……
}
其中x是实例变量,而y是类变量.如果成员变量的类型前面加上关键字static,这样的成员变量称做是类变量或静态成员变量.再学习过对象之后,就会知道实例变量和类变量的区别.
(4)如果局部变量的名字与成员变量的名字相同,则成员变量被屏蔽,即这个成员变量在这个方法内暂时失效.
classTom
{
intx=98,y。
voidf()
{intx=3。
y=x。
//y得到的值是3,不是98.如果方法f中没有”intx=3。
”语句,y的值将是98.
}
}
(5)我们已经知道,如果局部变量的名字与成员变量的名字相同,,则成员变量被屏蔽.
这时如果想在该方法内使用成员变量,必须使用关键字this.
class三角形
{
floatsideA,sideB,sideC,lengthSum。
voidsetSide(floatsideA,floatsideB,floatsideC)
{
this.sideA=sideA。
this.sideB=sideB。
this.sideC=sideC。
}
}
this.sideA,this.sideB,this.sideC就分别表示成员变量sideA,sideB,sideC.
4.2.4.方法
我们已经知道一个类的类体由两部分组成:
变量的定义和方法的定义.方法的定义包括两部分:
方法声明和方法体
一般格式为:
方法声明部分
{
方法体的内容
}
(1)方法声明.
最基本的方法声明包括方法名和方法的返回类型,如:
floatarea()
{…
}
方法返回的数据的类型可以是任意的Java数据类型,当一个方法不需要返回数据时,返回类型必须是void.很多的方法声明中都给出方法的参数,参数是用逗号隔开的一些变量声明.方法的参数可以是任意的Java数据类型.
方法的名字必须符合标识符规定.在给方法起名字时应遵守良好的习惯:
名字如果使用拉丁字母,首写字母使用小写.如果由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写。
例如
floatgetTrangleArea()
voidsetCircleRadius(doubleradius)等.
(2)方法体
方法声明之后的一对大括号”{“,”}”以及之间的内容称做方法的方法体.方法体的内容包括局部变量的定义和合法的Java语句。
intgetSum(intn)
{
intsum=0。
for(inti=1。
i<=n。
i++)
{
sum=sum+i。
}
returnsum。
}
方法参数在整个方法内有效,方法内定义的局部变量从它定义的位置之后开始有效.写一个方法和C语言中写一个函数完全类似,只不过在这里称做方法罢了.局部变量的名字必须符合标识符规定,遵守习惯名字如果使用拉丁字母,首写字母使用小写.如果由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写.
4.2.5.方法重载
方法重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同.下面的Area类中getArea方法是一个重载方法.
(1).如何创建对象
Objectobj=newObject()
Object表示的要创建的对象的类型
obj表示的是创建的对象的名称
new是创建对象的关键字
Object()是创建对象所使用的构造方法
(2).如果是用Objectobj表示声明一个对象但是并没有为该对象分配内存空间。
什么是构造方法:
构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,并且不返回任何数据类型
(3).构造方法是创建对象的时候调用的。
(4).每一个类都有一个默认的构造方法(使用javap命令来检查一个.class文件的结构)
格式为:
publicpackagename.ClassName()即共有的无参的
例如:
publicStudent(){
}
(5).如果我们在一个类中定义了一个有参数的构造方法那么默认的构造方法就不存在了。
(6)如果创建了一个对象,并且类中声明的属性没有初始值那么java会为其分配默认值:
对于引用类型为null(空的)
对于基本数据类型int为0、float为0.0、boolean为false、char为空字符。
(7).在一个类中可以有多个构造方法,那么这些方法的参数必须不同(个数不同,类型不同,与参数名字无任何关系)
方法重载:
方法重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同.
方法重载示例:
classArea
{
floatgetArea(floatr)
{
return3.14f*r*r。
}
doublegetArea(floatx,inty)
{
returnx*y
}
floatgetArea(intx,floaty)
{
returnx*y。
}
doublegetArea(floatx,floaty,floatz)
{
return(x*x+y*y+z*z)*2.0。
}
}
注:
方法的返回类型和参数的名字不参与比较,也就是说如果两个方法的名字相同,即使类型不同,也必须保证参数不同.※※※
4.2.6.构造方法
构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,并且不返回任何数据类型.
class梯形
{
float上底,下底,高。
梯形()
{
上底=60。
下底=100。
高=20。
}
梯形(floatx,inty,floath)
{
上底=x。
下底=y。
高=h。
}
}
4.2.7.类方法和实例方法
我们已经知道,成员变量可分为实例变量和类变量.同样,
类中的方法也可分为实例方法和类方法,如
classA
{
inta。
floatmax(floatx,floaty)
{
……
}
staticfloatjerry()
{
……
}
}
类A中的方法jerry和speak是类方法,max是实例方法,即方法声明时,方法类型前面不加关键字static的是实例方法,加static的是类方法.注意static需放在方法的类型的前面.
4.2.8.两个值得注意的问题
(1)对成员变量的操作只能放在方法中,方法可以对成员变量和方法体中自己定义的局部变量进行操作.在定义类的成员变量时可以同时赋予初值,如:
classA
{
inta=12。
floatb=12.56f。
}
但是不可以这样做
classA
{
inta。
floatb。
//a=12。
非法,只能放在方法中
//b=12.56f。
非法
}
但需要注意的是,实例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作.如:
classA
{
inta。
staticintb。
voidf(intx,inty)
{
//a=x。
合法.
//b=y。
合法.
}
staticvoidg(intz)
{
//b=23。
合法.
//a=z。
非法.
}
}
(2)一个类中的方法可以互相调用,实例方法可以调用该类中的其它方法;类中的类方法只能调用该类的类方法,不能调用实例方法.
4.3对象
我们已经说过类是创建对象的模板.当使用一个类创建了一个对象时,我们也说我们给出了这个类的一个实例。
4.3.1.创建对象
创建一个对象包括对象的声明和为对象分配内存两个步骤.
(1)、对象的声明.
一般格式为:
类的名字对象名字;
如:
PeoplezhangPing
这里People是一个类的名字,zhangPing是我们声明的对象的名字.
(2)、为声明的对象分配内存.
使用new运算符和类的构造方法为声明的对象分配内存,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的)如:
zhangPing=newPeople()。
以下是两个详细的例子。
classXiyoujiRenwu
{
floatheight,weight。
Stringhead,ear,hand,foot,mouth。
voidspeak(Strings)
{
System.out.println(s)。
}
}
classA
{
publicstaticvoidmain(Stringargs[])
{
XiyoujiRenwuzhubajie。
//声明对象。
zhubajie=newXiyoujiRenwu()。
//为对象分配内存,使用new
运算符和默认的构造方法。
}
}
-----------------------------------------
classPoint
{
intx,y。
Point(inta,intb)
{
x=a。
y=b。
}
}
publicclassA
{
publicstaticvoidmain(Stringargs[])
{
Pointp1,p2。
//声明对象p1和p2。
p1=newPoint(10,10)。
//为对象分配内存,使用new和类中的构造方法。
p2=newPoint(23,35)。
//为对象分配内存,使用new和类中的构造方法。
}
}
----------------------------------------------------------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 第一 部分