类与对象的基本概念_第1页
类与对象的基本概念_第2页
类与对象的基本概念_第3页
类与对象的基本概念_第4页
类与对象的基本概念_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类与对象的基本概念2、1编程语言得几个发展阶段1、机器语言如:汇编语言面向机器得语言,低级语言,就是计算机处理信息得早期语言特点:程序中得指令都就是由0,1组成得序列,称为“机器指令”优点:深入理解CPU、寄存器等硬件系统原理单片机等硬件系统编程2、过程语言如:C语言、Fortran语言面向过程得语言,高级语言,接近人得“自然语言”特点:程序通常由若干“块”(过程/函数)组成,每个块负责完成独立得功能采用面向过程得编程思想:程序=算法+数据优点:流程清晰执行效率比面向对象程序高适于编写数据处理类程序及较小程序,如:算法。缺点:处理复杂问题时,逻辑混乱可维护性较差3、面向对象语言如:Java语言、C++语言高级语言,更加符合人得思维模式特点:封装继承多态采用面向对象得编程思想:“一切都就是对象”程序=对象+消息优点:高可维护性、可扩展性、可复用性、健壮性适于编写复杂得、较大得程序缺点:执行效率较低封装将数据和对数据得操作封装在一个对象中,并且对对象得使用者隐藏数据得实现过程例如:卡车、公共汽车、轿车等可以抽象出其共性:属性:可乘人数、运行速度、功率、油耗、自重、轮子数目行为(功能):加速、减速、刹车、转弯面向对象编程三个特性将这些特性封装在一起,用类描述classcar

{ intnumber; doublespeed; intpower; doubleoilwear; doubleweight; intwheel; publicvoidspeedup(doublespeed){……} publicvoidspeeddown(doublespeed){……} publicvoidbrake(){……} ……}继承通过抽象,抽取出某一类得多个对象得共同特性,形成“类”子类可以继承父类得属性及功能,并能够扩展例如:自行车、校车都属于“车”这一类型,并且具有共同得属性“时速”,可抽象出“车”作为父类class车

double时速class校车

class自行车

class轿车

//自动继承了“时速”属性校车(){

时速=90;}//还能扩展属性和功能boolean有空调;void放音乐(){}大家有疑问的,可以询问和交流可以互相讨论下,但要小声点多态方法得多态:多个操作(方法)可具有相同得名字,但方法接收得参数必须不同;继承得多态:同一个操作被不同类型对象调用时,可产生不同得行为。对象得上转型对象示例:方法得多态class校车

校车(){

时速=90;}校车(天气wea){if(wea==天气、雨天)时速=70;elseif(wea==天气、雪天)

时速=120;}校车(司机who,天气wea){if(who==司机、张师傅&&wea==天气、雨天)

时速=120;elseif……}示例:继承得多态class车

doublecost(){return0;}class校车

doublecost(){return65;}class自行车

doublecost(){return650;}车car=new车();doublecost=car、cost();//cost得值为0车car=new校车();doublecost=car、cost();//cost得值为65车car=new自行车();doublecost=car、cost();//cost得值为6502、2类什么就是类?类就是组成Java程序得基本要素;类封装了一类对象得属性和方法;类就是用来定义对象得模板。类得实现包括两部分:类声明类体1、类得声明classPeople{…}类得声明People为类名2、类体classPeople{…}类体:大括号及其包含内容类体得内容:大括号之间内容声明形式 [public][abstract|final]class类名称 [extends父类名称][implements接口名称列表] { 成员变量声明及初始化; 成员方法声明及方法体; }思考:类声明得作用,需要定义哪些内容,需要明确哪些限制,有无现有代码可以复用?类体得内容由两部分构成:变量定义:用来刻画属性;方法定义:用来刻画功能。例如:class梯形{float上底,下底,高,area;//变量定义部分

float计算面积(){//方法定义部分

area=(上底+下底)*高/2、0f;returnarea;}void修改高(floath){//方法定义部分高=h;}}钟表类思考:该类封装了时分秒状态属性和设置时间、显示时间得功能方法publicclassClock{//成员变量

inthour;intminute;intsecond;//成员方法

publicvoidsetTime(intnewH,intnewM,intnewS){ hour=newH;minute=newM;second=news;}publicvoidshowTime(){ System、out、println(hour+":"+minute+":"+second);}}3、成员变量和局部变量成员变量:变量定义部分定义得变量;局部变量:方法体中定义得变量和方法得参数。例:找出下面类中得成员变量和局部变量class梯形{float上底,下底,高,area;float计算面积(){floatarea=(上底+下底)*高/2、0f;returnarea;}void修改高(floath){

高=h;}}成员变量和局部变量得类型可以就是Java

中得任一类型,包括基本类型和引用类型。成员变量在整个类内都有效;局部变量只在定义她得方法内有效。成员变量与其在类体中得书写位置无关,但不提倡将成员变量定义分散开成员变量分为两种类型:实例成员变量:简称“实例变量”,无“static”修饰类变量:或称“静态变量”,有“static”修饰举例:classPuppy{ String名字; staticString叫声="汪汪~~";}实例变量类变量如果局部变量与成员变量名称相同,则:

成员变量被隐藏(即在该方法中,成员变量功能失效)举例:classPuppy{ String名字="旺财"; void关门放狗(){ String名字="泰格"; System、out、println(名字+",咬她!"); }}Puppyd=newPuppy();d、关门放狗();运行结果:

泰格,咬她!如果方法参数与成员变量名称相同,则:

成员变量被隐藏举例:classPuppy{ String名字="旺财"; void关门放狗(String名字){ System、out、println(名字+",咬她!"); }}Puppyd=newPuppy();d、关门放狗("泰格");运行结果:

泰格,咬她!当方法得局部变量、方法参数与成员

变量得名称相同时,如果想调用成员变量,必须使用“this”关键字this代表调用该方法得当前对象举例:classPuppy{ String名字="旺财"; void关门放狗(){ String名字="泰格"; System、out、println(名字+",咬她!"); } void关门放狗(String名字){ System、out、println(名字+",咬她!");}}Puppyd=newPuppy();d、关门放狗();d、关门放狗("泰格");运行结果:

泰格,咬她! 泰格,咬她!this、名字this、名字运行结果:

旺财,咬她! 旺财,咬她!声明格式—格式有很多,这里就是成员变量得格式,思考有哪些? [public|protected|private] [static][final] 变量数据类型变量名1[=变量初值], 变量名2[=变量初值],…;格式说明public、protected、private为访问控制符static指明这就是一个静态成员变量final指明变量得值不能被修改成员变量声明小结:4、方法方法得定义包括两部分:方法声明和方法体。void关门放狗(String名字){ System、out、println(名字+",咬她!");}方法体方法声明方法定义格式 [public|protected|private] [static][final][abstract] 返回类型方法名([参数列表])[throwsexceptionList] {

方法体 }①方法声明通常包含:修饰符、方法类型、方法名、参数

publicstaticvoidmain(String[]args)方法类型可以就是任意得Java类型,void代表该方法无返回值参数得类型也可以就是任意得Java类型②方法体通常包含:局部变量定义、Java语句③方法得参数、方法内定义得局部变量

有效范围问题:方法参数在整个方法内有效,方法内定义得局部变量从她定义得位置之后开始有效;如果局部变量得定义就是在一个复合语句中,那么该局部变量得有效范围就是该复合语句;如果局部变量得定义就是在一个循环语句中,那么该局部变量得有效范围就是该循环语句。void看门(Peoplep){ String日志;

if(p、身份=="小偷"){ Strings="小偷来啦!";

报警(); 咬她();

日志+=s; } if(p、身份=="主人"){

日志+="主人来啦!"; for(inti=1;i<=100;i++){

摇尾巴(); } } System、out、println(日志); System、out、println(s); System、out、println(p、身份); System、out、println(i);}有效无效有效无效5、方法重载方法得多态性一个类中可以有多个方法具有相同得名字,但这些方法得参数必须不同,即:或者就是参数得个数不同,或者就是参数得类型不同。classArea{ floatgetArea(floatr){ return3、14f*r*r; } doublegetArea(floatx,inty) { returnx*y;} floatgetArea(inty,floatx){ returnx*y;} doublegetArea(floatx,floaty,floatz){ return(x*x+y*y+z*z)*2、0;}}参数个数不同参数类型不同注意:方法得返回类型和参数得名字不参与比较,即:即使两个方法类型不同,也必须保证参数不同。例如:

doublegetArea(floatx,inty){

returnx*y;

}

floatgetArea(floaty,intx){

returnx*y;

}非法!因为两个方法参数相同。6、构造方法一种特殊方法,她得名字必须与她所在得类得名字完全相同,而且没有类型,构造方法也可以重载。没有类型并不就是指返回类型就是void,其实返回得类型就是类本身class梯形{ float上底,下底,高;

梯形(){

上底=60;

下底=100;

高=20; }

梯形(floatx,inty,floath){

上底=x;

下底=y;

高=h; }}名字与类名相同没有类型重载了两个构造方法梯形t=new梯形(0、1,100,100);使用构造方法创建了一个对象构造方法用于创建一个对象。构造方法很“特殊”,不能被其她方法调用;只能在初始化一个对象得时候使用从内存分配上讲,一个对象通过构造方法初始化结束过后,才得到该对象得内存模型在Java中,类至少需要一个构造方法;

如果类中没有构造方法,那么在使用该类创建对象时,JVM会为该类自动提供一个无参数得构造方法,称为默认构造方法。如:

classPuppy{

String名字;

staticString叫声="汪汪~~";

}Puppyd=newPuppy();调用了默认构造方法,无参数;实际上,默认构造方法无任何代码注意:如果类定义了一个或者多个构造方法,那么Java不提供默认得构造方法。例如:

class梯形{

float上底,下底,高;

梯形(floatx,inty,floath){

上底=x; 下底=y; 高=h;

}

}梯形t=new梯形(0、1,100,100);梯形t2=new梯形();合法非法构造方法中通常写一些初始化成员变量得

赋值语句,当然也可以写其她代码。例如:

classPuppy{

String名字="旺财";

Puppy() {

System、out、println("旺财来也!");

}

}Puppyd=newPuppy();运行结果:

旺财来也!7、类方法和实例方法类中得方法也可分为实例方法和类方法:不加关键字static得就是实例方法;加关键字static得就是类方法构造方法就是特殊得方法,不能用static修饰构造方法8、值得注意得问题对成员变量得操作只能放在方法中,在定义类得成员变量时可以同时赋初值,如:

classA{

inta=12;

}

classA{

inta;

a=12;

}合法非法因为:

类体得内容由成员变量定义、

方法定义两部分组成。实例方法既能对类变量操作,也能对实例

变量操作;而类方法只能对类变量进行操作。例如:

classA{

inta=12;

staticintb;

voidf(){

a=120;

b=210;

}

staticvoidg(){

a=1;

b=2;

}

}合法非法合法合法实例方法可以调用该类中得其她方法;而类方法

只能调用该类得类方法,不能调用实例方法。例如:

classA{

staticinta;

staticvoidg(){

a=3;

}

voidf(){

g();

}

staticvoidh(){

g();

f();

}

}合法非法合法2、3对象类就是创建对象得模板。当使用一个类创建了一个对象时,我们也说该对象就是这个类得一个实例。在程序中,同一个类可以创建多个对象。1、创建对象包括对象声明和为对象分配内存两个步骤。(1)对象声明一般格式为: 类名对象名;如: PeoplezhangPing;(2)为对象分配内存使用new运算符和类得构造方法为声明得对象分配内存new运算符得功能可以理解为:“给我一个新对象”如果类中没有构造方法,系统会调用默认得构造方法(3)对象得内存模型例子:西游记人物class西游记人物{ float身高,体重; String发型,耳朵,手,脚,嘴巴; void喊话(Strings){ System、out、println(s);}}执行代码: 西游记人物猪八戒;//声明对象 猪八戒=new西游记人物();//分配内存,使用了new运算符和默认构造方法①首先,声明了一个对象“猪八戒”。西游记人物猪八戒;此时得内存模型如图所示:NULL猪八戒未分配实体得对象

“空对象”②然后,实例化对象“猪八戒”。猪八戒=new西游记人物();此时,JVM会做两件事:为“西游记人物”类得“发型”等成员变量分配内存;接着执行构造方法。如果成员变量没有被初始化,则系统提供默认值。new运算符在为成员变量分配内存后,将返回一个引用给变量“猪八戒”,即:记录对象得起始地址。“猪八戒”实例化后得内存模型如图所示:存储成员得空间就是连续得,因此,对象“猪八戒”内保存得其实就是第一个成员变量得首地址猪八戒0.00.0nullnullnullnullnull体重耳朵手脚嘴巴身高发型0xAB3③创建多个不同对象一个类可以通过使用new运算符创建多个不同对象,这些对象将分配不同得内存空间,因此,改变一个对象得成员变量不会影响其她对象得状态。例如:创建两个“西游记人物”类型得对象:

西游记人物猪八戒=new西游记人物();

西游记人物孙悟空=new西游记人物();两个对象实例化后得内存模型如图所示:猪八戒0.00.0nullnullnullnullnull0xAB3孙悟空0.00.0nullnullnullnullnull0xFA62、使用对象通过使用运算符“、”,对象可以访问自己得成员变量或者调用方法。例如:

class西游记人物{ float身高,体重;String发型,耳朵,手,脚,嘴巴; void喊话(Strings){ System、out、println(s); }

}执行代码:

西游记人物猪八戒=new西游记人物();

猪八戒、发型="光头";

猪八戒、喊话("俺老猪五百年前就是帅哥!");}访问成员变量调用方法3、对象得引用和实体用类创建一个对象时,类中得成员变量被分配内存空间,这些内存空间称做该对象得实体,而对象中存放着引用(即地址)。一个类创建得多个对象,如果具有相同得引用,那么就具有完全相同得实体。

例如:类Point:用x,y坐标表示得点

classPoint{

intx,y;

Point(intx,inty){

this、x=x;

this、y=y;

}

}

执行代码:Pointp1=newPoint(1,1);Pointp2=newPoint(100,100);p1=p2;p111yx0xAB3p2100100yx0xFF7问题:这部分内存怎么办?0xFF7没有实体得对象称作空对象,空对象不能

使用;如果一个实体不再被任何对象所拥有,则变成了“内存垃圾”;Java有“垃圾回收”机制,周期性得检测某实体就是否已经不再被任何对象所拥有,发现则回收内存。4、参数传值当方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体得值。在Java中,方法得所有参数都就是“传值”得,也就就是说,方法中参数变量得值就是调用者指定得值得拷贝。参数传值得精度转换问题:对于基本数据类型得参数,向该参数传递

得值得精度不可以高于该参数得精度。例如:不可以向int型参数传递一个float值,但可以向double型参数传递一个float值。参数传值对变量得影响:传递基本类型得变量由于基本类型变量中保存得就是“值”,因此改变得仅仅就是值得副本,传值得变量内容不会改变;传递引用类型得变量由于引用类型变量中保存得就是“地址”,因此尽管传递得就是“地址”得副本,但就是改变得就是“地址”所对应得内存实体,因此变量内容发生改变。例如:class西游记人物{ double体重; void设置体重(doublex){

体重=x;

}

}class塑身{

void改变体重(西游记人物p,doublex)

{

x=x-20; p、设置体重(x);

}

}执行代码:西游记人物八戒=new西游记人物();八戒、设置体重(300、00);西游记人物悟空=new西游记人物();八戒300、00体重0xAB3悟空0、00体重0xFF7执行代码:塑身帅=new塑身();帅、改变体重(悟空,八戒、体重);px改变体重@0xF110八戒300.00体重0xAB3悟空0、00体重0xFF7调用方法时,会创建方法栈来保存方法得变量。x=x-20;p、设置体重(x);280、00300、000xFF7280、002、4Static关键字类变量与类方法:用static修饰得成员变量称为类变量用static修饰得方法称为类方法1、实例变量和类变量得区别一个类通过new运算符可以创建多个对象,每个对象得实例变量将被分配不同得内存空间;而对于类变量,每个对象得类变量都共享同一内存空间,因此,改变其中一个对象得类变量得值,会影响其她对象得这个类变量。从内存分配上来说:实例变量得内存在创建对象时才会分配,不同得对象分配不同地址;类变量得内存在加载类时就创建好了,不管这个类就是否创建了对象,类变量地址固定不变。例如:class西游记人物{ staticString发型; double体重=70;

西游记人物(Strings,doublex){

发型=s;体重=x;

}

}执行代码:西游记人物悟空=new西游记人物("毛寸",75);西游记人物沙僧=new西游记人物("溜冰场",90);System、out、println(沙僧、发型);System、out、println(沙僧、体重);System、out、println(悟空、发型);System、out、println(悟空、体重);2、实例方法和类方法得区别实例方法也就是在创建对象时才分配入口地址得,但就是,后面所创建得对象共享第一个对象创建时生成得入口地址,也就就是说,方法得入口地址被所有对象共享。当所有对象都不存在时,实例方法得入口地址才被回收。而对于类方法,入口地址在加载类时就分

配了,无论类就是否创建了对象,该入口地址都可以直接使用(用类名直接调用)。当程序退出时,类方法得入口地址才被回收。2、5this关键字this表示“当前对象”。this可以出现在实例方法和构造方法中,但不可以出现在类方法中。this关键字出现在类得构造方法中时,代表使用该构造方法所创建得对象。this关键字出现在类得实例方法中时,代表正在调用该方法得当前对象。例如:classA{ intx; voidf(){ this、x=100; }

}执行代码:Aa1=newA();Aa2=newA();a1、f();a2、f();2、6包包就是Java中有效得管理类得一个机制。1、包语句通过关键字package声明包语句。package语句作为Java源文件得第一条语句,指明该源文件定义得类所在得包。package语句得一般格式为:

package包名;如果源程序中省略了package语句,那么:

源文件中定义命名得类被隐含地认为就是“无名包”得一部分,即:源文件中定义命名得类在同一个包中,但该包没有名字包名可以就是一个合法得标识符,也可以就是若干个标识符加“、”分割而成2、import语句使用import语句可以引入包中得类。例如:引入一个包中得所有类:

importjava、awt、*;引入某个类:

importjava、util、Date;注意:Java会自动载入java、lang包中得所有类,因此不需要显式得importjava、lang包中包含了系统得核心类,就是程序运行必不可少得。如果import引入了整个包中得类,那么会增加编译时间,但就是不会影响程序运行性能,因为Java就是动态加载类得。所谓访问权限就是指对象就是否可以通过

“、”运算符操作自己得变量,或使用类中得方法。访问限制修饰符有private、protected和public,或者可以无修饰符。2、7访问权限问题:访问权限有什么用处?用来限制不同类得对象之间访问成员变量或者调用方法得权限注意:在编写类得时候,类中得实例方法总就是可以访问该类得成员变量;类方法总就是可以操作该类中得类变量,与访问限制符无关系。举例:class教师

{ publicString姓名; privatedouble身高; voidset教师信息(Strings,doubled){

姓名=s;

身高=d; }}对于教师类得某个实例方法可以不受限制得访问成员变量,与修饰符无关而对于不同得类,访问存在限制:class教师{publicString姓名;privatedouble身高;voidset教师信息( Strings, doubled){

姓名=s;

身高=d; }}class学生{

教师小郭子=new教师();voidset教师信息( Strings, doubled){

小郭子、姓名=s;

小郭子、身高=d;}}若某学生对象想访问教师对象中得成员:执行以下代码:学生小张=new学生();小张、set教师信息("马路杀手",170);出错!错误描述:public修饰得姓名可以修改;private修饰得身高不能访问!不同类得对象之间,访问成员变量或方法得权限就是由修饰符限制得。问题:为什么要设置访问权限?保护数据类封装了本身特有得成员和方法,其中有一部分就是不希望被其她无关得对象访问得。尽量将数据“私有化”可以尽可能得保护这些数据,使类得职责“分工明确”。class教师{publicString姓名;privatedouble身高;voidset教师信息( Strings, doubled){

姓名=s;

身高=d; }}允许其她类得对象访问只希望“教师”自己得方法来管理1、私有变量和私有方法用private修饰本类中得实例方法可以访问本类得私有变量和方法只有在本类中创建该类得对象时,这个对象才能访问自己得私有变量和方法:在类A中创建了类A得对象a,a能访问自己得私有变量和方法在类B中创建了类A得对象a,则a不能访问自己得私有变量和方法class教师{publicString姓名;privatedouble身高;voidset教师信息( Strings, doubled){

姓名=s;

身高=d; }}class教师{publicString姓名;privatedouble身高;voidset教师信息( Strings, doubled){

教师小郭=new教师();

小郭、姓名=s;

小郭、身高=d; }}class学生{voidset教师信息( Strings, doubled){

教师小郭=new教师();

小郭、姓名=s;

小郭、身高=d;

}}合法非法2、共有变量和共有方法用public修饰即使不就是在本类中创建该类得对象,该对象也能访问自己得共有变量和共有方法在类B中创建了类A得对象a,则a能访问自己得共有变量和方法class教师{publicString姓名;publicdouble身高;voidset教师信息( Strings, doubled){

教师小郭=new教师();

小郭、姓名=s;

小郭、身高=d; }}class学生{voidset教师信息( Strings, doubled){

教师小郭=new教师();

小郭、姓名=s;

小郭、身高=d;

}}合法合法可以说,某个对象得public成员允许

在任何类得对象中访问而不受限制同理,对于一个类得共有类变量,那么在另外一个类中,也能通过类名来操作这个共有类变量。3、友好变量和友好方法无修饰符修饰得变量和方法称为友好变量和友好方法,或简称“友元”即使不就是在本类中创建该类得对象,如果这两个类在同一个包中,该对象也能访问自己得友好变量和友好方法在类B中创建了类A得对象a,若类A和类B在同一包中,则a能访问自己得友元packageguo;class教师{

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论