《java类与对象》PPT完整版_第1页
《java类与对象》PPT完整版_第2页
《java类与对象》PPT完整版_第3页
《java类与对象》PPT完整版_第4页
《java类与对象》PPT完整版_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

第三章类与对象目标面向对象技术基础类的概念、定义与使用对象的生成、使用static关键字this关键字final关键字Java类中的限定词包和import语句2面向对象编程OOP旨在在计算机程序中模拟现实世界中的概念在OOP

中,现实世界的所有事物全都被视为对象能够在计算机程序中用类似的实体模拟现实世界中的实体设计和实现软件系统的方法3相关概念4对象对

象面向对象编程的核心为计算机应用程序提供实用基础完成特定任务表示现实世界中的实体对象是客观存在的具体实体,具有明确定义的状态和行为。5对象的示例收银员对象顾客对象顾客姓名:朱丽叶年龄:28体重:52千克操作:购买商品状态姓名:布兰尼职衔:收银员年龄:35体重:60千克操作:收款打印帐单行为6类类是用于组合各个对象所共有操作和属性的一种机制形状类动物类汽车类类的示例“类是具有相同属性和行为的一组对象的集合”7类和对象的示例雇员收银员系统管理员仓库管理员促销员采购经理8属性事物的特性,在类中表示为变量每个对象的每个属性都拥有其特有的值属性名称由类的所有实例共享住址姓名属性年龄“在类中表示对象或实体拥有的特性时称为属性

”促销员对象9方法方法操作的实际实现如何执行所请求的操作的规范方法指定操作对象数据的方式在得到操作请求时指定如何做的算法“对象执行的操作称为方法。”10方法的示例缝衣服的步骤量尺寸得到工具缝衣服方法缝制衣服裁缝11类和对象的区别类是概念模型,定义对象的所有特性和所需的操作对象是真实的模型类和对象类定义实体对象是实际的实体类是对象的原型所有属于同一个类的对象都具有相同的特性和操作12面向对象的基本特征13封装性信息隐藏,隐藏对象的实现细节,不让用户看到将东西包装在一起,然后以新的完整形式呈现出来例如,两种或多种化学药品组成一个胶囊将方法和属性一起包装到一个单元中,单元以类的形式实现“隐藏属性、方法或实现细节的过程称为封装。”14封装的示例3-1接口

采购经理罗杰斯先生法拉力公司.迪斯尼汽车公司.市场经理雪莉女士

要求15

封装的示例3-2有选择地提供数据法拉力公司迪斯尼汽车公司公共电话号码电子邮箱产品种类私有备件的制造方法备件库存备件的制造成本公共电话号码电子邮箱汽车种类私有汽车的组装方法汽车库存汽车的组装成本16封装的示例3-3

实体法拉力公司实体迪斯尼汽车公司

AutiLtd.ButoLtd.属性电话号码电子邮箱产品种类现有存货数量雇员详情所需物料详情属性电话号码电子邮箱汽车种类汽车规格雇员详情库存详情经销商详情方法接收订单备件的制造方法计算备件的制造成本计算利润率方法发出订单汽车的组装方法计算汽车的组装成本计算工资发出订单编制必要报告17继承性父类

子类父类/子类是相对的Cow类Lion类Tiger类Animals类Carnivorous类Herbivorous类Coat类18多态性父类子类-绘制和移动三角形子类-绘制和移动矩形子类-绘制和移动五边形ShapeDraw()Move()TriangleDraw(){DrawTraingle}Move(){MoveTriangleVertices}RectangleDraw(){DrawRectangle}Move(){MoveRectangleCorner}PentagonDraw(){DrawPentagon}Move(){MovePentagonVertices}子类19面向对象的Java实现20在Java中实现类

语法

class<classname>{ <bodyofclass><memberfielddeclarations><membermethoddeclarations>

}其中,class

是创建类所使用的关键字,<classname>

是类的名称,<bodyofclass>包含属性和方法的声明。21在Java中实现类类的命名规则:要符合标识符规则;不能为Java中的关键字类名最好容易识别,多为英文单词组成classBook{StringbookName;StringauthorName;

int

nopages;

booleanavailable;

voidisAvailable(){

if(available==true) {

System.out.println("有这本书");

}}22成员变量和局部变量类体中的变量分为两部分。变量定义部分所定义的变量称为类的成员变量,在方法体中定义的变量和方法的参数被称为局部变量。成员变量和局部变量的共同之处成员变量和局部变量的类型都可以是Java中的任何一种数据类型,包括基本类型:整型、浮点型、字符型;引用类型:数组类型、对象。成员变量和局部变量的名字都必须符合标识符规定,名字如果使用拉丁字母,首写字母小写;如果多个单词组成,从第2个单词开始的其他单词的首写字母使用大写。成员变量和局部变量的区别:成员变量在整个类内都有效,局部变量只在定义它的方法内有效。23成员变量和局部变量publicclassBenson{

intx=100,y; voidf(){

intx=10; y=x;//注意这里y得到的值为10,而不是100. }}注:如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,也就是说,这个成员变量在这个方法内暂时失效。24成员变量和局部变量publicclassEmployee{

int

sideA,sideB,sideC; voidsetSide(int

sideA,int

sideB,int

sideC){

this.sideA=sideA;

this.sideB=sideB;

this.sideC=sideC; }}注:如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,这时如果想在该方法内使用成员变量,必须使用关键字this。25类中的方法方法的定义方法的名称参数列表方法的主体方法返回的对象类型或原始类型26类中的方法语法<returntype><methodname>(<type1><arg1>,<type2><arg2>,…){ <setofstatements>}其中,<returntype>是方法返回值的数据类型<methodname>

是用户自定义的方法名称方法的参数列表是一组变量声明。<setofstatements>是方法的主体27类中的方法不能为Java

中的关键字不能包含空格或点号“.”可以下划线“_”、字母或“$”符号开头方法的命名规则:28类中的方法classBook{

StringbookName;

StringauthorName;

int

nopages;

booleanavailable;

voidisAvailable(){ if(available==true) {

System.out.println("有这本书");

}}

…..}方法29创建对象定义类的最终目的是要使用这些类,创建并操纵某类的对象是使用该类的最主要手段。创建对象的一般格式为:类名对象名=new类名([参数]);其中包含声明、实例化和初始化3个步骤

声明:类名对象名声明并不为对象分配内存空间,而只是分配一个引用空间;对象的引用类似于指针,是32位的地址空间,它的值指向一个中间的数据结构,它存储有关数据类型的信息以及当前对象所在的堆的地址,而对于对象所在的实际的内存地址是不可操作的,这就保证了安全性。实例化运算符new为对象分配内存空间,它调用对象的构造方法,返回引用。一个类的不同对象分别占据不同的内存空间。生成执行构造方法,进行初始化;根据参数不同调用相应的构造方法。30创建对象classStudent{ floatheight,weight; Stringhead,ear,hand,foot,mouth; voidspeak(Strings){

System.out.println(s); }}classA{ publicstaticvoidmain(String

args[]){ StudentZhangSan;//声明对象

//为对象分配内存,使用new运算符和默认的构造方法

ZhangSan=newStudent(); }}31对象的使用对象不仅可以改变自己变量的状态,而且还拥有使用创建它的那个类中的方法的能力,对象通过使用这些方法可以产生一定的行为。通过圆点符号“.”可以实现对变量的访问和方法的调用。变量和方法可以通过设定访问权限来限制其它对象对它的访问。32classBook{StringbookName;StringauthorName;

int

nopages;

booleanavailable;

Book(String

bName,String

aName,int

Page,booleana){

bookName=bName;

authorName=aName;

nopages=Page;available=a;}

void

isAvailable(){if(available==true)System.out.println("有这本书");}}public

class

BookTest{public

static

void

main(String

args[]){BookobjBook=newBook("a","b",3,true);objBook.isAvailable();System.out.println(objBook.bookName);}}33classBook{StringbookName;StringauthorName;

int

nopages;

booleanavailable;void

isAvailable(){if(available==true)System.out.println("有这本书");}}public

class

BookTest{public

static

void

main(String

args[]){BookobjBook=newBook();objBook.bookName="a";……….objBook.isAvailable();System.out.println(objBook.bookName);}}34练习创建一个Date类,具有三个整型成员变量year,month,day,具有三个成员方法setDate,isLeapYear,print,其中setDate用来给成员变量赋值,isLeapYear用来判断当前年份是否为闰年,print用来输出当前日期值。在主函数中创建Date类的对象,并调用三个成员函数实现赋日期值,输出日期值,并判断当前年份是否为闰年。35构造方法每当创建给定类的实例时就调用的方法与类同名,但没有返回类型Java为对象分配内存,初始化实例变量时调用构造方法两种构造方法参数化构造方法隐式构造方法36隐式构造方法的示例classSdate

{

int

month=11;

int

day=27;

int

year=1969;

publicstaticvoidmain(Stringargs[

]){

SdateS1;

S1=new

Sdate();

}

}隐式构造方法37参数化构造方法的示例classSdate

{

int

month;

int

day;

int

year;

Sdate(int

m,int

d,inty){

month=m;

day=d;

year=y;

System.out.println(“日期是"+m+"/"+d+"/"+y+"."); }

publicstaticvoidmain(Stringargs[])

{

SdateS1,S2;S1=newSdate(11,27,1969);S2=newSdate(3,3,1973);

}}参数化构造方法日期是11/27/1969.日期是3/3/1973.38参数化构造方法的示例classSdate

{

int

month;

int

day;

int

year;

Sdate(int

m,int

d,inty){

month=m;

day=d;

year=y;

System.out.println(“日期是"+m+"/"+d+"/"+y+"."); }

publicstaticvoidmain(Stringargs[])

{

SdateS1,S2;S1=new

Sdate();S2=newSdate(3,3,1973);

}}TheconstructorSdate()isundefined39参数传值当方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体的值。publicclassDate//类声明{

int

year,month,day;//成员变量,表示年、月、日

voidsetDate(int

y,int

m,intd)//成员方法,设置日期值

{//无返回值,有3个参数

year=y;month=m;day=d;}publicstaticvoidmain(String

args[]){Date1aday=newDate1();//创建对象

aday.setDate(2006,1,28);//调用类方法}}401.基本数据类型参数的传值基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别,比如,不可以向int类型参数传递一个float值,但可以向double类型参数传递一个float值。这种数据传递方式被称为是值传递,方法接收参数的值,但不能改变这些参数的值。412.引用类型参数的传值引用传值方式:Java的引用类型数据包括对象、数组和接口,当方法中参数是引用类型时,引用数据类型传递给方法的是数据在内存中的地址,方法中对参数变量的操作可以改变原变量的值。42classPeople{ Stringface; voidsetFace(Strings){ face=s; }}classC{ voidf(intx,doubley,Peoplep){ x=x+1; y=y+1;

p.setFace("笑脸");

System.out.println("参数x和y的值分别是:"+x+","+y);

System.out.println("参数对象p的face是:"+p.face); }}publicclassEp3_8{ publicstaticvoidmain(String

args[]){

intm=100; doublen=100.88; Peoplezhang=newPeople();

zhang.setFace("很严肃的样子"); Ca=newC();

a.f(m,n,zhang);

System.out.println("main方法中m和n的值仍然分别是:"+m+","+n);

System.out.println("main方法中对象zhang的face是:"+zhang.face); }}zhang.face="很严肃的样子";改变形参值导致实参值的改变zhang.face=“笑脸";参数x和y的值分别是:101,101.88参数对象p的face是:笑脸main方法中m和n的值仍然分别是:100,100.88main方法中对象zhang的face是:笑脸43方法重载方法重载类中有多个具有相同名称的方法方法重载类中有多个具有相同名称的方法方法具有不同的参数列表或者是参数的个数不同,或者是参数类型不同注意:方法返回值的类型不能用来区分重载的方法。不能通过两个方法的返回值的类型来区分它们。这是因为当你调用一个方法时,返回值的类型是不显示的。44classMethodOverloading{ voidreceive(inti){

System.out.println("Receiveoneintdata");

System.out.println("i="+i); } voidreceive(intx,inty){

System.out.println("Receivetwoint

datas");

System.out.println("x="+x+"y="+y); }}publicclassMethodOverloadingTest{ publicstaticvoidmain(String

args[]){

MethodOverloadingmo=newMethodOverloading(); mo.receive(1); mo.receive(2,3); }}45构造方法的重载classSdate

{

int

month;

int

day;

int

year;

Sdate(int

m,int

d,inty){

month=m;

day=d;

year=y;

System.out.println(“日期是"+m+"/"+d+"/"+y+"."); }

Sdate(){

}

Sdate(int

m,int

y){

month=m;

year=y;

}

publicstaticvoidmain(Stringargs[])

{

SdateS1,S2;S1=new

Sdate();S2=newSdate(3,3,1973);

}}46static修饰符成员变量可以分为实例变量和类变量。同样,类中的方法也可分为实例方法和类方法。用static关键字修饰的变量是类变量,也称静态变量,同样的,用static关键字修饰的方法是类方法,也称静态方法目的:使该变量或方法独立于类的实例,使用类去访问,而不用类实例47static修饰符注意:如果在声明时不用static关键字修饰,则默认声明为实例变量和实例方法。每个对象的实例变量都分配内存,通过该对象来访问这些实例变量,不同的实例变量是不同的。类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。类变量可通过类名直接访问,无需先生成一个实例对象,也可以通过实例对象访问类变量。48classLader{ floatupperBase,high; staticfloatlowerBottom;

Lader(floatx,floaty,floath){

upperBase=x;

lowerBottom=y; high=h; } floatgetLowerBottom(){returnlowerBottom;} voidmodifyLowerBottom(floatb){lowerBottom=b; }}publicclassEp3_9{ publicstaticvoidmain(String

args[]){

Lader

laderOne=newLader(3.0f,10.0f,20),

laderTwo=newLader(2.0f,3.0f,10);

Lader.lowerBottom=200;//通过类名操作类变量

System.out.println("laderOne的下底:"+laderOne.getLowerBottom());

System.out.println("laderTwo的下底:"+laderTwo.getLowerBottom());

laderTwo.lowerBottom=60; //laderTwo.modifyLowerBottom(60);//通过对象操作类变量

System.out.println("laderOne的下底:"+laderOne.getLowerBottom());

System.out.println("laderTwo的下底:"+laderTwo.getLowerBottom()); }}laderOne的下底:200.0laderTwo的下底:200.0laderOne的下底:60.0laderTwo的下底:60.049static修饰符注意:实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。但类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。50classMember{ staticint

classVar;

int

instanceVar; staticvoidsetClassVar(inti){

classVar=i;

//instanceVar=i;//类方法不能访问实例变量

} staticint

getClassVar(){ returnclassVar;} voidsetInstanceVar(inti){

classVar=i;//实例方法不但可以访问类变量,也可以实例变量

instanceVar=i; }

int

getInstanceVar(){returninstanceVar;}}publicclassMemberTest{ publicstaticvoidmain(String

args[]){ Memberm1=newMember(); Memberm2=newMember(); m1.setClassVar(1); m2.setClassVar(2);System.out.println("m1.classVar="+m1.getClassVar()+"m2.ClassVar="+m2.getClassVar()); m1.setInstanceVar(11); m2.setInstanceVar(22);System.out.println("m1.InstanceVar="+m1.getInstanceVar()+"m2.InstanceVar="+m2.getInstanceVar());

}}m1.classVar=2m2.ClassVar=2m1.InstanceVar=11m2.InstanceVar=2251this关键字this是Java的一个关键字,表示某个对象。this可以出现在实例方法和构造方法中,但不可以出现在类方法中。this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。实例方法必须通过对象来调用,当this关键字出现在类的实例方法中时,代表正在调用该方法的当前对象。成员函数中定义了和成员变量中相同的变量时,引用成员变量要用this.构造函数中调用同一个类的其他构造函数时用this。52【例】编写两个重载构造函数的类,在第二个构造函数中使用this调用第一个构造函数。publicclassThisConstructorCall{ publicThisConstructorCall(Strings){

System.out.println("s="+s); } publicThisConstructorCall(inti){

this("i="+i); } publicstaticvoidmain(String

args[]){

ThisConstructorCallt=newThisConstructorCall("Stringcall");

ThisConstructorCallct=newThisConstructorCall(47); }}s=Stringcalls=i=4753this关键字的示例classPixel{

intx;

inty;

voidinit(intx,inty)

{

this.x=x;

this.y=y;

}

publicstaticvoidmain(Stringargs[])

{

Pixelp=newPixel();

p.init(4,3);

}}对象的引用54final关键字final关键字可以修饰类、类的成员变量和成员方法。用final修饰成员变量,说明该成员变量是最终变量,即为常量。程序中的其他部分可以访问,但不能够修改。用final修饰成员方法,则该方法不能再被子类所重写,即该方法为最终方法。551.final修饰成员变量final修饰变量,则成为常量,例如

finaltypevariableName;

修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。562.final修饰成员方法final修饰方法,则该方法不能被子类重写。finalreturnType

methodName(paramList){…}573.final类final修饰类,则类不能被继承。如果一个类被final关键字修饰,说明这个类不能再被其他类所继承,该类被称为最终类。

finalclassfinalClassName{

}

在默认情况下,所有的成员变量或成员方法都可以被隐藏或重写,如果父类的成员不希望被子类的成员所隐藏或重写则将其声明为final。58classep3_12_a{ staticfinaldoublepi=3.1415926;//声明静态常量

publicfinalvoidf(){//声明最终方法

System.out.println("pi="+pi); }}classep3_12_bextendsep3_12_a{

intnum=100; privatevoidf(){//出错,不可覆盖父类的最终方法

System.out.println("num="+num); }}classep3_12{ publicstaticvoidmain(String

args[]){ ep3_12_bOne=newep3_12_b();

One.f(); }}需要注意的是:被private声明为私有的方法,以及包含在final类中的方法都被默认为是最终的。用static和final两个关键字修饰变量时,若不给定初始值,则按照默认规则对变量初始化。若只用final修饰而不用static,就必须且只能对该变量赋值一次,不能默认。59访问修饰符信息隐藏是OOP最重要的功能之一,也是使用访问修饰符的原因Java语言中有四种不同的访问修饰符,提供了四种不同的访问权限,访问修饰符主要用来修饰成员变量或方法。访问修饰符访问修饰符privateprotectedpublicdefault60访问修饰符该类或非该类均可访问public只有该类可以访问private相同数据包中的类可以访问default该类及其子类的成员可以访问,同一个包中的类也可访问protected611.private用private修饰的成员变量和方法称为私有变量和私有方法,类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。对于私有成员变量和方法,只有在本类中创建该类的对象时,这个对象才可以访问自己的私有成员变量和类中的私有方法,如下例所示:62classEp3_13{ privateintmoney; Ep3_13(){ money=2000; } privateint

getMoney(){ returnmoney; } publicstaticvoidmain(String

args[]){ Ep3_13exa=newEp3_13();

exa.money=3000;

intm=exa.getMoney();

System.out.println("money="+m); }}63classE4{ privateintmoney; privateE4(){ money=2000; } privateint

getMoney(){ returnmoney; }}classE3{ publicstaticvoidmain(String

args[]){ E4exa=newE4();

exa.money=3000;

intm=exa.getMoney(); }}//ThefieldE4.moneyisnotvisible //ThemethodgetMoney()fromthetypeE4isnotvisible//TheconstructorE4()isnotvisible 64classE4{ privateintmoney; E4(){ money=2000; }

int

getMoney(){ returnmoney; }

int

setMoney(intx){ Money=x;}}classE3{ publicstaticvoidmain(String

args[]){ E4exa=newE4();

intm=exa.getMoney();

System.out.println(m); exa.setMoney(10); m=exa.getMoney();

System.out.println(m); }}652.default

类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。非本包内的类不能访问。3.protected

类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。4.public

用public修饰的成员变量和方法称为共有变量和共有方法,类中限定为public的成员,可以被所有的类访问。在任何一个类中用构造方法创建了一个对象后,这个对象都可以访问自己的public变量和方法。66访问修饰符访问修饰符可访问性位置private默认protectedpublic同一个类是是是是同一个包内的类否是是是不同包内的子类否否是是不同包并且不是子类否否否是67包包是将一些类聚集在一起的一个实体,是Java语言中有效管理类的一个机制。当一个大型程序交由数个不同的程序人员开发时,用到相同的类名是很有可能的,Java程序开发中为了避免这种情况,提供了一个包的概念(package)。同一个包内的类名不允许重复,不同包内可以有相同名称的类。68包语句使用包很简单,通过关键字package声明包语句。package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包。package语句一般格式为:packagepackageName;包名可以是一个合法的标识符,也可以是若干个标识符加“.”分割而成,如:

packagetom; package;如果源文件中省略了package语句,那么源文件定义的类隐含地认为是无名包的一部分,也就是说源文件定义命名的类在同一个包中,但该包没有名字。69创建包packagemypackage;publicclassCalculate{publicdoublevolume(doubleheight, doublewidth, doubledepth){……}……}

声明包70import语句在编写程序时,除了自己编写类外,还经常需要使用Java提供的许多类,这些类可能在不同的包中,使用import语句可以引入包中的类。在一个Java源文件中可以有多个import语句,它们在程序中的位置是有要求的,必须写在package语句和源文件的类定义之间。要引入java.util包中的Date类,使用:importjava.util.Date;如果要引入一个包中的全部类,则可以用星号来代替,如:

importjava.awt.*;71导入包packagemypackage;importmypackage.Calculate;importjava.applet.Applet;importjava.awt.*;publicclassPackageDemo{

publicstaticvoi

温馨提示

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

评论

0/150

提交评论