实验3继承和多态一、实验目的:1、学习和使用类的继承。2、掌握关键字super的意义和用法。3、学习掌握类的方法覆盖技术。4、熟悉Object类,以及它提供给子类的方法equals、toString、clone。5、学习掌握修饰符protected和final的用法。6、学习掌握抽象类的概念和使用方法。7、学习掌握多态性和动态绑定的概念,学习使用多态进行程序设计。8、学习掌握接口的概念和定义接口的方法。9、学习使用Cloneable接口和clone方法进行对象内容的复制。10、理解浅复制和深复制的概念,掌握覆盖clone方法进行对象内容深复制的技术。二、实验任务:1、使用JavaSDK建立一个非图形化的标准Java程序学习和使用类的继承、掌握关键字super的意义和用法、掌握类的方法覆盖技术、熟悉Object类,以及它提供给子类的方法equals、toString、clone、学习掌握抽象类的概念和使用方法、学习掌握多态性和动态绑定的概念,学习使用多态进行程序设计。程序要求:(1)首先创建一个类家族,其中抽象类几何图形类GeometricObject为父类,圆类Circle和矩形类Rectangle为子类。几何图形类GeometricObject中定义保护型字符串变量color,表示图形的颜色;该类要具备构造方法和两个抽象方法findArea和findPerimeter,抽象方法findArea求图形面积,抽象方法findPerimeter求图形周长。(2)Circle类和Rectangle类是GeometricObject类的子类,其中应实现父类的抽象方法。(3)创建静态方法equalArea,用来比较图形的面积(不是以上三个类的成员方法)。方法名称如下:staticbooleanequalArea(GeometricObjectobject1,GeometricObjectobject2)(4)创建静态方法displayGeometricObject,用来显示几何对象的信息(不是以上三个类的成员方法)。方法名称如下:staticvoiddisplayGeometricObject(GeometricObjectobject)(5)程序主方法中创建两个几何对象,一个圆和一个矩形,并用GeometricObject类的引用变量引用它们,调用equalArea比较两个对象的面积是否相等,并调用displayGeometricObject方法显示对象信息。2、使用JavaSDK建立一个非图形化的标准Java程序,进一步学习多态特性以及接口的概念和利用接口实现多态的方法。程序要求如下:(1)首先创建圆类Circle和圆柱体类Cylinder,其中Circle类是父类,Cylinder类是子类;(2)创建接口Comparable,其中包含一个抽象方法compareTo,用来比较对象的大小。抽象方法compareTo的形式如下:publicintcompareTo(Objecto);(3)创建类ComparableCircle,该类为Circle类的子类,并实现Comparable接口。(4)创建类ComparableCylinder,该类为Cylinder类的子类,并实现Comparable接口。(5)创建通用类Max,其中包含通用方法max,只要月一个类实现了Comparable接口,就可以使用max方法返回两个对象中较大的一个。Max方法的方法名称为:publicstaticComparablemax(Comparableo1,Comparableo2)(6)程序的主方法中分别创建两个ComparableCircle类对象和两个ComparableCylinder类对象,并分别以它们为参数调用max方法,返回两个对象中面积较大的一个。3、使用JavaSDK建立一个非图形化的标准Java程序,进一步深入学习多态特性以及利用Cloneable接口和clone方法实现对象内容的拷贝,并学习消除浅拷贝(浅复制)的方法。程序要求如下:(1)创建Circle类,表示圆;(2)创建Name类,表示人名,其中包含三个String类型的数据成员:firstName,middlName和lastName。(3)创建CloneableCircle类,CloneableCircle类是Circle类的子类,并实现了Cloneable接口。要求CloneableCircle类中有一个Name类型的数据成员creator,代表圆对象的创建者姓名。(4)在CloneableCircle类中实现clone方法,以实现两个CloneableCircle类对象内容的克隆。要求实现对象内容深拷贝(深复制)。(5)为了实现CloneableCircle类对象的深拷贝,Name类也应该实现Cloneable接口,并实现clone方法。(6)程序的主方法中使用clone方法完成两个CloneableCircle类对象的深拷贝。三、实验步骤:1、使用Windows写字板编辑类GeometricObject,源程序如下:publicabstractclassGeometricObject{protectedStringcolor;protecteddoubleweight;//DefaultconstructprotectedGeometricObject(){color=white;weight=1.0;}//ConstructageometricobjectprotectedGeometricObject(Stringcolor,doubleweight){this.color=color;this.weight=weight;}//GettermethodforcolorpublicStringgetColor(){returncolor;}//SettermethodforcolorpublicvoidsetColor(Stringcolor){this.color=color;}//GettermethodforweightpublicdoublegetWeight(){returnweight;}//SettermethodforweightpublicvoidsetWeight(doubleweight){this.weight=weight;}//AbstractmethodpublicabstractdoublefindArea();//AbstractmethodpublicabstractdoublefindPerimeter();}2、使用Windows写字板编辑抽象类GeometricObject的派生类Circle,源程序如下:publicclassCircleextendsGeometricObject{protecteddoubleradius;//DefaultconstructorpublicCircle(){this(1.0,white,1.0);}//ConstructcirclewithspecifiedradiuspublicCircle(doubleradius){super(white,1.0);this.radius=radius;}//Constructacirclewithspecifiedradius,weight,andcolorpublicCircle(doubleradius,Stringcolor,doubleweight){super(color,weight);this.radius=radius;}//GettermethodforradiuspublicdoublegetRadius(){returnradius;}//SettermethodforradiuspublicvoidsetRadius(doubleradius){this.radius=radius;}//ImplementthefindAreamethoddefinedinGeometricObjectpublicdoublefindArea(){returnradius*radius*Math.PI;}//ImplementthefindPerimetermethoddefinedinGeometricObjectpublicdoublefindPerimeter(){return2*radius*Math.PI;}//Overridetheequals()methoddefinedintheObjectclasspublicbooleanequals(Circlecircle){returnthis.radius==circle.getRadius();}//OverridethetoString()methoddefinedintheObjectclasspublicStringtoString(){return[Circle]radius=+radius;}}3、使用Windows写字板编辑抽象类GeometricObject的派生类Rectangle,源程序如下:publicclassRectangleextendsGeometricObject{protecteddoublewidth;protecteddoubleheight;//DefaultconstructorpublicRectangle(){this(1.0,1.0,white,1.0);}//ConstructarectanglewithspecifiedwidthandheightpublicRectangle(doublewidth,doubleheight){this.width=width;this.height=height;}//Constructarectanglewithspecifiedwidth,height,weight,andcolorpublicRectangle(doublewidth,doubleheight,Stringcolor,doubleweight){super(color,weight);this.width=width;this.height=height;}//GettermethodforwidthpublicdoublegetWidth(){returnwidth;}//SettermethodforwidthpublicvoidsetWidth(doublewidth){this.width=width;}//GettermethodforheightpublicdoublegetHeight(){returnheight;}//SettermethodforheightpublicvoidsetHeight(doubleheight){this.height=height;}//ImplementthefindAreamethodinGeometricObjectpublicdoublefindArea(){returnwidth*height;}//ImplementthefindPerimetermethodinGeometricObjectpublicdoublefindPerimeter(){return2*(width+height);}//Overridetheequals()methoddefinedintheObjectclasspublicbooleanequals(Rectanglerectangle){return(width==rectangle.getWidth())&&(height==rectangle.getHeight());}//OverridethetoString()methoddefinedintheObjectclasspublicStringtoString(){return[Rectangle]width=+width+andheight=+he