您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > linux/Unix相关 > Java语言4
Java语言程序设计资源与环境科学学院主讲教师:陈玉敏第四章类与对象面向对象的概念面向过程在一个结构体中定义窗口的大小,位置,颜色,背景等属性,对窗口进行操作的函数与窗口本身的定义没有任何关系,如HideWindow,MoveWindow,MinimizeWindow,这些函数都需要接受一个代表要被操作的窗口参数。面向对象定义窗口时,除了要指定在面向过程中规定的那些属性,如大小,位置,颜色,背景等外,还要指定该窗口可能具有的动作,如隐藏,移动,最小化等。这些函数被调用时,都是以某个窗口要隐藏,某个窗口要移动的语法格式来使用的,这是一种主语与谓语的关系。面向对象的三大特征–封装(Encapsulation)–继承(Inheritance)–多态(Polymorphism)类与对象类是对某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。如果类是汽车的设计图纸,那么将对象比作一辆辆的汽车。所以面向对象程序设计的重点是类的设计,而不是对象的设计。Java类的声明类声明语法:[类修饰符]class类名[extends父类名][implements接口名]{成员变量定义;成员方法定义;}实例:书P66类与对象classPerson{intage;voidshout(){System.out.println(“oh,mygod!Iam“+age);}}age是类的属性,也叫类成员变量。shout是方法也叫类的成员函数。shout方法可以直接访问同一个类中的age变量,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。对象的创建Personp1=newPerson();执行完后的内存状态当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型。对象的使用创建新的对象之后,我们就可以使用“对象名.对象成员”的格式,来访问对象的成员(包括属性和方法)classTestPerson{publicstaticvoidmain(String[]args){Personp1=newPerson();Personp2=newPerson();p1.age=30;p1.shout();p2.shout();}}对象的生命周期对象的比较“==”运算符与equals()方法的区别“==”运算符用于比较两个变量的值是否相等equals()方法比较两个对象中的内容是否一致classtest{publicstaticvoidmain(String[]arg){Stringstr1=newString(“abc”);Stringstr2=newString(“abc”);Stringstr3=str1;if(str1==str2)System.out.println(“true”);elseSystem.out.println(“false”);}}False,因为两个对象的首地址不一样,str1是第一个对象首地址,str2是第二个对象的首地址。str1.equals(str2)?类的封装性如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。在定义一个类的成员(包括变量和方法)时,使用private关键字说明这个成员的访问权限,这个成员成了类的私有成员,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。类的封装性一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。优点:隐藏类的实现细节;让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;便于修改,增强代码的可维护性实例:书P73Java的构造函数构造方法的特征–它具有与类相同的名称;–它不含返回值,它不能在方法中用return语句返回一个值构造方法的作用:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。使用new来创建类的新实例时,Java完成三项工作(书P74)。在java每个类里都至少有一个构造方法,如果程序员没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的构造方法,该方法什么也不做。一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。构造函数重载和一般的方法重载一样,重载的构造函数具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new关键字产生对象时,该调用哪个构造方法了。产生对象的格式:类名对象名=new类名(参数列表);重载构造方法可以完成不同初始化的操作。实例:矩形类的构造函数重载(实例:书p75)。类的继承通过继承可以简化类的定义。Java只支持单继承,不允许多重继承(不能同时继承多个类)。可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表)调用父类的构造方法。如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则在产生子类实例对象时,系统默认调用父类无参数的构造方法。类的继承classPerson{publicStringname;publicintage;publicvoidgetInfo(){System.out.println(name=+name+,age=+age);}}classStudentextendsPerson{publicStringschool;publicvoidstudy(){}}classTestStudent{publicstaticvoidmain(String[]arg){Studentst=newStudent();st.name=zhangsan;st.age=20;st.getInfo();}}类的继承classPerson//增加一个构造函数{publicPerson(Stringname,intage){this.name=name;this.age=age;}……}classStudentextendsPerson{……..}classTestStudent{publicstaticvoidmain(String[]arg){Studentst=newStudent();st.name=zhangsan;st.age=20;st.getInfo();}}编译出错:子类出现问题,找不到父类构造函数Person()。系统中默认的Student()构造函数将先调用父类不带参数构造函数。此时父类有了新构造函数,则Person()找不到了,出错。类的继承classPerson//增加一个构造函数{publicPerson(Stringname,intage){this.name=name;this.age=age;}……}classStudentextendsPerson{……..}classTestStudent{publicstaticvoidmain(String[]arg){Studentst=newStudent();st.name=zhangsan;st.age=20;st.getInfo();}}publicStudent(){super(Zhangsan,15);}防止编译出错的两种方法:1、在父类中增加无参数构造函数;2、在子类增加构造函数,用super调用父类的构造方法。publicPerson(){}覆盖父类的方法覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。实例p76如果在子类中想调用父类中的那个被覆盖的方法,我们可以用super.方法的格式。覆盖方法时,不能使用比父类中被覆盖的方法更严格的访问权限。类的多态性多态,即一个名字可具有多种语义。在面向对象的语言中,多态引用表示可以引用多个类的实例。应用程序不必为每一个派生类(子类)编写调用函数,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性。派生类的功能可以被基类的引用变量引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。类的多态性多态,即一个名字可具有多种语义。在面向对象的语言中,多态引用表示可以引用多个类的实例。应用程序不必为每一个派生类(子类)编写调用函数,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性。派生类的功能可以被基类的引用变量引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。类的多态性classPolygon{publicPolygon(){}publicvoiddraw(){System.out.println(Polygon);}}classRectangleextendsPolygon{publicRectangle(){}publicvoiddraw(){System.out.println(Rectangle);}}publicclassGraphics{publicstaticvoidmain(Stringargs[]){Polygonpoly=newPolygon();Rectanglerect=newRectangle();poly.draw();poly=rect;poly.draw();}}输出:PolygonRectangle问与答:书P79一个类实例编程编写一个线段类MyLine,要求如下:主要属性有:pnt1,pnt2端点,类型为Point(java.awt.Point)编写构造方法,如(intx1,inty1,intx2,inty2)或(Pointp1,Pointp2)编写成员方法。如:•检查线段是否位于第一象限check…•求线段的长度length()…•求该线段中点的x坐标•其他方法。编写测试程序Graphics类与图形绘制—Component.getGraphics方法,将返回Graphics类对象。—Graphics.drawLine(intx1,inty1,intx2,inty2)方法。—Graphics.drawString(Stringstr,intx,inty)方法。注意:drawString方法的坐标参数中(x,y)为文本的左下角。编程实例:在编写的MyLine类基础上,为MyLine添加一个DrawMe(Graphicsg)方法,编写Applet上绘制一组线段(线段不少于5条)的程序。Graphics类与图形绘制—MyLine类中添加DrawMe()方法。publicvoidDrawMe(Graphicsg){g.drawLine(pnt1.x,pnt1.y,pnt2.x,pnt2.y);}—编写一个Applet的继承类。importjava.applet.Applet;importjava.awt.Graphics;publicclassappletMylineextendsApplet{publicvoidpaint(Graphicsg){mylinemline1=newmyline(10,10,30,30);mline1.DrawMe(g);}}—编写*.html文件调用该Applet
本文标题:Java语言4
链接地址:https://www.777doc.com/doc-7028426 .html