JAVA课件04

上传人:豆浆 文档编号:26060832 上传时间:2017-12-22 格式:PPT 页数:44 大小:302.50KB
返回 下载 相关 举报
JAVA课件04_第1页
第1页 / 共44页
JAVA课件04_第2页
第2页 / 共44页
JAVA课件04_第3页
第3页 / 共44页
JAVA课件04_第4页
第4页 / 共44页
JAVA课件04_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《JAVA课件04》由会员分享,可在线阅读,更多相关《JAVA课件04(44页珍藏版)》请在金锄头文库上搜索。

1、第5章 类的继承性与多态性,5.1 类的继承5.2 类的多态习题,新类可从现有的类中产生,将保留现有类的状态属性和方法并可根据需要加以修改。新类还可添加新的状态属性和方法,这些新增功能允许以统一的风格处理不同类型的数据。这种现象就称为类的继承。,5.1 类的继承,当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。,5.1.1 父类和子类,在类的声明语句中加入extends关键字和指定的类名即可实现类的继承,例如: public class MyAp

2、plet extends java.applet.Appletpublic class MyApplication extends Framepublic class MyApp1 extends Objectpublic class MyApp2那么,类的继承是从什么地方开始的?又是如何延续下来的呢?请看图5.1所示的模拟图。图5.1反映了Java类的层次结构。最顶端的类是Object,它在java.lang中定义,是所有类的始祖。一个类可以有多个子类,也可以没有子类,但它必定有一个父类(Object除外)。,图 5.1,子类不能继承父类中的private成员,除此之外,其他所有的成员都可以

3、通过继承变为子类的成员。另一方面,对继承的理解应该扩展到整个父类的分支,也就是说,子类继承的成员实际上是整个父系的所有成员。 因此,可以得出如下结论: 子类只能有一个父类。如果省略了extends,子类的父类是Object。子类继承了父类和祖先的成员,可以使用这些成员。在需要的时候,子类可以添加新的成员变量和方法,也可以隐藏父类的成员变量或覆盖父类的成员方法。,1. 成员变量的继承 例5.1 下面的3个程序说明从点Point类扩展到线Line类和圆Circle类的方法,这是3个公共类,不能放在同一个文件中。它们都没有输出语句,即使补上相应的 main() 使之运行也看不到什么结果。public

4、 class Point protected int x, y; Point(int a, int b) setPoint(a, b); public void setPoint(int a, int b) x=a; y=b; public int getX() return x;,5.1.2 成员变量的继承和隐藏,public int getY() return y;public class Line extends Point protected int x, y, endX, endY; Line(int x1, int y1, int x2, int y2) setLine(x1, y

5、1, x2, y2); public void setLine(int x1, int y1, int x2, int y2) x=x1; y=y1; endX=x2; endY=y2; public int getX() return x ; public int getY() return y ; public int getEndX() return endX; public int getEndY() return endY; public double length() return Math.sqrt(endX-x) * (endX-x) + (endY-y) * (endY-y)

6、;,public class Circle extends Point protected int radius; Circle(int a, int b, int r) super(a, b); setRadius(r); public void setRadius(int r) radius=r; public int getRadius() return radius; public double area() return 3.14159*radius*radius; 上例中,Point类具备一个点的特征。Line和Circle类具备线和圆的特征,但它们都是从Point继承下来的。下面

7、分析一下这3个类各自都有哪些成员。,Point: x, y / 受保护的成员变量,代表点的坐标 Point/ 点的构造方法 setPoint/ 设定点的坐标值的方法 getX, getY/ 返回坐标x和y的值的方法Line: x, y, endX, endY/ 子类受保护的成员变量,代表线的两个端点坐标 Line / 线的构造方法 setLine / 设定线的两个端点坐标值的方法 getX, getY/ 返回起点坐标x和y的值的方法 getEndX, getEndY/ 返回终点坐标endX和endY的值的方法 length / 返回线的长度的方法 x, y/ 继承父类的受保护成员变量,但被子类

8、隐藏 setPoint/ 继承父类的方法 getX, getY/ 继承父类的方法,但被子类覆盖,Circle: radius / 子类受保护的成员变量,代表圆的半径 Circle / 圆的构造方法 setRadius / 设定半径值的方法 getRadius / 返回半径值的方法 area / 返回圆面积的方法 x, y / 继承父类的受保护成员变量 setPoint / 继承父类的方法 getX, getY/ 继承父类的方法从上面的分析可以看到,子类Circle继承了父类Point中的成员变量x和y,也继承了setPoint、getX和getY方法。添加了自己的成员变量radius,成员方法

9、setRadius、getRadius和area。在构造方法Circle中,调用了父类的构造方法设定圆心坐标。,2. 成员变量的隐藏所谓隐藏是指子类重新定义了父类中的同名变量,如子类Line重新定义了x为x1,y为y1,隐藏了父类Point中的两个成员变量x和y。子类执行自己的方法时,操作的是子类的变量,子类执行父类的方法时,操作的是父类的变量。在子类中要特别注意成员变量的命名,防止无意中隐藏了父类的关键成员变量,这有可能给你的程序带来麻烦。Line还覆盖了Point的两个方法getX和getY。关于方法覆盖,请看下面的内容。,通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类

10、的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的那个方法,简称为方法覆盖。方法的覆盖(override),为子类提供了修改父类成员方法的能力。例如,子类可以修改层层继承下来的toString方法,让它输出一些更有用的信息。例5.2显示了在子类Circle中添加toString方法,用来返回圆半径和圆面积信息。,5.1.3 成员方法的覆盖,例5.2 对Object的toString方法的覆盖示例,结果如图5.2所示。图 5.2,class Circle private int radius; Circle(int r) setRadius(r); public void setRa

11、dius(int r) radius=r; public int getRadius() return radius; public double area() return 3.14159*radius*radius; public String toString() return 圆半径: +getRadius()+ 圆面积: +area(); public class O1 public static void main(String args) Circle c=new Circle(10); System.out.println(n+c.toString(); ,方法覆盖时要特别注意

12、: 用来覆盖的子类方法应和被覆盖的父类方法保持相同名称和相同返回值类型,以及相同的参数个数和参数类型。如果被覆盖的方法没有声明抛出异常,子类的覆盖方法可以有不同的抛出异常子句。有时,可能不需要完全覆盖一个方法,可以部分覆盖一个方法。部分覆盖是在原方法的基础上添加新的功能,即在子类的覆盖方法中添加一条语句: super.原父类方法名,然后加入其他语句。注意: 不能覆盖父类中的final方法。同样也不能覆盖父类中的static方法,但可以隐藏这类方法。也就是说,在子类中声明的同名静态方法实际上隐藏了父类中的静态方法。此外,非抽象子类必须覆盖父类中的抽象方法。,例5.3 说明this和super的使

13、用,运行结果如图5.3所示。图 5.3class Point protected int x, y;,5.1.4 this和super,Point(int a, int b) setPoint(a, b); public void setPoint(int a, int b) x=a; y=b; class Line extends Point protected int x, y; Line(int a, int b) super(a, b); setLine(a, b); public void setLine(int x, int y) this.x=x+x; this.y=y+y; ,

14、public double length() int x1=super.x, y1=super.y, x2=this.x, y2=this.y; return Math.sqrt(x2-x1) * (x2-x1) + (y2-y1) * (y2-y1); public String toString() return 直线端点: + super.x + , + super.y + + x + , + y + 直线长度: + this.length(); public class ThisDemo public static void main(String args) Line line=ne

15、w Line(50, 50); System.out.println(n+line.toString(); 总结上例,可以概括出this和super 的作用。,(1) this实际代表的是当前类或对象本身。在一个类中,this表示对当前类的引用,在使用类的成员时隐含着this引用,尽管可以不明确地写出,例如length和toString中对x和y的使用。当一个类被实例化为一个对象时,this就是对象名的另一种表示。通过this可顺利地访问对象,凡在需要使用对象名的地方均可用this代替。例如:,public class Demo extends java.applet.Applet implements ActionListener Button button1=new Button(Add); public void init() add(button1); button1.addActionListener(this); / 等价于button1.addActionListener(Demo); ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号