java教程-类与对象.ppt_第1页
java教程-类与对象.ppt_第2页
java教程-类与对象.ppt_第3页
java教程-类与对象.ppt_第4页
java教程-类与对象.ppt_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

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

文档简介

4.类与对象,主讲:王华彬,知识点,变量作用域构造方法方法重载参数传递实例成员和类成员packageimport访问权限可变参数,Java技术及其应用,面向对象的三个特性:封装、继承和多态本章学习封装性,类的封装性体现在,把一类事物所具有的相同的属性和方法封装在一起。然后通过定义该类的一个对象,进而对该对象的属性赋值,调用类的方法,从而完成一定的功能,封装性,汽车类:CLASScar属性:颜色,灰色、红色、黄色品牌,法拉利、现代、马自达类型,赛车、轿跑车、SUV方法:启动前进倒车熄火car罗院长的车=newcar();罗院长的车.carColor=gray;罗院长的车.carBrand=现代;罗院长的车.carStart();罗院长的车.carStop();,封装性,手机类:CLASSphone属性:颜色,灰色、红色、黄色品牌,苹果、谷歌、三星类型,触屏、直板、翻盖方法:开机拨号挂断关机phone王玮的手机=newphone();王玮的手机.phoneColor=gray;王玮的手机.phoneBrand=诺基亚*;王玮的手机.phonePoweron();王玮的手机.phonePoweroff();,类定义的一般要求,classRectdoublewidth;doubleheight;doublegetArea()doublearea=width*height;returnarea;要求:类名是合法标示符,且容易理解定义一个类包括三步:取类名定义属性定义方法,类定义的一般要求,classcarintcarBrand;charcarColor;intcarKind;/属性一般写在方法前习惯先定义属性,再定义方法;/一行只定义一个属性,不提倡intcarBrand,carKind;/变量首字母小写,第2个单词开始字母大写intstartCar();intforward();intreversing();intstopCar();/方法函数,类的属性或称为成员变量,类的属性初始值,classRectdoublewidth;doubleheight;doublegetArea()doublearea=width*height;returnarea;,Java技术及其应用,class类名成员变量;成员方法;,width=0.0;height=0.0;,类成员变量可以不赋初值,默认0,false;局部变量需要赋初值。,类的属性初始值,classRectdoublewidth=1;doubleheight;doublegetArea()doublearea=width*height;returnarea;classtestpublicstaticvoidmain(Stringargs)Rectr=newRect();System.out.println(r.width);System.out.println(r.height);思考:程序的输出?,Java技术及其应用,doublewidth;width=1;,变量作用域,classRectdoublewidth;doubleheight;doublearea;doublegetArea()doublearea=width*height;returnarea;voidsetHeight(doubleheight)this.height=height;,Java技术及其应用,成员变量,方法体内局部变量,方法的参数变量,成员变量,即属性的有效区是整个类;方法中的局部变量的有效区是该方法;方法的参数的有效区在该方法中;当成员变量和方法的局部变量或方法的参数变量相同时,成员变量被隐藏,即:成员变量在方法中暂时失效,Java技术及其应用,this关键字,当成员变量被同名的局部变量或方法的参数变量隐藏时(即成员变量在方法中暂时失效),为了表示成员变量,可以用this.成员变量为指代this指向调用该成员方法的对象。Rectr=newRect();this可以理解是r的引用,变量作用域例题,classVariableintx=10;/成员变量inty;voidinit()intx=5;y=x;System.out.println(y);思考:程序输出?,/此时y=x=5,变量作用域例题,classVariableintx=10;/成员变量inty;voidinit()intx=5;y=this.x;System.out.println(y);,/此时y=x=10,classVariableintx=0,y=0,z=0;/成员变量voidinit(intx,inty)this.x=x;this.y=y;intz=5;/方法中的局部变量System.out.println(x+y+z);Variablev=newVariable();System.out.println(v.x+v.y+v.z);v.init(20,30);System.out.println(v.x+v.y+v.z);,20,30,v.x=20,v.y=30,再来一个例题,publicclassAvoidf()intm=10,sum=0;if(m9)intz=10;z=2*m+z;for(inti=0;im;i+)sum=sum+i;m=sum;z=i+sum;,Java技术及其应用,编译错,错在哪儿?,Z的有效区在if;i的有效区在for,课后习题4-8,classBintx=100,y=200;publicvoidsetX(intx)x=x;publicvoidsetY(inty)this.y=y;publicintgetXYSum()returnx+y;,Java技术及其应用,Bb=newB();b.setX(-100);/成员变量b.x=?b.setY(-200);/成员变量b.y=?System.out.println(b.getXYSum();/成员变量x=100;/成员变量y=-200/X+y=-100,变量作用域知识点小结,类的成员方法中定义的局部变量或成员方法的参数变量都会隐藏掉同名的类的成员变量,这时可以使用this关键字来表示同名的类的成员变量this关键字指向调用该成员方法的对象。,Java技术及其应用,已经介绍了类的属性,接下来是:?类的方法或称为成员函数1、构造方法2、成员方法,构造方法,publicclassExamplepublicstaticvoidmain(Stringargs)Rectr1=newRect();/创建对象r1.width=128;/使用对象r1.height=69;doublearea=r1.getArea();System.out.println(rectangle的面积:+area);,Java技术及其应用,分配空间,并初始化对象,调用构造方法,构造方法,classRectdoublewidth;doubleheight;doublegetArea()doublearea=width*height;returnarea;,Java技术及其应用,Rect(),构造方法是一种特殊的方法构造方法名和类名相同无返回类型构造方法在new创建对象时被调用若无构造方法,按照默认的构造方法仅分配空间构造方法可以重载,Rectr1=newRect();,构造方法:是一个函数和类同名对类的属性进行赋值可以重载,,构造方法的重载,classRectdoublewidth;doubleheight;Rect()width=10.0;height=20.0;Rect(doublex,doubley)width=x;height=y;doublegetArea(),构造方法名相同,而参数的个数或类型不同,Rect(),构造方法的调用,publicclassExamplepublicstaticvoidmain(Stringargs)Rectr1=newRect();/创建对象doublearea1=r1.getArea();Rectr2=newRect(1,2);/创建对象doublearea2=r2.getArea();,Java技术及其应用,一个类可以定义多个构造方法,根据参数个数或类型不同,使用不同的构造方法,构造函数作用是:为对象分配内存空间,为对象的属性赋初始值,方法重载(MethodOverloading),多个方法可以享有相同的名字方法的参数必须不同或者是参数个数不同;或者是参数类型不同;完成的功能相似返回类型不能作为区分函数重载的标准,方法重载的好处,要打印不同类型的数据:int,float,String,不需要定义不同名的方法名:printInt(int);printFloat(float);printString(String);利用方法重载,只需要定义一个方法名print(),接收不同的参数:print(int);print(float);print(String);,classMethodOverloadingvoidreceive(inti)System.out.println(Receiveoneintdata);System.out.println(i=+i);voidreceive(intx,inty)System.out.println(Receivetwointdatas);System.out.println(x=+x+y=+y);,方法重载例题,voidreceive(doubled)System.out.println(Receiveonedoubledata);System.out.println(d=+d);voidreceive(Strings)System.out.println(Receiveastring);System.out.println(s=+s);,方法重载例题,publicclassMethodOverloadingTestpublicstaticvoidmain(Stringargs)MethodOverloadingmo=newMethodOverloading();mo.receive(1);mo.receive(2,3);mo.receive(12.56);mo.receive(veryinteresting,isntit);,方法重载例题,多态性:发送消息给某个对象,让该对象自行决定响应何种行为。,书上例题4-11,见.Java文件,Java技术及其应用,练习,课后习题4-10,Java技术及其应用,小结,构造方法构造方法是一种特殊的方法方法名和类名相同无返回类型构造方法在new创建对象时被调用若无构造方法,按照默认的构造方法仅分配空间构造方法可以重载,即可以有多个构造方法,Java技术及其应用,类的方法,与c语言的函数定义基本相同,只不过在类中称为方法,在此不再赘述。需要注意的是:在方法体内,成员变量和局部变量的区别。其实可以把成员变量当做全局变量理解即可。,小结,方法重载多个方法可以享有相同的名字方法的参数必须不同或者是参数个数不同;或者是参数类型不同;完成的功能相似返回类型不能作为区分函数重载的标准体现面向对象的多态性,Java技术及其应用,类变量和简单数据类型变量的区别,Circlec1;inti;,Java技术及其应用,只声明,未分配空间,c1=null,声明的同时分配空间,简单数据类型变量,inti;i=1;intj;j=2;j=i;,Java技术及其应用,i,j,1,2,1,i和j分别指向两块不同的内存区域。j=I;把i中的内容复制到j中;,类变量,Java技术及其应用,Circlec1;c1=newCircle();Circlec2;c2=newCircle();c2=c1;,c1,c2,c1和c2指向同一块内存区域。c2=c1;c2相当于c1的引用;此时,c2原来的内存空间被释放;,几条注意事项,1、不要定义没有实体的类的空对象,必需通过new+构造函数创建对象;2、对象的名字,可以认为是该对象对应内存区域的一个引用,即:一个别名。如果对象直接进行赋值,则原先的内存被释放。3、在java语言中,类只有构造方法,没有析构方法,只是因为java语言有垃圾回收机制。这也正是java程序一般很少有内存泄露的原因。,已经介绍了类的属性和方法,包括:成员变量的作用域构造函数及重载对象创建的原理接下来,介绍一下方法的参数传递中的注意事项,成员方法参数,参数的类型:简单数据类型:传值,不改变参数的值;引用数据类型(数组类型、类或接口):传地址,可改变参数的值;classMethodvoidreceive(inti)i=6;在main函数中,执行如下代码,思考输出?Methodm=newMethod();inta=5;m.receive(a);System.out.println(a);,此时:a为全局变量,通过参数i传到receive方法中,i相当于a的复制品,i的改变不改变a的值,classMethodvoidreceive(inti)i=6;在main函数中,执行如下代码,思考输出?Methodm=newMethod();floata=5;m.receive(a);System.out.println(a);,参数传递的值的级别不能高于该参数值,可以低于该参数值,参数传递,当传递的参数是简单类型的时候,传值,方法调用结束后原值不变;当传递的参数是引用类型的时候,传地址,方法调用结束后原值会变。inta=5;voidreceive(inti)i=6;,Java技术及其应用,5,5,6,a,i,i,如果参数是引用的话:当传递的参数是引用类型的时候,传地址,方法调用结束后原值会变。注意:对象名是一种引用,5,a,i,6,i=6,再看一个综合性的例子!,传值和传地址举例,publicclassPassTestfloatptValue;publicvoidchangeInt(intvalue)value=55;publicvoidchangeObjValue(PassTestref)ref.ptValue=99f;publicstaticvoidmain(Stringargs)intval;PassTestpt=newPassTest();val=11;pt.changeInt(val);/val=?pt.ptValue=101f;pt.changeObjValue(pt);/pt.ptValue=?,练习,Java技术及其应用,课堂练习:请同学们思考结果,并解释publicclassSwapvoidswapp(intx,inty)inttemp;System.out.println(x+,+y);temp=x;x=y;y=temp;System.out.println(x+,+y);publicstaticvoidmain(Stringargs)intu=30,v=50;System.out.println(u+,+v);Swaps=newSwap();s.swapp(u,v);System.out.println(u+,+v);,练习,Java技术及其应用,publicclassSwap1intx,y;voidswapp(Swap1s)inttemp;System.out.println(s.x+,+s.y);temp=s.x;s.x=s.y;s.y=temp;System.out.println(s.x+,+s.y);intu=30,v=50;Swap1s=newSwap1();s.x=u;s.y=v;System.out.println(s.x+,+s.y);s.swapp(s);System.out.println(s.x+,+s.y);,参数传递小结,当传递的参数是简单类型的时候,传值,方法调用结束后原值不变;当传递的参数是引用类型的时候,传地址,方法调用结束后原值会变。,Java技术及其应用,在之前的学习中,我们知道:类的属性和方法,必须先创建对象,然后通过对象调用,为什么输出函数可以直接调用呢?System.out.println();请同学们思考:System是什么?Out是什么?println()是什么?,类成员和实例成员static关键字静态成员:静态成员变量和静态成员函数,static关键字,class类名成员变量;成员方法;class类名成员变量;成员方法;,static,static,实例成员,类成员或静态成员,类变量和实例变量,类的组成部分是:属性和方法,及成员变量和成员函数成员变量的类型分为两种:classrectintweight;/实例变量staticintheight;/类变量或静态变量,由static修饰的成员变量,称为类变量。1、一个类的不同对象,分别分配空间,一个对象的实例变量改变,不影响其他类;2、但是对于类变量,在字节码文件加载到内存时,如果没有创建对象,实例变量就不分配内存,而类变量分配了内存,思考:意味着什么?而且,所有的对象的类变量都共享同一个内存,即:如果一个对象的类变量改变,其他对象的类变量也同时改变。,类成员和实例成员,类成员(属性或方法)用static修饰的成员;属于类;所有对象共享一个类成员,只有一个。实例成员(属性或方法)无static修饰的成员;属于对象;每个对象都有各自的一个,相互独立。,类成员和实例成员,类成员用类名或对象名来调用;对类成员的修改影响整个类的所有对象的类成员;类成员方法只能对类成员变量进行操纵;实例成员用对象名来调用;对某对象实例成员的修改不会影响其他对象的实例成员;,classStudentStringname;staticStringschool=北京大学;classtpublicstaticvoidmain(Stringargs)System.out.println(Student.school);/正确System.out.println(S);/错误Studentstu1=newStudent();System.out.println(stu1.school);System.out.println();/对于类变量,可以在主函数中,不创建该类对象,而直接使用类名进行调用,也可以通过创建对象,通过对象进行调用,共享内存,实例成员和类成员举例,举例memberTest.java,类memberTest,类变量a实例变量b,方法,。,对象a,对象b,对象n,类变量a实例变量b,函数,类变量a实例变量b,函数,类变量a实例变量b,函数,类变量a,方法,实例成员方法在生成第一个对象时被分配了入口地址;,类成员方法在类被装载内存时被分配了入口地址;,Student.java,publicclassStudentStringname;staticStringschool=北京大学;publicstaticvoidmain(Stringargs)Studentstu1=newStudent();Studentstu2=newStudent();Studentstu3=newStudent();=1;=2;=3;System.out.println(+,+stu1.school);System.out.println(+,+stu2.school);System.out.println(+,+stu3.school);stu2.school=安徽大学;System.out.println(+,+stu1.school);System.out.println(+,+stu2.school);System.out.println(+,+stu3.school);/思考程序的输出结果,Java技术及其应用,对于方法,也分为:类方法和实例方法classrectintstart()/实例方法staticintstop/类方法1、对于实例方法,只有创建对象后,通过对象调用。2、对于类方法,可以不创建对象直接通过类名调用,也可以创建对象,通过对象调用。3、实例方法可以调用实例变量和类变量,而类方法不能调用实例变量,思考为什么?因为:类方法在对象创建之前就可以使用,而此时实例变量还没有分配内存。,classStudentStringname;staticStringschool=北京大学;voidstart1()System.out.println(name);System.out.println(school);staticvoidstart()System.out.println(name);System.out.println(school);,练习,classStudentStringname;staticStringschool=北京大学;voidstart1()System.out.println(name);System.out.println(school);staticvoidstart()System.out.println(school);classtpublicstaticvoidmain(Stringargs)Student.start();/类方法,可由类名直接调用,Java技术及其应用,main()方法,思考:为什么main()方法用static修饰?publicclassStudentpublicstaticvoidmain(Stringargs)java类名.main()Student.main()一个类的main方法必须用static修饰,因为Java运行时系统在开始执行一个程序前,并没有生成类的一个实例,它只能通过类名来调用main方法作为程序的入口。,static关键字小结,用static修饰的类中的成员变量或成员方法,都称为类的成员;-类没有用static修饰的,称为实例成员。-对象类的成员唯一;而对象的成员有多个,每个相互独立。类的成员由类或对象来调用;实例成员由对象来调用类的成员在类有了之后就存在了,而实例成员必须在生成对象之后才存在。,Java技术及其应用,思考:this关键字能否在类方法中调用?为什么?classRectstaticdoublewidth;staticdoubleheight;doublearea=0;staticdoublegetArea()doublearea=width*height;returnthis.area;,思考2:,在Java编程中,我们常常用System.out.println()方法来输出字符串,也许我们都已经猜到println()是方法名,但System是什么,out又是什么呢?其实System是java.lang包里面的一个类而out就是System类里面的一个静态成员变量,其类型是java.io.PrintStream类;被关键字static修饰的数据成员或方法可以直接通过“类名.数据成员”或“类名.方法”来引用,而无须先建立对象。所以System.out是应用了out这个静态数据成;而out又是一个java.io.PrintStream类的对象,所以out必然可以调用java.io.PrintStream类里面的方法,println()就是java.io.PrintStream类里的一个方法,它的作用就是用来想控制台输出信息的,classSystemstaticjava.io.PrintStreamout;/System.outclassPrintStreamprintln()/System.out.println(),包(package),由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此,同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。比如:同一文件夹下,不能有相同名称的文件,而不同文件夹下的文件名可以相同。c:/我的音乐/国歌.MP3c:/我的音乐/好听/国歌.MP3,包(package),Ex1.javapublicclassEx1classApackagep1;publicclassEx1classAp1.A,Ex2.javapublicclassEx2classApackagep2;publicclassEx2classAp2.A,package语句,package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:packagepkg1.pkg2.pkg3;Java编译器把包对应于文件系统的目录管理,package语句中,用.来指明目录的层次;,package语句,packagep1;publicclassEx1classAp1.Ap1/A.class,packagep2;publicclassEx2classAp2.Ap2/A.class,package的实际含义是指:定义当前java文件所在的文件夹路径,以及生成字节码文件的路径,命令行下编译和运行带包的Java程序,若无package语句,类都放入缺省的无名包中,对应于当前文件夹;若有packagep1;packagep1;publicclassEx1Ex1类放入p1包内,对应于文件目录:当前目录下创建p1文件夹,下放Ex1.java文件编译方式:javacp1Ex1.java运行方式:javap1.Ex1,练习,packages1.s2.s3.s4;publicclassHello如何存放Hello.java文件?如何编译和运行?当前文件夹下创建s1,再创建s2,再创建s3,再创建s4,在s4里面放Hello.java在当前文件夹下javacs1s2s3s4Hello.java在当前文件夹下javas1.s2.s3.s4.Hello,Java技术及其应用,JCreator处理带包的Java程序,packagep1;publicclassEx1classAJcreator不需把源文件放入p1中,自动在当前文件夹下创建子目录p1,并将生成的字节码文件Ex1.class和A.class存入其中。,Java技术及其应用,同一个包,即同一个文件夹下的类可以互相调用,如果属于不同包的类,怎么处理?import命令,import语句,为了能使用不在同一个包中的其他类,我们需要用import语句来引入所需要的类。importpackage1.package2.(classname|*);例如:importjava.awt.*;importjava.util.Date;Java编译器为所有程序自动引入包java.lang,因此不必用import语句引入它所包含的所有类。,import语句,importjava.util.Date;java/util/Date.class当前目录下没有java文件夹!?包的根目录由classPath决定。classPath:c:/Programfiles/java/jdk1.6/jre/lib/rt.jar;.;思考:如何引入自定义包?,Java技术及其应用,之前,我们做的所有实验,都没有定义包,如果一个源文件没有使用包语句,则得到的类没有包名,该类如果被使用,必须放在需使用工程的目录下。但是,如果有其他包中的类名和该无包类的类名相同,就可能产生混淆。比如:现有工程下有一个无名包中的类A;通过import又引入了一个类:tom.A,则默认情况下,A类认为是tom.A。正确的使用方法是:tom.Aa=newtom.A();/tom.A类Aa=newA();/无名包A类,import语句,importjava.util.Date;classmyDateDatedate=newDate();ClassmyDatejava.util.Datedate=newjava.util.Date();,小结,packagep1;即指明当前java文件的包路径,方面进行工程管理。Import,引入其他包中的类,如果引入自定义包中的类,需要在环境变量中设置CLASSPATH。Import其他包中的类时,一般情况下,最好把类和包的全名都写上。即:importa.b.c/引入a.b下的c类a.b.ctest=newa.b.c();而不要写成ctest=newc();,小结:Java程序结构,packagep;import;import;classclasspublicclass.,Java技术及其应用,0-1个,0-多个,0-多个,1个,访问权限,class类名成员变量;成员方法;类名对象名=new类名();对象名.成员变量;,Java技术及其应用,成员的访问权限,对类的成员施以一定的访问权限限定,实现类中成员在一定范围内的信息隐藏同一个类中同一个包中不同包中的子类不同包中的非子类privatedefaultprotectedpublic,成员的访问权限,private:同类。default:同类,同包。默认情况下都是tected:同类,同包,子类(不一定要同包)处在不同包中的子类可以访问父类中限定为protected的成员,但这时访问这些成员的对象必须具有子类的类型或是子类的子类类型,而不能是父类类型。public:所有,private,classTomprivatefloatweight;privatefloatf(floata,floatb)returna+b;classJerryvoidg()Tomcat=newTom();cat.weight=23f;floatsum=cat.f(3,4);,Java技术及其应用,public,classTompublicfloatweight;publicfloatf(floata,floatb)returna+b;classJerryvoidg()Tomcat=newTom();cat.weight=23f;floatsum=cat.f(3,4);,Java技术及其应用,default,classTomfloatweight;floatf(floata,floatb)returna+b;classJerryvoidg()Tomcat=newTom();cat.weight=23f;floatsum=cat.f(3,4);,Java技术及其应用,protected,classTomprotectedfloatweight;protectedfloatf(floata,floatb)returna+b;classJerryvoidg()Tomcat=newTom();cat.weight=23f;floatsum=cat.f(3,4);,Java技术及其应用,成员的访问权限,对类的成员施以一定的访问权限限定,实现类中成员在一定范围内的信息隐藏同一个类中同一个包中不同包中的子类不同包中的非子类privatedefaultprotectedpublic,练习,课后习题4-7,Java技术及其应用,访问权限一般做法,class类名privatefolatheight;privatefolatwidth;publicvoidsetHeight(floatheight)this.height=height;publicvoidsetWidth(floatwidth)this.width=width;publicfloatgetHeight()returnheight;publicfloatgetWidth()returnwidth;public成员方法;,Ja

温馨提示

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

评论

0/150

提交评论