06-继承与覆盖.doc

上传人:M****1 文档编号:542105155 上传时间:2023-10-16 格式:DOC 页数:21 大小:201.01KB
返回 下载 相关 举报
06-继承与覆盖.doc_第1页
第1页 / 共21页
06-继承与覆盖.doc_第2页
第2页 / 共21页
06-继承与覆盖.doc_第3页
第3页 / 共21页
06-继承与覆盖.doc_第4页
第4页 / 共21页
06-继承与覆盖.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《06-继承与覆盖.doc》由会员分享,可在线阅读,更多相关《06-继承与覆盖.doc(21页珍藏版)》请在金锄头文库上搜索。

1、51第6章 继承与覆盖继承是指一种类继承另一种类的成员(成员变量和成员方法),被继承的类称为父类(也称超类或基类),继承了父类的类则称为子类。覆盖是指子类成员对同名的父类成员进行修改或重写。6.1 子类在声明类时,通过使用关键字extends继承一个已定义好的类(父类),定义一个新的类(子类)。1定义子类的格式class 子类名 extends 父类名 /子类的成员变量和方法的定义写在这里2继承规则(1)如果子类和父类在同一个包中,那么子类继承了父类中除private以外的成员。 (2) 如果子类和父类在不同的包中,则子类只能继承父类中的protected、public成员。(3)子类不能继承

2、父类中的构造方法。6.2 super关键字如果子类中定义了与父类同名的成员变量,则父类中的成员变量不能被子类继承,此时称子类的成员变量隐藏了父类的成员变量;如果子类中定义了一与父类同名的方法,则父类的这个方法在子类中被隐藏,也不能被子类继承下来。如果要在子类中使用被隐藏的父类成员,就必须在子类中使用关键字super。1调用父类构造方法子类不能继承父类的构造方法,因此要使用父类的构造方法,必须在子类的构造方法中使用关键字super,而且super必须是子类构造方法中的头一条语句。【例6.1】在子类定义的构造方法中调用父类的构造方法。程序清单6-1 superDemo.javaclass Prog

3、ramLanguage /父类ProgramLanguage int year;String name;ProgramLanguage(int year,String name) this.year=year;this.name=name; System.out.println(name+ is born in +year); class Java extends ProgramLanguage/定义子类JavaJava(int year,String name) super(year,name); /调用父类构造方法对父类成员变量初始化 /下面定义测试类superDemopublic cla

4、ss superDemopublic static void main(String args) Java j2me=new Java(1991,java); (1) 在子类中调用父类构造方法的唯一方式是:super()或者super(参数表)。super()调用父类的默认构造方法,super(参数表)调用父类的带参构造方法。这两条语句必须写在子类构造方法体中的第一条语句。(2) 如果在子类的构造方法中,没有显式地使用super调用语句,则,编译器自动调用父类的默认构造方法。(3) 如果在父类中定义了构造方法,但是,没有定义默认构造方法,则,子类中就不能调用父类的默认构造方法。否则会出错。2调

5、用父类成员如果想使用父类中被子类隐藏的成员变量或方法,就要使用关键字super。【例6.2】在本例中,使用super.getLong()来调用父类中被子类隐藏的方法getLong(),使用super.getArea()调用父类中被子类隐藏的方法getArea()。程序清单6-2 superDemo2.javaimport java.applet.*; import java.awt.*;class Circle /父类Circle float r=5; /圆的半径 public Circle(float r) /构造方法 this.r=r; float getArea() /圆的面积 retu

6、rn 3.14f*r*r; float getLong() /圆的周长 return 2*3.14f*r; /子类Cylinder (圆柱) class Cylinder extends Circle float h=8.0; /圆柱的高 Cylinder(float r,float h) super(r); /调用父类构造方法,初始化父类成员变量r this.h=h; float getArea()/计算圆柱表面积。对Circle中的方法进行了重写。 float d_area;/保存2个圆的面积 float c_area;/保存圆柱侧面积d_area=2*super.getArea(); /

7、调用父类方法getArea,获得2个圆的面积 c_area=super.getLong()*h; /调用被隐藏的父类方法getLong() return (d_area+c_area) ; float getLong()/圆柱的两个圆周的总长,重写了父类方法。 return 2*2*3.14f*r; /下面定义测试类superDemo2 public class superDemo2 extends Applet Cylinder zhu; public void init() zhu=new Cylinder(); public void paint(Graphics g) g.drawSt

8、ring(圆柱的表面积=+zhu.getArea(),5,20); g.drawString(两个圆周长的和= +zhu.getLong(), 5, 40); 在父类Circle中定义了方法getLong()和方法getArea(),在子类Cylinder中,对这两个方法的方法体进行了重写,这样,子类方法与父类方法的方法声明相同,只是方法体不同,称子类方法覆盖了父类方法。【例6.3】子类的成员变量隐藏了父类中同名的成员变量。通过super使用父类中与子类同名的成员变量。程序清单6-3 superDemo3.javaimport java.applet.*; import java.awt.*;

9、class Father public int d=10; int getD() return d +80 ; class Son extends Father public int d=20; int getD() return super.d +80 ; pubilc class superDemo3 extends Applet Son sum; public void init() sum=new Son(); public void paint(Graphics g) g.drawString(sum=+ sum.getD(),200,200); 3重写父类方法时的访问权限在子类中重

10、写父类方法时,不能降低方法的访问权限。例如,在下面的代码中子类重写了父类的方法get(),该方法在父类中的访问权限是protected级别,子类重写时不允许级别低于protected。例如:import java.applet.*;import java.awt*;class Father protected float get(float x,float y) return x*y; 下面是合法的子类(Son)定义:class Son extends Father public float get(float x,float y) /重写父类方法get(),提高了访问权限(public) r

11、eturn x-y; 下面是非法的子类(Son)定义:class Son extends Father float get(float x,float y) /重写父类方法get(),降低了访问权限(默认) return x-y; 6.3 Object类Object类在java.lang包中,它是所有java类的祖先。 如果在定义一个类时,没有指定其父类,java编译器就把Object类看做其默认其父类。如,前面定义 Circle类、Father类时,没有指定它们的父类。编译器就把Object类看做其默认父类。Object类中有三个重要的实例方法,它们是:public boolean equa

12、ls(Object object)public String toString()public Object clone()(1) equals方法设ob1与ob2属于同一类。则,equals方法使用的格式如下:boolean k=Ob1.equals(Ob2); 如果ob1引用的对象与ob2引用的对象内容相同,则返回true,否则,返回false。(2) toString方法设ob1引用了一个对象。则,toString方法使用的格式如下:String str=Ob1. toString ();toString方法返回一个字符串,该字符串由ob1所属的类名、一个数字组成。例如,下面的代码:Ci

13、rcle c1=new Circle(10);String str=c1. toString ();str的值类似如: Circle2356781。其中,数字部分是在对象c1创建时,由计算机随机分配给对象c1的。 由于,所有的类都继承了Object类,因此,在实际应用中,我们在Object的子类中都对toString方法进行了覆盖。例如,我们可以在定义Circle类时,对toString方法进行覆盖:public String toString() return “Circle 的半径=”+this.radius ;(3) clone方法有时,为了在内存中复制一个新的对象。必须使用clone方法,格式如下:newObject=someObject.clone();该语句的作用是,将someObject对象复制到一个新的内存空间。要想让某个对象成为可以复制的对象,必须使该对象所属的类实现接口java.lang.Cloneable。 Object类中还包括控制线程的方法wait、notify。6.4 final关键字使用关键字final修饰的类不能被继承,即不能有子类;用final修饰的方法不能被子类重写。例如:final class ClassName final float method() /该方法被定义为final方法

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

当前位置:首页 > 生活休闲 > 社会民生

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