资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第2讲 面向对象编程2.1.1 类和对象 对一个用户自定义的类,要为类取一个名字,并指 明类中包含哪些变量和方法以及相应的类型、实现等 ,这称为类的定义。类定义语句的一般形式为: 修饰符class 类名 extends 父类名 implements 接口名表 成员变量声明 / 类体 方法成员声明 【例1】定义一个名为Rect表示长方形的类,它仅包含 double类型的长length和宽width两个数据成员。 【例2】定义一个名为Rectangle表示长方形的类 ,它包含double类型的长length和宽width两个数据 成员和设置长方形长宽值的方法setDim()、计算长方 形面积的方法area()。 对象举例:设已经定义了例5.2中的Rectangle类, 可以用如下的方法来引用对象的成员: Rectangle r = new Rectangle(); / 定义类的对象 r.length,r.width / 引用对象的数据成员 r.area() / 引用对象的成员方法 【例3】利用例5.1定义的类Rect,计算长和宽分别 为20和10的长方形面积。 class RectDemo public static void main(String args) Rect rect1 = new Rect(); / 为对象rect1分配存储空间 double area; rect1.width = 20; / 向数据成员赋值 rect1.length = 10; area = rect1.width * rect1.length; /对数据成员运算 System.out.println(“长方形面积是:“ + area); 3、构造方法的作用与构成 构造方法:与类同名且没有任何返回值的方法; 对象的初始化任务要靠构造方法来完成; 一个类中可以有多个构造方法,名字相同而参数不同; 构造方法一般用于类中变量的初始化。 例: class Rect double length; double width; Rect(double l,double w) Length=l; width=w; 2.1.3 构造方法 在Java中,任何变量在被使用前都必须先设置初值。 Java提供了为类的成员变量赋初值的专门功能:构造方 法(constructor)。构造方法是一种特殊的成员方法,它的特殊性反映在如下几个方面:(1)构造方法名与类名相同。(2)构造方法不返回任何值,也没有返回类型。(3)每一个类可以有零个或多个构造方法。(4)构造方法在创建对象时自动执行,一般不能显式地直接调用。 【例6】分别计算长、宽分别为20、10和6、 3的两 个长方形面积。本程序用构造方法来初始化长方形的 大小。 class RectConstructor double length; double width; double area() return length * width; RectConstructor (double l, double w) length = l; width = w; class RectDemo3 public static void main(String args) RectConstructor rect1=new RectConstructor (20,10); RectConstructor rect2=new RectConstructor (6,3); double ar; ar = rect1.area(); System.out.println(“第一个长方形的面积是: “ + ar); ar = rect2.area(); System.out.println(“第二个长方形的面积是: “ + ar); 程序运行结果如下: 第一个长方形的面积是: 200.0 第二个长方形的面积是: 18.0 练习1:编写程序,计算长方形的面积。class Rectangle double width, height;Rectangle(double w, double h )width=w;height=h;double area()return width*height;double perimeter()return 2*(width+height); public class Lx1public static void main(String args)double w=2, h=3, c, s;Rectangle r=new Rectangle(w,h);s=r.area();c=r. perimeter();System.out.println(“长方形的面积=”+s);System.out.println(“长方形的面积=”+c);double s2=area(3.0, 4.0);System.out.println(“矩形的面积=”+s2); double s3=area(3.0, 4.0, 5.0);System.out.println(“梯形的面积=”+s3); 程序运行的结果如下: 圆的面积=28.27433388230838 矩形的面积=12.0 梯形的面积=17.5 2.2.1 类继承的实现 Java中的继承是通过extends关键字来实现的,在定 义新类时使用extends关键字指明新类的父类,就在两 个类之间建立了继承关系。 1.定义子类 通过继承系统类定义子类的例子已经见过的有例1.2 的小程序,其类头分别为: public class HelloApplet extends Applet. 一般地,在类声明中,加入extends子句来创建一个 类的子类。extends后即为父类名,若父类名又是某个 类的子类,则定义的类也是该类的(间接)子类。若 无extends子句,则该类为java.lang.Object的子类。例5.4 显示当前日期和时间,运行结果见图。import java.awt.Graphics; import java.applet.Applet; import java.util.Calendar; class Time private Calendar t;private int y, m, d, hh, mm, ss; Time ()t=Calendar.getInstance();y=t.get( t.YEAR );m=t.get( t.MONTH )+1;d=t.get( t.DATE );hh=t.get( t.HOUR_OF_DAY );mm=t.get( t.MINUTE );ss=t.get( t.SECOND );public String getDate( ) return y+ 年+m+月+d+日; public String getTime() String s=hh+ 时+mm+分+ss+秒;return s; public class ShowTime extends Applet Time t=new Time(); public void paint(Graphics g) g.drawString(当前日期: +t.getDate(),50,40);g.drawString(当前时间: +t.getTime(),50,80); 2.类继承的传递性 类继承具有传递性,即子类继承父类的所有非私 有成员,也继承父类的父类直至祖先所有的所有非 私有成员。 3.类的成员覆盖 在类的继承中,若子类(派生类)新增的成员名 称与父类(超类)成员相同,则称为成员覆盖( overriding)。 在子类中定义与父类同名成员的目的是修改父类 的属性和行为。 (1)成员变量的覆盖 若子类声明了与父类同名的变量,则父类的变量被 隐藏起来,直接使用的是子类的变量,但父类的变量 仍占据空间,可通过super或父类名来访问。 【例5.14】在子类中定义了与父类同名的变量,从 而隐藏了父类成员变量,这种隐藏变量可加super前缀 来访问。 class A int x = 100; class B extends A int x = 200; void print() System.out.println(“Subclass : “ + x); System.out.println(“Superclass : “ + super.x); public static void main(String args) (new B().print(); 程序运行结果如下: Subclass : 200 Superclass : 100 (2)成员方法覆盖 与子类可以定义与父类同名的成员变量,实现对父 类成员变量的隐藏的情况一样,子类也可以定义与父 类同名的方法,实现对父类方法的覆盖。方法成员的 覆盖与成员变量的隐藏的不同之处在于:子类隐藏父 类的成员变量只是使得它不可见,父类的同名成员变 量在子类对象中仍然占据自己的存储空间; 而子类成员方法对父类同名方法的覆盖将清除父类 方法占用的内存空间,从而使得父类的方法在子类对 象中不复存在。 方法的覆盖中需注意的是:子类在重新定义父类已 有的方法时,应保持与父类完全相同的方法头声明, 即应与父类有完全相同的方法名、返回值和参数列表 。否则就不是方法的覆盖。而是在子类定义自己的与 父类无关的成员方法,父类的方法未被覆盖,所以仍 然存在。 下述规则适用于覆盖方法: 覆盖方法的返回类型必须与它所覆盖的方法相同。 覆盖方法不能比它所覆盖的方法访问性差。 覆盖方法不能比它所覆盖的方法抛出
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号