资源预览内容
第1页 / 共57页
第2页 / 共57页
第3页 / 共57页
第4页 / 共57页
第5页 / 共57页
第6页 / 共57页
第7页 / 共57页
第8页 / 共57页
第9页 / 共57页
第10页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第4 4章章继承与多态继承与多态4.1 继承与多态的实现技术继承继承 继承是指一个类的定义可以基于另外一个已经继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的存在的类,即子类基于父类,从而实现父类代码的重用。两个类之间的这种继承关系可以用重用。两个类之间的这种继承关系可以用UMLUML图形图形符号表示符号表示: : 父类与子类相比较,涵盖了更加共性的内父类与子类相比较,涵盖了更加共性的内容,更加具有一般性,而子类所添加的内容,更加具有一般性,而子类所添加的内容更加具有个性,是一般性之外的特殊内容更加具有个性,是一般性之外的特殊内容,因此,这种类的继承关系充分地反映容,因此,这种类的继承关系充分地反映了类之间的了类之间的“一般一般- -特殊特殊”关系。关系。 类的继承具有传递性,即子类还可以再派类的继承具有传递性,即子类还可以再派生子类,最终形成一个类层次结构。生子类,最终形成一个类层次结构。 在在JavaJava语言中,通过定义子类支持继承性。语言中,通过定义子类支持继承性。不仅如此,不仅如此,JavaJava还提供了抽象类和接口,还提供了抽象类和接口,以便使类层次得到更高级别的抽象。以便使类层次得到更高级别的抽象。多态性多态性 多态性是面向对象程序设计的又一个核心概多态性是面向对象程序设计的又一个核心概念,它有助于增加软件系统的可扩展性、自然性和念,它有助于增加软件系统的可扩展性、自然性和可维护性。所谓多态是指不同的类对象收到同一个可维护性。所谓多态是指不同的类对象收到同一个消息可以产生完全不同的响应效果的现象。利用多消息可以产生完全不同的响应效果的现象。利用多态机制,用户可以发送一个通用的消息给各个类对态机制,用户可以发送一个通用的消息给各个类对象,而实现细节由接收对象自行决定,这样,同一象,而实现细节由接收对象自行决定,这样,同一个消息可能会导致调用不同的方法。个消息可能会导致调用不同的方法。 类层次结构举例类层次结构举例4.2 4.2 类的继承类的继承4.2.1 4.2.1 定义子类定义子类 子类是通过在定义类时利用关键字子类是通过在定义类时利用关键字extendsextends指出指出父类实现的,其语法格式为:父类实现的,其语法格式为:Modifier class ClassName extends SuperClassName /ClassBody Modifier Modifier 是类定义修饰符是类定义修饰符,ClassNameClassName 是子类的是子类的名称名称,extendsextends是指出父类的关键字,是指出父类的关键字,SuperClassNameSuperClassName是直接父类的名称,是直接父类的名称,ClassBodyClassBody是是所有子类成员的定义。所有子类成员的定义。最简单的Applet应用程序的类定义import java.applet.*;public JavaApplet extends Applet public void paint(Graphics g) g.drawString(This is a Applet.,50,50); 一个有关几何图元处理的例子 任何一个几何图元都有颜色和原点这两个基本属性。矩任何一个几何图元都有颜色和原点这两个基本属性。矩形是一种图元,它还有长(形是一种图元,它还有长(longlong)、)、宽(宽(widthwidth)两个属两个属性,正方形是一种特殊的矩形,它的特殊性在于长和宽相性,正方形是一种特殊的矩形,它的特殊性在于长和宽相等。这三个类之间的关系可以用图所示的等。这三个类之间的关系可以用图所示的UMLUML类图描述类图描述: :ShapRectangleSquareShapeShape类类 设定两个属性:一个是几何图元的颜色因此,我们设定两个属性:一个是几何图元的颜色因此,我们要定义一个要定义一个ColorColor类类另一个是几何图元的原点,由另一个是几何图元的原点,由x x和和y y惟一确定,为此,需要定义一个惟一确定,为此,需要定义一个PointPoint类类。ColorColor类定义类定义public class Color /Color类定义类定义 private int red; /红色红色 private int green; /绿色绿色 private int blue; /蓝色蓝色 public Color()red=0;green=0;blue=0; /构造方法构造方法public Color(int red,int green,int blue) /构造方法构造方法 if (red255) this.red=0;else this.red=red;if (green255) this.green=0;else this.green=green;if (blue255) this.blue=0;else this.blue=blue; public void setColor(int red,int green,int blue) /设置颜色设置颜色 if (red255) this.red=0; else this.red=red; if (green255) this.green=0; else this.green=green; if (blue255) this.blue=0; else this.blue=blue;public int getRed()return red; /获取红色获取红色public int getGreen()return green; /获取绿色获取绿色public int getBlue()return blue; /获取蓝色获取蓝色public String toString() /将颜色信息转换成字符串描述形式将颜色信息转换成字符串描述形式 return Red: +red+ ,Green: +green+ ,Blue: +blue; PointPoint类定义类定义public class Point /Point类定义类定义 private int x,y; /x和和y坐标点坐标点 public Point()x=0;y=0; /构造方法构造方法 public Point(int x,int y) this.x=x;this.y=y; /构造方法构造方法 public Point(Point point) /构造方法构造方法 x=point.x; y=point.y; public int getX()return x; /获取获取x public int getY()return y; /获取获取y public void setPoint(int x,int y) /设置坐标点设置坐标点 this.x=x0?0:x; this.y=y0?0:y; public String toString() /将坐标信息转换成字符串描述形式将坐标信息转换成字符串描述形式 return (+x+,+y+); ShapeShape类的定义类的定义 ShapeShape类含有两个成员变量,一个是几何图元的颜色类含有两个成员变量,一个是几何图元的颜色colorcolor,另一个是几何图元的原点另一个是几何图元的原点originorigin ShapeShape类定义类定义public class Shape /Shape类定义类定义 private Color color; /颜色属性颜色属性 private Point origin; /原点属性原点属性 public Shape() /构造方法构造方法 color=new Color(); origin=new Point(); public Shape(Color c,Point o) /构造方法构造方法 color=c; origin=o; public void setShape(Color c,Point o)/设置几何图形的颜色和原点设置几何图形的颜色和原点 color=c; origin=o; public Color getColor()return color; /获取颜色获取颜色 public Point getOrigin()return origin; /获取原点获取原点 public String toString() /将几何图形的信息转换成字符串描述形式将几何图形的信息转换成字符串描述形式 return color.toString()+n+origin.toString(); Shape Shape类由类由ColorColor和和PointPoint类组合而成,属于类组合而成,属于“整体整体- -部分部分”关系,若用关系,若用UMLUML类图描述应如图类图描述应如图: :RectangleRectangle类的类的UMLUML类图描述类图描述RectangleRectangle类定义类定义public class Rectangle extends Shape /Rectangle类定义类定义 private int long; /长长 private int width; /宽宽 public Rectangle() /构造方法构造方法 super(); /调用父类的构造方法调用父类的构造方法 long=0; width=0; public Rectangle(Color c,Point o,int l,int w) /构造方法构造方法 super(c,o); long=l; width=w; public int getLong()return long; /获取长度获取长度 public int getWidth()return width; /获取宽度获取宽度 public void setLW(int l,int w)long=l;width=w; /设置长、宽设置长、宽 SquareSquare类类 SquareSquare类不需要增加新的成员变量,只重新定类不需要增加新的成员变量,只重新定义一些适用于正方形的成员方法或更改一些成员方义一些适用于正方形的成员方法或更改一些成员方法的接口形式以便更加适用于正方形即可。法的接口形式以便更加适用于正方形即可。SquareSquare类定义类定义public class Square extends Rectangle /Square类定义类定义 public Square() super(); public Square(Color c,Point o,int e) super(c,o,e,e); public int getEdge() return getLong(); /获取边长获取边长 public void setEdge(int e) setLW(e,e); /设置边长设置边长 在在JavaJava语言中,子类将继承父类的成员,但子语言中,子类将继承父类的成员,但子类对象对父类成员的可访问性却由访问属性控制。类对象对父类成员的可访问性却由访问属性控制。 如果子类与父类在同一个包中,子类可以直接如果子类与父类在同一个包中,子类可以直接访问父类具有访问父类具有publicpublic、protecedproteced和默认访问属性的和默认访问属性的成员。成员。 如果子类和父类不在同一个包中,子类只能够如果子类和父类不在同一个包中,子类只能够直接访问父类具有直接访问父类具有publicpublic、protecedproteced访问属性的成访问属性的成员,而具有员,而具有privateprivate和默认访问属性的成员需要通和默认访问属性的成员需要通过具有过具有publicpublic或或protectedprotected访问属性的成员方法实访问属性的成员方法实现访问目的。现访问目的。 在同一个包中子类访问父类成员的规则在同一个包中子类访问父类成员的规则在不同包中子类访问父类成员的规则在不同包中子类访问父类成员的规则4.2.2 4.2.2 子类的构造方法子类的构造方法 在在JavaJava语言中,子类不负责调用父类中带参数的构造方语言中,子类不负责调用父类中带参数的构造方法。若要在创建子类对象时希望对从父类继承的成员变量初法。若要在创建子类对象时希望对从父类继承的成员变量初始化,就要在子类的构造方法中利用始化,就要在子类的构造方法中利用super()super()调用父类的构调用父类的构造方法,并且必须将它作为子类构造方法中的第一条语句。造方法,并且必须将它作为子类构造方法中的第一条语句。如果第一条语句不是调用父类构造方法的语句,系统将自动如果第一条语句不是调用父类构造方法的语句,系统将自动地插入一条调用父类默认构造方法的语句。由于默认的构造地插入一条调用父类默认构造方法的语句。由于默认的构造方法不带参数,所以,如果父类定义了带参数的构造方法,方法不带参数,所以,如果父类定义了带参数的构造方法,而没有定义不带参数的构造方法,将会出现编译错误。而没有定义不带参数的构造方法,将会出现编译错误。 简单的例子简单的例子public class Animal /动物类动物类 private String type; /动物种类动物种类 public Animal(String type) /构造方法构造方法 this.type=new String(type); public String toString() /将将Animal类对象的内容转换成字符串类对象的内容转换成字符串的描述形式的描述形式 return This is a +type; 在在AnimalAnimal类的基础上,定义一个类的基础上,定义一个DogDog类类public class Dog extends Animal /狗类狗类 private String name; private String breed;public Dog(String name) super(Dog); /调用父类的构造方法调用父类的构造方法 this.name=name; breed=Unknow; public Dog(String name,String breed) super(Dog); /调用父类的构造方法调用父类的构造方法 this.name=name; this.breed=breed; 在在DogDog类中,定义了两个构造方法。为了初始化类中,定义了两个构造方法。为了初始化typetype属性,需要在构造方法中,调用父类的构造方属性,需要在构造方法中,调用父类的构造方法,由于它们传递的参数都是法,由于它们传递的参数都是“Dog”Dog”,所以,不管所以,不管调用哪个构造方法,调用哪个构造方法,typetype都将被初始化为都将被初始化为“Dog”Dog”。但是,如果在这两个构造方法中,第一条语句不是但是,如果在这两个构造方法中,第一条语句不是调用父类的构造方法,将会出现编译错误,这是因调用父类的构造方法,将会出现编译错误,这是因为,此时系统会自动地在第一条语句的位置添加调为,此时系统会自动地在第一条语句的位置添加调用父类的默认构造方法的语句,但在用父类的默认构造方法的语句,但在AnimalAnimal类中,类中,不存在不带参数的构造方法。不存在不带参数的构造方法。4.2.3 4.2.3 supersuper super super是是JavaJava语言的关键字,用来表示直接父类语言的关键字,用来表示直接父类的引用。前面已经看到,若在子类中调用父类的构的引用。前面已经看到,若在子类中调用父类的构造方法,就需要借助于这个关键字。另外,如果在造方法,就需要借助于这个关键字。另外,如果在子类中,希望使用父类中的那些被子类覆盖的成子类中,希望使用父类中的那些被子类覆盖的成员,也需要利用员,也需要利用supersuper实现。实现。 4.2.4 4.2.4 通用父类通用父类ObjectObject Java Java语言将所有的类都作为语言将所有的类都作为ObjectObject类的子类。类的子类。首先,一个首先,一个ObjectObject类型的变量可以用来引用任何类类型的变量可以用来引用任何类的对象。当在程序中,处理未知类型的对象时这个的对象。当在程序中,处理未知类型的对象时这个功能显得尤为重要;其次,可以将成员方法的参数功能显得尤为重要;其次,可以将成员方法的参数设置为设置为ObjectObject类型,以便方法能够接收参数传递进类型,以便方法能够接收参数传递进来的任何类型的对象;最后,在来的任何类型的对象;最后,在ObjectObject类中提供了类中提供了所有对象都应该具有的行为方法,这样可以更好地所有对象都应该具有的行为方法,这样可以更好地统一这些成员方法的接口形式。统一这些成员方法的接口形式。 ObjectObject类中类中7 7个常用的个常用的publicpublic成员方法成员方法成员方法 描述toString() 该成员方法以String类对象的形式返回当前对象的字符串描述。 equals() 该成员方法通过参数带入一个对象,并将它与当前对象进行比较。 getClass() 该成员方法返回一个Class类对象,该对象内部包含了一些能够标识当前对象的信息。 hashCode() 该成员方法计算一个对象的哈希码,并将其返回。 notify() 该成员方法可以唤醒一个与当前对象关联的线程。 notifyAll() 该成员方法可以唤醒与当前对象关联的所有线程。 wait() 该成员方法将导致线程等待一个指定的时间间隔或等待另一个线程调用当前对象的notify()或notifyAll()方法。 4.3 类成员的隐藏与重载 在子类继承父类成员的同时,子类自己还可以定在子类继承父类成员的同时,子类自己还可以定义一些新的成员。当子类中定义的新成员变量与父义一些新的成员。当子类中定义的新成员变量与父类中某个成员变量的名字相同时,子类会将父类相类中某个成员变量的名字相同时,子类会将父类相应的成员变量隐藏起来。当子类中定义的成员方法应的成员变量隐藏起来。当子类中定义的成员方法与父类中某个成员方法的签名完全一样时,子类同与父类中某个成员方法的签名完全一样时,子类同样将父类的相应成员方法隐藏起来,这种现象被称样将父类的相应成员方法隐藏起来,这种现象被称为覆盖。倘若只是子类中定义的成员方法与父类中为覆盖。倘若只是子类中定义的成员方法与父类中某个成员方法的名字相同,则称为重载。某个成员方法的名字相同,则称为重载。4.3.1 4.3.1 成员变量的继承与隐藏成员变量的继承与隐藏 子类将继承父类中除私有访问属性的所有成员子类将继承父类中除私有访问属性的所有成员变量,除此之外,子类还可以自行定义一些成员变变量,除此之外,子类还可以自行定义一些成员变量,这些新的成员变量有些用来扩展父类的描述细量,这些新的成员变量有些用来扩展父类的描述细节,有些用来将父类中的某个成员变量隐藏起来,节,有些用来将父类中的某个成员变量隐藏起来,使之更加适于描述特定的对象类型。在程序设计使之更加适于描述特定的对象类型。在程序设计中,这种子类隐藏父类成员变量的形式使用的并不中,这种子类隐藏父类成员变量的形式使用的并不多。如果不是必要,建议不要这样设计成员变量,多。如果不是必要,建议不要这样设计成员变量,以便降低程序的可读性,增加系统的资源开销。以便降低程序的可读性,增加系统的资源开销。 4.3.24.3.2成员方法的继承、重载与覆盖成员方法的继承、重载与覆盖 子类将继承父类除私有访问属性的所有成员方子类将继承父类除私有访问属性的所有成员方法,除此之外,子类还可以自行定义一些成员方法,除此之外,子类还可以自行定义一些成员方法,其中主要包括下列几种形式:法,其中主要包括下列几种形式:q在父类中没有的、全新的成员方法。这些成员方法将用来在父类中没有的、全新的成员方法。这些成员方法将用来扩展父类的接口形式,增加子类对象的操作功能。扩展父类的接口形式,增加子类对象的操作功能。q子类中定义与父类具有相同签名的成员方法。这些成员方子类中定义与父类具有相同签名的成员方法。这些成员方法起到了覆盖父类相应成员方法的作用,因此又称为成员法起到了覆盖父类相应成员方法的作用,因此又称为成员方法的覆盖。方法的覆盖。q子类中定义的某个成员方法只是与父类中的某个成员方法子类中定义的某个成员方法只是与父类中的某个成员方法的名字相同,称为成员方法的重载。的名字相同,称为成员方法的重载。4.4 多态性的实现 多态性是指不同类的对象调用同一个签名的成员多态性是指不同类的对象调用同一个签名的成员方法,却执行不同的代码段的现象。方法,却执行不同的代码段的现象。若要实现多态若要实现多态性,需要具备下面两个条件。性,需要具备下面两个条件。q多态性作用于子类,它是依赖于类层次结构中的一项新功多态性作用于子类,它是依赖于类层次结构中的一项新功能。在能。在JavaJava语言中,提供了一个指向父类对象的引用可以语言中,提供了一个指向父类对象的引用可以被用来指向它的任何子类对象的能力,这是实现多态性的被用来指向它的任何子类对象的能力,这是实现多态性的先决条件。先决条件。 q若得到多态性的操作,相应的成员方法必须同时包含在父若得到多态性的操作,相应的成员方法必须同时包含在父类和子类中,且对应的成员方法签名完全一样,子类中该类和子类中,且对应的成员方法签名完全一样,子类中该方法的访问属性不能严于父类中该方法的访问属性。如果方法的访问属性不能严于父类中该方法的访问属性。如果这个成员方法在父类中不存在,就不能使用父类型对象引这个成员方法在父类中不存在,就不能使用父类型对象引用调用它。用调用它。实现多态性需要的基本步骤实现多态性需要的基本步骤q定义一个父类的引用定义一个父类的引用q让该引用指向其子类对象让该引用指向其子类对象q使用该对象调用成员方法使用该对象调用成员方法实现多态性的例子实现多态性的例子 AnimalAnimal、DogDog、CatCat、DuckDuck类关系的类关系的UMLUML类图类图 AnimalAnimal类的定义:类的定义:import java.util.Random;class Animal /动物类动物类 protected String type; /种类种类 protected String name; /名称名称 protected String breed; /品种品种 public Animal(String type,String name,String breed) this.type=new String(type); this.name=new String(name); this.breed=new String(breed); public String toString() return This is a +type+nIts +name+ the +breed; public void sound()DogDog类,类,Cat类类Duck类定义:类定义:class Dog extends Animal /Dog类类 public Dog(String name) super(Dog,name,Unknow); public Dog(String name,String breed) super(Dog,name,breed); public void sound() System.out.println(Woof Woof); /发出狗的叫声发出狗的叫声class Cat extends Animal /Cat类类 public Cat(String name) super(Cat,name,Unknow); public Cat(String name,String breed) super(Cat,name,breed); public void sound() System.out.println(Miiaooww); /发出猫的叫声发出猫的叫声class Duck extends Animal /Duck类类 public Duck(String name) super(Duck,name,Unknow); public Duck(String name,String breed) super(Duck,name,breed); public void sound() System.out.println(Quack quackquack); /发发出出鸭鸭子子的的叫声叫声 Animal是一个具有抽象意义的类。这是一个具有抽象意义的类。这是因为在现实世界中,每个动物都一是因为在现实世界中,每个动物都一定属于某个特定的种类,因此,这个定属于某个特定的种类,因此,这个类中的类中的sound()成员方法的方法体为空,成员方法的方法体为空,即本身没有任何特定的操作,只是为即本身没有任何特定的操作,只是为了实现多态性而设置。在了实现多态性而设置。在Dog、Cat和和Duck中,覆盖了中,覆盖了Animal类中的这个成类中的这个成员方法,它们根据具体动物的特点发员方法,它们根据具体动物的特点发出不同的叫声。出不同的叫声。 测试类的定义:测试类的定义:public class TryPolymorphism /测试类测试类public static void main(String args) Animal theAnimals= /创建包含创建包含Dog、Cat和和Duck对象的数组对象的数组 new Dog(Rover,Poodle), new Cat(Max,Abyssinian), new Duck(Daffy,Aylesbury) ; Animal petChoice; /声明父类的引用声明父类的引用 Random select=new Random(); /创建随机数对象创建随机数对象 for (int i=0;i5;i+) petChoice=theAnimalsselect.nextInt(theAnimals.length); System.out.println(nYour Choice:n+petChoice); petChoice.sound(); 每次执行每次执行sound()sound()成员方法时都将根据成员方法时都将根据petChoicepetChoice当前引用的对象类型当前引用的对象类型调用相应的代码段,这就是典型的多态性效果。调用相应的代码段,这就是典型的多态性效果。 4.5 抽象类 概念是对类进行高层抽象的结果,可实例化的概念是对类进行高层抽象的结果,可实例化的类是抽象概念的具体表现。在类是抽象概念的具体表现。在JavaJava语言中,用抽象语言中,用抽象类表示概念性的事物,用类表示可实例化的实体类类表示概念性的事物,用类表示可实例化的实体类别,例如,可以用别,例如,可以用“学生学生”类描述类描述“学生学生”这个抽这个抽象的象的概念,用概念,用“小学生小学生”、“中学生中学生”、“大学生大学生” 描描述具体的学生类别,这些类可以被实例化,是述具体的学生类别,这些类可以被实例化,是“学学生生”概念的具体体现。概念的具体体现。Java语言中抽象类的声明语言中抽象类的声明在在Java语言中,抽象类就是用语言中,抽象类就是用abstract修饰符声明的类。其修饰符声明的类。其格式如下所示:格式如下所示:abstract class className /成员变量和成员方法成员变量和成员方法其中的成员方法既可以是抽象方法,也可以是一般的成员方其中的成员方法既可以是抽象方法,也可以是一般的成员方法。所谓抽象方法是指在类定义中,只被声明原型,而不定法。所谓抽象方法是指在类定义中,只被声明原型,而不定义方法体的成员方法。其具体定义格式为:义方法体的成员方法。其具体定义格式为: abstract returnType methodName(parameterList)其中,其中,abstract是声明抽象方法的关键字,是声明抽象方法的关键字,returnType是返是返回类型,回类型,methodName是抽象方法的名称,是抽象方法的名称,parameterList是是参数列表。由于抽象方法是不完整的成员方法,因此,它只参数列表。由于抽象方法是不完整的成员方法,因此,它只能包含在不能够被实例化的抽象类中。能包含在不能够被实例化的抽象类中。使用抽象类时,需要注意下面几点:使用抽象类时,需要注意下面几点:任何包含抽象方法的类都必须被定义成抽象类任何包含抽象方法的类都必须被定义成抽象类由于抽象类不是一个完整的类,因此不能够被实由于抽象类不是一个完整的类,因此不能够被实例化例化抽象类主要用来派生子类,且在子类中必须覆盖抽象类主要用来派生子类,且在子类中必须覆盖抽象类中的所有抽象方法,以便完善它们的定义抽象类中的所有抽象方法,以便完善它们的定义static、private和和final修饰符不能应用于抽象方法修饰符不能应用于抽象方法和抽象类中。和抽象类中。4.6 接口4.6.1 4.6.1 接口的声明接口的声明声明接口的基本格式为:声明接口的基本格式为: public interface public interface interfacenameinterfacename 常量声明;常量声明; 抽象方法声明;抽象方法声明; publicpublic为接口的访问属性。在接口中,只允许出现常量和成为接口的访问属性。在接口中,只允许出现常量和成员方法的定义,常量必须为员方法的定义,常量必须为public static finalpublic static final,因此可因此可以省略,成员方法必须是抽象方法,所以也可以省略以省略,成员方法必须是抽象方法,所以也可以省略abstractabstract修饰符。修饰符。接口实例接口实例public interface Conversions /各种计量单位转换接口各种计量单位转换接口 double INCH_TO_MM=25.4; /1英寸英寸=25.4毫米毫米 double OUNCE_TO_GRAM=28.349523125; /1盎司盎司=28.349523125克克 double POUND_TO_GRAM=453.5924; /1磅磅=453.5924克克 double HP_TO_WATT=745.7; /1马力马力=745.7瓦特瓦特 double WATT_TO_HP=1.0/HP_TO_WATT; /1瓦特瓦特=1.0/745.7马力马力 double inchToMM(double inches); /英寸转换成毫米英寸转换成毫米 double ounceToGram(double ounces); /盎司转换成克盎司转换成克 double poundToGram(double pounds); /磅转换成克磅转换成克 double HPToWatt(double hp); /马力转换成瓦特马力转换成瓦特 double wattToHP(double watts); /瓦特转换马力瓦特转换马力ConversionsConversions接口的接口的UMLUML图形表示形式图形表示形式4.6.2 4.6.2 接口的实现接口的实现 接口是一种用来声明常量和操作行为格式接口是一种用来声明常量和操作行为格式的特殊抽象类,在接口中声明的所有成员的特殊抽象类,在接口中声明的所有成员方法都是抽象方法,因此,接口不能实例方法都是抽象方法,因此,接口不能实例化,需要构造一个类,并在该类中覆盖接化,需要构造一个类,并在该类中覆盖接口中的所有方法,以便将其完善,我们将口中的所有方法,以便将其完善,我们将此称为某个类实现接口。此称为某个类实现接口。实现实现ConversionsConversions接口的类定义接口的类定义public class MyClass implements Conversions /实现实现Conversions接口接口 public double inchToMM(double inches) return inches*INCH_TO_MM; public double ounceToGram(double ounces) return ounces*OUNCE_TO_GRAM; public double poundToGram(double pounds) return inches*POUND_TO_GRAM; public double HPToWatt(double hp) return inches* HP_TO_WATT; public double wattToHP(double watts) return inches* WATT _TO_ HP; implements Conversions说说明明MyClass类类将将实实现现Conversions接接口口,因因此此,在在MyClass类类定定义义中中必必须须实实现现该该接接口口中中的的所所有有抽抽象象方方法法。这这样样一一来来,就就可可以以通通过过MyClass类类细细化化接接口口中中的的所所有有操操作作。有有了了MyClass类类之之后后,就就可可以以创创建建MyClass类类的对象。的对象。 例如:例如: MyClass MyObject=new MyClass(); System.out.println(1 pound is +poundToGram(1); 如果在类定义时,指明实现某个接口,但在类中如果在类定义时,指明实现某个接口,但在类中并没有覆盖接口中的所有抽象方法,则这个类就必并没有覆盖接口中的所有抽象方法,则这个类就必须被声明成抽象类须被声明成抽象类:public abstract class MyClass implements Conversions public double inchToMM(double inches) return inches*INCH_TO_MM; public double ounceToGram(double ounces) return ounces*OUNCE_TO_GRAM; 由于这个类是抽象类,所以不能创建该类的对由于这个类是抽象类,所以不能创建该类的对象,必须再定义一个象,必须再定义一个MyClassMyClass子类,并在这个子类子类,并在这个子类中实现上述接口中的其余方法。中实现上述接口中的其余方法。接口的主要应用接口的主要应用 接口是一种特殊形式的抽象类,它主要用来组织接口是一种特殊形式的抽象类,它主要用来组织公用的常量,并统一操作行为的格式,通常它被应公用的常量,并统一操作行为的格式,通常它被应用在两个主要方面:用在两个主要方面:q是用接口包装常量。我们可以将各式各样的常量是用接口包装常量。我们可以将各式各样的常量放在接口中,让每个使用这些常量的类对象实现放在接口中,让每个使用这些常量的类对象实现这个接口,从而达到享有这些常量的目的这个接口,从而达到享有这些常量的目的q用接口实现多态性。将成员方法从类中分离出来用接口实现多态性。将成员方法从类中分离出来组成一个接口,随后由每个类实现这个接口组成一个接口,随后由每个类实现这个接口4.7 4.7 包包 包是类和接口的集合。将所有的类和接口按功包是类和接口的集合。将所有的类和接口按功能分别放置在不同的包中主要有两点好处:一是便能分别放置在不同的包中主要有两点好处:一是便于将若干个已存在的类或接口整体地添加到程序代于将若干个已存在的类或接口整体地添加到程序代码中;二是避免出现类名冲突的现象。码中;二是避免出现类名冲突的现象。JavaJava语言规语言规定,在一个包中不允许有相同名称的类文件,但对定,在一个包中不允许有相同名称的类文件,但对于在不同包中的类文件没有这种限制,这是因为加于在不同包中的类文件没有这种限制,这是因为加载每个类时,必须指明该类所在的包名,以此区别载每个类时,必须指明该类所在的包名,以此区别不同包中的类。不同包中的类。4.7.1 4.7.1 创建包创建包 包的概念是通过创建目录实现的。创包的概念是通过创建目录实现的。创建一个包就是用包的名称在文件系统建一个包就是用包的名称在文件系统下创建一个目录。在创建的目录下,下创建一个目录。在创建的目录下,既可以存放类文件或接口文件,也可既可以存放类文件或接口文件,也可以包含子目录,这些子目录是该包中以包含子目录,这些子目录是该包中的子包。的子包。创建一个包且将类文件放入创建一个包且将类文件放入其中的语法格式为:其中的语法格式为: package packageName;包的实例包的实例 若将类文件放入若将类文件放入userPackageuserPackage中,可以这样写:中,可以这样写: package package userPackageuserPackage; ; 一条包语句必须是文件中的第一条语句。如果在一条包语句必须是文件中的第一条语句。如果在一个类文件中,包含了这样一条语句,系统就会自一个类文件中,包含了这样一条语句,系统就会自动地在指定路径下寻找这个包,即目录名。若不存动地在指定路径下寻找这个包,即目录名。若不存在,立即创建,并将该文件放入这个包中。如果希在,立即创建,并将该文件放入这个包中。如果希望将在一个文件中定义的类或接口放在不同的包望将在一个文件中定义的类或接口放在不同的包中,就只能将它们分别放在不同的文件中,并利用中,就只能将它们分别放在不同的文件中,并利用包语句指定不同的包。包语句指定不同的包。指定子包指定子包 指定一个包中的子包,就需要将每个包按层次指定一个包中的子包,就需要将每个包按层次顺序书写成一个包序列,包之间用逗号分隔。例顺序书写成一个包序列,包之间用逗号分隔。例如,若希望将一个类文件放入如,若希望将一个类文件放入userPackage1userPackage1的子包的子包userPackage2userPackage2的子包的子包 userPackage3userPackage3中,就应该将包中,就应该将包语句写成:语句写成: package userPackage1. userPackage2. userPackage3;4.7.2 4.7.2 加载包加载包 对于在包中具有对于在包中具有publicpublic访问属性的类或接口,访问属性的类或接口,可以通过导入语句(可以通过导入语句(importimport)将其添加到程序代码将其添加到程序代码中,并通过类名或接口名引用这些类或接口。导入中,并通过类名或接口名引用这些类或接口。导入语句的基本格式为语句的基本格式为importimport后跟包名序列及类名。后跟包名序列及类名。 import userPackage.*;userPackageuserPackage是包名,是包名,.*.*代表将包中的所有类和接代表将包中的所有类和接口都加载进来。口都加载进来。 import userPackage1. userPackage2. userPackage3.*; 这条语句表示将这条语句表示将userPackage1userPackage1包中的子包包中的子包userPackage2userPackage2的的子子包包 userPackage3userPackage3中中的的所所有有类类和和接接口加载进来。口加载进来。JAVA标准包标准包1包名描述java.lang包含Java语言所使用的基础类。java.io包含支持输入/输出操作的所有标准类。java.awt包含支持Java的图形用户接口的标准类。javax.swing提供支持Swing的GUI组件的类。javax.swing.border 支持生成Swing组件的边框类。javax.swing.event支持Swing组件的事件处理类。JAVA标准包标准包2java.awt.geom包含用二维图元绘画的类。java.awt.image 包含支持图象处理的类。java.applet包含编写Applet程序的类。java.util包括支持管理数据集合、访问数据和时间信息,以及分析字符串的类。java.util.zip包含支持建立. Jar(Java Archive)文件的类。java.awt.event包括支持事件处理的类。java.sql包含支持使用标准SQL对数据库访问的类。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号