Java程序设计课件3第三章:抽象类、接口和包_第1页
Java程序设计课件3第三章:抽象类、接口和包_第2页
Java程序设计课件3第三章:抽象类、接口和包_第3页
Java程序设计课件3第三章:抽象类、接口和包_第4页
Java程序设计课件3第三章:抽象类、接口和包_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《JAVA程序设计》课程1、抽象类的概念和定义格式

主要内容2、抽象类的使用规则和应用3、接口的概念和定义格式Java程序设计4、接口的实现与引用《JAVA程序设计》课程5、抽象类和接口的区别

主要内容6、包的概念和定义Java程序设计7、包的创建和常用包的引入8、权限的界定1.能了解抽象类、接口的概念《JAVA程序设计》课程

学习目标2.能正确掌握抽象类的定义和接口的定义3.能正确实现利用抽象类派生子类,并重写抽象类中的抽象方法4.能正确实现接口派生子类,并重写接口中抽象方法5.能正确实现接口派生子类,并重写接口中抽象方法6.能正确定义包7.能正确引用包《JAVA程序设计》课程

学习目标8.能正确界定变量、方法和类的权限3.1.1项目(3-1)描述《JAVA程序设计》课程

3.1抽象类定义一个图形抽象类Shape,并定义子类:矩形类Rectangle,圆类Circle,三角形类Triangle的,并分别求三种图形的面积。3.1.2项目知识准备《JAVA程序设计》课程

3.1抽象类(1)抽象类的概念在现实生活中,我们有这样的情形:老师说:希望大家期末考试考出好成绩。怎么考?留给你自己实现。中国奥运代表团出征大会,国家体育局领导发言:希望各位赛出水平,赛出风格,争金夺银怎么比赛?留给运动员自己去比赛。在Java中可以创建专门的类来作为父类,这种类被称为“抽象类”(Abstractclass)。抽象类描述继承体系的上层结构,定义抽象类的目的就是为了让别人继承,并按抽象类中定义的方案,来给出具体的设计。(2)抽象类的定义使用关键字abstract修饰的类我们称为抽象类。定义抽象类的语法格式如下:《JAVA程序设计》课程

3.1抽象类abstractclass类名{声明成员变量;返回值的数据类型方法名(参数表){……}abstract返回值的数据类型方法名(参数表);}《JAVA程序设计》课程

3.1抽象类关于抽象方法的几点说明:抽象方法只有方法的声明,没有方法体抽象方法用来描述系统具有什么功能

具有一个或多个抽象方法的类必须声明为抽象类提醒:①抽象类中可以没有抽象方法,也可以有抽象方法;②有抽象方法的类一定是抽象类。《JAVA程序设计》课程

3.1抽象类④抽象类也可以有具体的属性和方法。⑤构造方法不能声明为抽象方法。⑥当一个具体类继承一个抽象类时,必须实现抽象类中声明的所有抽象方法,否则也必须声明为抽象类。⑦不能通过new关键字实例化抽象类的对象。提醒:Animalanimal=newAnimal("旺旺");//错误,因为Animal是抽象类。但是可以声明抽象类的引用指向子类的对象,以实现多态性。比如:Animalanimal=newDog("旺旺");//正确animal.eat();其中Dog是实现了抽象类中抽象方法的子类,是普通类。《JAVA程序设计》课程

3.1抽象类案例3-1:定义抽象类Animal,并定义其子类Dog和Cat,并测试程序运行结果。(1)先定义抽象类AnimalabstractclassAnimal{//抽象类Stringname;//属性publicAnimal(Stringn){//构造方法name=n;}publicabstractvoideat();//抽象方法publicStringgetName(){//具体方法returnname;}}《JAVA程序设计》课程

3.1抽象类在Animal类中成员变量name,和一个参数的构造方法publicAnimal(Stringn),抽象方法eat(),普通实例方法getName();(2)再定义第一个子类Dog,继承自Animal,并实现Animal类中的抽象方法,代码如下:publicclassDogextendsAnimal{ publicDog(Stringn){ super(n); } @Override《JAVA程序设计》课程

3.1抽象类publicvoideat(){//实现抽象类的抽象方法System.out.println(name+"啃骨头");}}(3)定义第二个子类Cat,继承自Animal,并实现Animal类中的抽象方法,代码如下:publicclassCatextendsAnimal{ publicCat(Stringn){ super(n); }《JAVA程序设计》课程

3.1抽象类@Override publicvoideat(){ System.out.println(name+"吃鱼"); }}(4)编写测试类AnimalDemo类,测试程序运行效果。测试类代码如下:publicclassAnimalDemo{ publicstaticvoidmain(String[]args){ //测试 //Anaimlanimal=newAnimal();//错误,抽象类不能生成对象《JAVA程序设计》课程

3.1抽象类Animaldog=newDog("旺旺"); Animalcat=newCat("喵喵"); dog.eat(); cat.eat(); }}(5)测试运行,显示结果如图3-1所示:《JAVA程序设计》课程

3.1抽象类图3.1案例3-1的运行结果3.1.3项目实施《JAVA程序设计》课程

3.1抽象类(1)分析通过分析题目可以用以下几个步骤实现本项目:①定义一个抽象类Shape,在类中定义一个求面积的抽象方法area();②定义一个继承Shape的子类矩形类Rectangle,并重写area()方法;③定义一个继承Shape的子类圆形类Circle,并重写area()方法;。④定义一个继承Shape的子类矩形类Triangle,并重写area()方法;⑤定义测试类,测试程序的运行结果;。(2)编码:①定义抽象类Shape,代码如下:《JAVA程序设计》课程

3.1抽象类//定义抽象类ShapepublicabstractclassShape{ publicabstractdoublearea();//抽象方法}publicclassRectangleextendsShape{ //定义私有的实例变量,width表示宽度,height表示高度 privatedoublewidth; privatedoubleheight;②定义继承Shape的子类矩形类Rectangle《JAVA程序设计》课程

3.1抽象类publicRectangle(doublew,doubleh){ this.width=w; this.height=h; } @Override publicdoublearea(){ returnthis.width*this.height; }}③定义继承Shape的子类圆形类Circle《JAVA程序设计》课程

3.1抽象类publicclassCircleextendsShape{ //定义私有的实例变量r,表示圆的半径 privatedoubler; //定义一个参数的构造方法 publicCircle(doubler){ this.r=r; }//重写抽象方法《JAVA程序设计》课程

3.1抽象类@Override publicdoublearea(){ returnMath.PI*r*r; }}④定义继承Shape的子类矩形类TrianglepublicclassTriangleextendsShape{ //定义私有的实例变量,d表示三角形的底,h表示三角形的高 privatedoubled; privatedoubleh;《JAVA程序设计》课程

3.1抽象类//定义2个参数的构造方法 publicTriangle(doubled,doubleh){ this.d=d; this.h=h; } //重写抽象方法 @Override publicdoublearea(){ returnd*h/2; }}《JAVA程序设计》课程

3.1抽象类⑤定义测试类,测试程序的运行结果,代码如下:publicclassShapeDemo{ /** *测试Shape抽象及子类的运行结果 */ publicstaticvoidmain(String[]args){ Shaperectangle=newRectangle(4.0,5.0); Shapecircle=newCircle(3.0); Shapetriangle=newTriangle(4.0,3.0); System.out.println("矩形面积="+rectangle.area());《JAVA程序设计》课程

3.1抽象类System.out.println("圆形面积="+circle.area()); System.out.println("三角形面积="+triangle.area()); }}(3)调试运行,显示结果该程序的运行结果如图3.2所示:《JAVA程序设计》课程

3.1抽象类图3.2项目3-1的运行结果3.1.4能力拓展《JAVA程序设计》课程

3.1抽象类1)选择题①抽象类定义格式是(A)A.abstractclassB.finalclassC.publicclassD.privateclass②下面说法中正确的是(C)A.抽象类中一定有抽象方法B.抽象类中一定没有抽象方法C.有抽象方法的类一定是抽象类D.有抽象方法的类不一定是抽象类《JAVA程序设计》课程

3.1抽象类(2)填空题①在Java语言中,抽象用关键字(abstract)表示。②抽象方法所在的类一定是(抽象类)。③抽象方法只有方法头,没有(方法体)。(3)编程①编程实现本课中的案例3-1的功能,并运行测试。②编程实现抽象类犬科Canidae类,内有一个嚎叫的抽象方法howl(),其子类分别为狗类Dog和狼类Wolf,在子类中实现howl()方法,并测试运行。③编程实现本节课中的项目3-1中的功能,并运行测试。3.2.1项目(11-2)描述《JAVA程序设计》课程

3.2接口定义一个报警接口IAlarm,内有含义为报警的抽象方法alarm();定义一个含义为门的抽象类Door,内有抽象方法open()和close(),含义是开和关;再定义一个含义是铁门的类IronDoor,该类继承Door类,并实现open()和close()方法;最后定义一个防盗门SecurityDoor继承Door类,也继承接口IAlarm。测试并运行该程序。3.2.2项目知识准备《JAVA程序设计》课程

3.2接口用关键字interface,可以从类的实现中抽象出一个类的接口。也就是说,用interface可以指定一个类必须做什么,而不是规定它如何去做。接口在语句构成上与类相似,但是接口中没有实例变量,而且它们定义的方法全部都是抽象方法,即方法不含方法体。一旦接口被定义,该接口就可以被一个类或多个类继承。而且,一个类可以实现多个接口。要实现一个接口,接口的实现类必须实现该接口中所有的抽象方法。然而,每个类都可以自由的决定它们自己实现的细节。通过提供interface关键字,Java允许充分利用多态性的“一个接口,多个方法”。接口是为支持运行时动态方法调用而设计的。通常,为使一个方法可以在两个类中都能被调用,两个类都必须出现在编译时间里,以便Java编译器可以检查以确保方法特殊是兼容的。这个需求导致了一个静态的不可扩展的类环境。在一个系统中不可避免会出现这类情《JAVA程序设计》课程

3.2接口况,为了保证该方法可以为越来越多的子类可用,类的层次就会越堆越高。接口的设计避免了这个问题。接口把一个方法或多个方法的定义从类层次中分开。因为接口比抽象类更具有普遍性,可以适用于不同体系的类来实现该接口,不会造成类的层次变高。这是实现接口的真正原因所在。注意:在C++语言中,类是可以实现多重继承的,即一个类可以有多个父类;但是在Java语言中一个类只能有一个父类,要想实现“多重继承”,只能通过接口实现。(1)接口的定义接口定义的语法格式如下:《JAVA程序设计》课程

3.2接口[public]interface接口名称[extends父接口名列表]{[public][static][final]数据类型成员变量名=常量;……[public][abstract]返回值的数据类型方法名(参数表);……}下面是一个接口定义的例子。它声明了一个简单的接口,里面包含了常量和抽象方法。《JAVA程序设计》课程

3.2接口interfaceA{publicstaticfinalStringaddress=”重庆工程职业技术学院”;//全局常量publicstaticfinalStringauthor=”谢先伟”;//全局常量publicabstractStringshow();//公共的抽象方法publicabstractvoidprintInfo();//公共的抽象方法}需要特别指出的是:注意:在Java的接口中只能定义全局常量和公共的抽象方法。对接口来讲,因为接口在定义的时候就默认的定义了接口中的变量就是全局常量,接口中方法就是公共的抽象方法,所以在开发中往往可以简化定义,如以下代码所示:《JAVA程序设计》课程

3.2接口interfaceA{Stringaddress=”重庆工程职业技术学院”;//全局常量Stringauthor=”谢先伟”;//全局常量Stringshow();//公共的抽象方法voidprintInfo();//公共的抽象方法}以上两种定义接口的方式是完全一样的,没有区别。(2)接口的实现在声明一个类的同时用关键字implements来实现一个接口。接口实现的语法格式为:《JAVA程序设计》课程

3.2接口class类名称implements接口A{……}从上面的代码中,可以看出一个类可以继承多个接口,这样类就摆脱了Java中的类只能单重继承的局限性的束缚。注意:在一个类要实现一个接口时,应注意以下问题:(1)非抽象类中不能存在抽象方法。(2)一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。(3)接口中抽象方法的访问控制修饰符都已指定为public,所以类在实现方法时,必须显示地使用public修饰符。(3)接口的继承《JAVA程序设计》课程

3.2接口与类相似,接口也有继承性。定义一个接口时可通过extends关键字声明该新接口是某个已存在的父接口的派生接口,它将继承父接口的所有常量与抽象方法。与类的继承不同的是,一个接口可以有一个以上的父接口,它们之间用逗号分隔,形成父接口列表。interface子接口extends父接口A,父接口B,…{……}(4)利用接口实现类的“多重继承”《JAVA程序设计》课程

3.2接口所谓多重继承,是指一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。Java虽不支持多重继承,但可利用接口来实现比多重继承更强的功能。一个类实现多个接口时,在implements子句中用逗号分隔。格式如下所示:class类名称implements接口A,接口B,…{……}从上面的代码中,可以看出一个类可以继承多个接口,这样类就摆脱了Java中的类只能单重继承的局限性的束缚。(5)抽象类和接口的不同《JAVA程序设计》课程

3.2接口抽象类和接口都可以通过多态生成实例化对象;但是二者是有区别的,请看表3-1所示:表3-1抽象类和接口的不同序号不同点抽象类接口1定义含有抽象方法的类,关键字为class抽象方法和全局变量的集合,关键字为interface2组成构造方法、普通方法、抽象方法、常量、变量全局常量、公共的抽象方法3使用子类继承抽象类,关键字extends子类继承接口,关键字implements4关系抽象类可以实现多个接口接口不能继承抽象类,但是可以继承多个接口5常见的设计模式模板设计模式工厂设计、代理设计6局限单继承局限没有单继承局限7实际作为一个模板作为一个标准或一种能力8选择当即可以选择抽象类,又可以选择接口时,则优先选择接口,因为接口没有单继承的局限,更具有普遍性和通用性。《JAVA程序设计》课程

3.2接口案例3-2:定义一个报警接口IAlarm,在接口中定义一个抽象方法报警方法alarm(),分别定义IAlarm接口的子类,一个是防盗自行车类SecurityBicycle,另一个子类是防盗门类SecurityDoor。在两个子类中分别实现接口中的alarm()方法,并测试程序。(1)先定义报警接口IAlarm//定义报警接口IAlarmpublicinterfaceIAlarm{ //定义报警方法alarm(); publicvoidalarm();}《JAVA程序设计》课程

3.2接口在IAlarm接口中定义了无参数的抽象方法alarm(),该方法的返回值是void。(2)定义第一个子类——防盗自行车类SecurityBicycle,继承接口IAlarm,并实现接口中的抽象方法alarm(),代码如下://定义防盗自行车类publicclassSecurityBicycleimplementsIAlarm{ privateStringname;//自行车名称 //构造方法 publicSecurityBicycle(Stringname){ =name; } //定义getter方法《JAVA程序设计》课程

3.2接口publicStringgetName(){ returnname; } //定义setter方法 publicvoidsetName(Stringname){ =name; }//重写接口中的方法 @Override publicvoidalarm(){《JAVA程序设计》课程

3.2接口System.out.println("我是"++",我具备了报警方法。"); }}在SecurityBicycle中定义了一个私有的成员变量name,并定义了一个参数的构造方法;定义了成员变量对应的getter和setter方法;最后重写了接口中的alarm()方法。(3)定义第二个子类SecurityDoor,继承接口IAlarm,并实现接口中的抽象方法alarm(),代码如下://定义防盗门类SecurityDoorpublicclassSecurityDoorimplementsIAlarm{ privateStringname;//防盗门名称//定义构造方法 publicSecurityDoor(Stringname){《JAVA程序设计》课程

3.2接口=name; } //定义getter方法 publicStringgetName(){ returnname; }//定义setter方法 publicvoidsetName(Stringname){ =name; }//重写接口中的alarm()方法《JAVA程序设计》课程

3.2接口@Override publicvoidalarm(){ System.out.println("我是"++",我具备了报警方法。"); }}在SecurityDoor中定义了一个私有的成员变量name,并定义了一个参数的构造方法;定义了成员变量对应的getter和setter方法;最后重写了接口中的alarm()方法。(4)编写测试类IAlarmDemo类,测试程序运行效果。测试类代码如下://测试类publicclassIAlarmDemo{ /**《JAVA程序设计》课程

3.2接口*测试IAlarm接口及其子类 */ publicstaticvoidmain(String[]args){ IAlarmbicycle=newSecurityBicycle("飞鸽牌防盗自行车"); IAlarmdoor=newSecurityDoor("卫士牌防盗门"); bicycle.alarm(); door.alarm(); }}《JAVA程序设计》课程

3.2接口(5)测试运行,显示结果如图3-3所示:图3.3案例3-2的运行结果《JAVA程序设计》课程

3.2接口案例3-3:实现一个类,同时继承2个接口的例子。具体要求是:定义第一个抽烟接口ISmoke,在接口中定义一个含义为抽烟的方法smoking();定义第二个喝酒接口IDrink,在接口中定义一个含义为喝酒的方法drinking();再定义一个不文明学生类UncivilizedStudent,该类继承上面的两个接口;最后测试程序的运行结果。(1)先定义抽烟接口ISmoke,代码如下://定义抽烟接口ISmokepublicinterfaceISmoke{ //定义抽烟方法 publicvoidsmoking();}《JAVA程序设计》课程

3.2接口在ISmoke接口中定义了一个抽象方法smoking()。(2)定义第二个接口IDrink,代码如下://定义喝酒接口publicinterfaceIDrink{ //定义喝酒方法 publicvoiddrinking();}在IDrink接口中定义了一个抽象方法drinking()。(3)定义不文明学生类UncivilizedStudent,该类既继承接口ISmoke,又继承IDrink接口,并分别实现2个接口中的抽象方法,代码如下:《JAVA程序设计》课程

3.2接口//定义不文明学生类publicclassUncivilizedStudentimplementsISmoke,IDrink{privateStringname;//学生姓名 //定义构造方法 publicUncivilizedStudent(){ =name; } //定义getter方法 publicStringgetName(){ returnname; }《JAVA程序设计》课程

3.2接口 } //重写喝酒接口IDrink中的方法 @Override publicvoiddrinking(){ System.out.println("经常喝酒的学生["++"]是不文明学生。"); } //重写抽烟接口ISmoke中的方法 @Override publicvoidsmoking(){ System.out.println("经常抽烟的学生["++"]是不文明学生。"); }}《JAVA程序设计》课程

3.2接口在UncivilizedStudent中定义了一个私有的成员变量name,并定义了一个参数的构造方法;定义了成员变量对应的getter和setter方法;最后重写了ISmoke接口中的smoking()方法,并重写了IDrink接口中的drinking()方法。(4)编写测试类UncivilizedStudentDemo类,测试程序运行效果。测试类代码如下:publicclassUncivilizedStudentDemo{ /** *测试不文明学生类 */publicstaticvoidmain(String[]args){UncivilizedStudentus=newUncivilizedStudent("张三"); us.smoking();《JAVA程序设计》课程

3.2接口us.drinking(); }}(5)测试运行,显示结果如图3-4所示:图3.4案例3-3的运行结果《JAVA程序设计》课程

3.2接口案例3-4:接口间继承的例子。具体要求是:定义一个父接口IParent1,在该接口中定义一个抽象方法p1();再定义第二个接口父接口IParent2,在该接口中定义一个抽象方法p2();再定义一个子接口IChild,在该接口中定义一个抽象方法c1();然后定义一个普通类ClassA,该类继承子接口IChild;最后测试程序的运行结果。(1)先定义第一个父接口IParent1,代码如下://父接口IParent1publicinterfaceIParent1{//定义抽象方法p1() publicvoidp1();}《JAVA程序设计》课程

3.2接口在父接口IParent1中定义了一个抽象方法p1()。(2)定义第二个父接口IParent2,代码如下://父接口IParent2publicinterfaceIParent2{//定义抽象方法p2() publicvoidp2();}在父接口IParent2中定义了一个抽象方法p2()。(3)再定义第一个子接口IChild,该子接口继承接口IParent1和IParent2代码如下:《JAVA程序设计》课程

3.2接口//定义子接口IChild,该接口继承了父接口IParent1和IParent2publicinterfaceIChildextendsIParent1,IParent2{ //定义抽象方法c1() publicvoidc1();}在子接口IChild中定义一个抽象方法c1()。(4)定义一个类ClassA,继承接口IChild,代码如下:publicclassClassAimplementsIChild{ @Override publicvoidp1(){ System.out.println("实现了接口IParent1中的p1()方法");《JAVA程序设计》课程

3.2接口} @Override publicvoidp2(){ System.out.println("实现了接口IParent2中的p1()方法"); } @Override publicvoidc1(){ System.out.println("实现了接口IChild中的c1()方法"); }}《JAVA程序设计》课程

3.2接口publicclassClassADemo{ /** *测试ClassA */ publicstaticvoidmain(String[]args){ ClassAclassA=newClassA(); classA.p1(); classA.p2(); classA.c1();}}《JAVA程序设计》课程

3.2接口图3.5案例3-4的运行结果(6)测试运行,显示结果如图3-5所示:《JAVA程序设计》课程

3.2接口3.2.3项目实施1)通过分析项目3-2,可以用以下几个步骤实现本项目:①定义一个报警接口IAlarm,在接口中定义一个含义为报警的抽象方法alarm();②定义一个门的抽象类Door,在类中定义了2个抽象方法open()和close();③定义一个门类Door的子类铁门类IronDoor,在IronDoor类中实现open()方法和close()方法;④定义门类Door子类防盗门类SecurityDoor,该类还继承了接口IAlarm,要在类中实现三个方法,分别是父类的open()方法和close()方法,还有一个是接口IAlarm中的alarm()方法。、⑤定义测试类Test,测试程序的运行结果;。(2)编码:①定义报警接口IAlarm,代码如下:《JAVA程序设计》课程

3.2接口//定义报警接口IAlarmpublicinterfaceIAlarm{ //定义报警方法alarm(); publicvoidalarm();}②定义抽象类Door,代码如下://定义抽象类DoorpublicabstractclassDoor{ privateStringname;//门的名称 //定义构造方法《JAVA程序设计》课程

3.2接口publicDoor(Stringname){ =name; } //定义name属性的getter方法 publicStringgetName(){ returnname; } //定义name属性的setter方法 publicvoidsetName(Stringname){ =name;《JAVA程序设计》课程

3.2接口} //抽象方法 publicabstractvoidopen();//开 publicabstractvoidclose();//关}在Door类中定义了一个私有的字符串实例变量name,并有对应的getter和setter方法,有参数的构造方法Door(Stringname);并定义了2个抽象方法open()和close()。③定义子类铁门类IronDoor,代码如下://定义铁门类,该类基础了父类DoorpublicclassIronDoorextendsDoor{ //定义铁门的构造方法 publicIronDoor(Stringname){《JAVA程序设计》课程

3.2接口super(name); } //重写父类的open()方法 @Override publicvoidopen(){ System.out.println(this.getName()+"实现了父类Door中的open()方法"); } //重写父类的close()方法 @Override publicvoidclose(){《JAVA程序设计》课程

3.2接口 System.out.println(this.getName()+"实现了父类Door中的close()方法"); }}在铁门类IronDoor中,定义了一个参数的构造方法IronDoor(Stringname);还实现了父类中的2个抽象方法。④定义子类防盗门类SecurityDoor,代码如下://定义防盗门类SecurityDoor,该类继承父类Door,又继承了接口IAlarmpublicclassSecurityDoorextendsDoorimplementsIAlarm{ //定义一个参数的构造方法 publicSecurityDoor(Stringname){ super(name);《JAVA程序设计》课程

3.2接口} //重写接口IAlarm中的抽象方法alarm() @Override publicvoidalarm(){ System.out.println(this.getName()+"实现了接口IAlarm中的抽象方法alarm()。"); } //重写父类中的open()方法 @Override publicvoidopen(){ System.out.println(this.getName()+"实现了父类Door中的抽象方法open()。"); } //重写父类中的close()方法 @Override《JAVA程序设计》课程

3.2接口publicvoidclose(){ System.out.println(this.getName()+"实现了父类Door中的抽象方法close()。"); }}

在子类SecurityDoor中,定义一个参数的构造方法SecurityDoor(Stringname);重写了接口IAlarm中的抽象方法alarm();也重写了父类中的抽象方法open()和close()。⑤定义测试类Test,测试程序的运行结果,代码如下:publicclassTest{ /** *@测试铁门类和防盗门类 */《JAVA程序设计》课程

3.2接口publicstaticvoidmain(String[]args){ //铁门对象 DoorironDoor=newIronDoor("永固牌铁门"); //防盗门对象 SecurityDoorsecurityDoor=newSecurityDoor("安全牌防盗门"); ironDoor.open(); ironDoor.close(); securityDoor.open(); securityDoor.close(); securityDoor.alarm(); }}《JAVA程序设计》课程

3.2接口(3)调试运行,显示结果该程序的运行结果如图3.6所示:图3.6项目3-2的运行结果《JAVA程序设计》课程

3.2接口3.2.4能力拓展(1)选择题①定义接口的关键字是(D)A.abstractB.implementsC.extendsD.interface②一个类继承接口,要使用关键字(B)A.abstractB.implementsC.extendsD.interface《JAVA程序设计》课程

3.2接口③已知有一个接口A,如下所示interfaceA{ intmethod1(inti); intmethod2(intj);}下列实现了接口,并且该类不是抽象类的是(C)A.classBimplementA{

int

method1(

)

{

}

int

method2(

)

{

}}

《JAVA程序设计》课程

3.2接口B.class

B

{

int

method1(

int

i)

{

}

int

method2(

)

{int

j

}

}

C.class

B

implement

A

{

int

method1(

int

i)

{

}

int

method2(

int

j)

{

}

}

D.class

B

extends

A

{

int

method1(

int

i)

{

}

int

method2(int

j

)

{

}

}《JAVA程序设计》课程

3.2接口(2)填空题①在JAVA中,只有单重继承,而要实现类的多重继承,需要该类继承(接口)来实现。②在JAVA中,接口内能定义常量和(抽象方法)。③在JAVA中,接口中的抽象方法的权限都是(public)。《JAVA程序设计》课程

3.2接口(3)编程①编程实现本章节中的案例3-2至案例3-4的编码。②实现本章节中项目3-2的功能,并运行测试。③按要求编写程序:(a)定义一个接口Calculate,其中声明一个抽象方法calcu()用于计算图形面积。(b)定义一个三角形(Triangle)类,描述三角形的底边及高,并实现Caculate接口。(c)定义一个圆形(Circle)类,描述圆半径,并实现Caculate接口。(d)定义一个圆锥(Taper)类,描述圆锥的底和高(底是一个圆对象),计算圆锥的体积(公式:底面积*高/3)。(e)定义一个应用程序测试类Test,对以上创建的类中各成员进行调用测试。④自己再写2个关于接口的例子,最好来自于生活中例子。《JAVA程序设计》课程3.3包3.3.1项目(3-3)描述先定义一个包ject3,在包内定义一个图形抽象类Shape,并定义子类:矩形类Rectangle,圆类Circle,三角形类Triangle的,并分别求三种图形的面积。《JAVA程序设计》课程3.3包3.3.2项目知识准备在Java中,包(package)是一种松散的类的集合,它可以将各种类文件组织在一起,就像磁盘的目录(文件夹)一样。无论是Java中提供的标准类,还是我们自己编写的类文件都应包含在一个包内。包的管理机制提供了类的多层次命名空间避免了命名冲突问题,解决了类文件的组织问题,方便了我们的使用。(1)Java中常用的标准类包Oracle公司在JDK中提供了各种实用类,通常被称之为标准的API(ApplicationProgrammingInterface),这些类按功能分别被放入了不同的包中,供大家开发程序使用。随着JDK版本的不断升级,标准类包的功能也越来越强大,使用也更为方便。下边简要介绍其中最常用几个包的功能:Java提供的标准类都放在标准的包中。常用的一些包说明如下:《JAVA程序设计》课程3.3包①java.lang包中存放了Java最基础的核心类,诸如System、Math、String、Integer、Float类等等。在程序中,这些类不需要使用import语句导入即可直接使用。例如前边程序中使用的输出语句System.out.println()、类常数Math.PI、数学开方方法Math.sqrt()、类型转换语句Float.parseFloat()等等。②java.awt包中存放了构建图形化用户界面(GUI)的类。如Frame、Button、TextField等,使用它们可以构建出用户所希望的图形操作界面来。③javax.swing包中提供了更加丰富的、精美的、功能强大的GUI组件,是java.awt功能的扩展,对应提供了如JFrame、JButton、JTextField等等。在前边的例子中我们就使用过JoptionPane类的静态方法进行对话框的操作。它比java.awt相关的组件更灵活、更容易使用。《JAVA程序设计》课程3.3包④java.applet包中提供了支持编写、运行applet(小程序)所需要的一些类。⑤java.util包中提供了一些实用工具类,如定义系统特性、使用与日期日历相关的方法以及分析字符串等等。⑥java.io包中提供了数据流输入/输出操作的类。如建立磁盘文件、读写磁盘文件等等。⑦java.sql包中提供了支持使用标准SQL方式访问数据库功能的类。⑧包中提供与网络通讯相关的类。用于编写网络实用程序。《JAVA程序设计》课程3.3包(2)包(package)的创建及包中类的引用如上所述,每一个Java类文件都属于一个包。也许你会说,在此之前,我们创建示例程序时,并没有创建过包,程序不是也正常执行了吗?事实上,如果在程序中没有指定包名,系统默认为是无名包。无名包中的类可以相互引用,但不能被其他包中的Java程序所引用。对于简单的程序,使用不使用包名也许没有影响,但对于一个复杂的应用程序,如果不使用包来管理的类,将会对程序的开发造成很大的混乱。下边我们简要介绍包的创建及使用。①创建包将自己编写的类按功能放入相应的包中,以便在其他的应用程序中引用它,这是对面向对象程序设计者最基本的要求。我们可以使用package语句将编写的类放入一个指定的包中。package语句的一般格式如下:package包名;《JAVA程序设计》课程3.3包下边举例说明包的创建。例如,前边我们创建了平面几何图形类Shape、Triangle和Circle。现在要将它们的类文件代码放入shape包中,我们只须在Shape.java、Triangle.java和Circle.java三个源程序文件中的开头(作为第一个语句)各自添加一条如下的语句就可以了:注意:在创建包时,应注意以下问题:(1)此语句必须放在整个源程序第一条语句的位置(注解行和空行除外)。(2)包名应符合标识符的命名规则,习惯上,包名使用小写字母书写。可以使用多级结构的包名,如Java提供的类包那样:java.util、java.sql等等。事实上,创建包就是在当前文件夹下创建一个以包名命名的子文件夹并存放类的字节码文件。如果使用多级结构的包名,就相当于以包名中的“.”为文件夹分隔符,在当前的文件夹下创建多级结构的子文件夹并将类的字节码文件存放在最后的文件夹下。《JAVA程序设计》课程3.3包packabeshape;在完成对程序文件的修改之后,重新编译源程序文件,生成的字节码类文件被放入创建的文件夹下。一般情况下,我们是在开发环境界面中(比如Eclipse中)单击编译命令按钮或图标执行编译的。但有时候,我们希望在DOS命令提示符下进行Java程序的编译、运行等操作。下边简要介绍一下DOS环境下编译带有创建包的源程序的操作。其编译命令的一般格式如下:javac–d[文件夹名][.]源文件名其中:(a)-d表明带有包的创建。(b).表示在当前文件夹下创建包。(c)文件夹名是已存在的文件夹名,要创建的包将放在该文件夹下。例如,要把上述的3个程序文件创建的包放在当前的文件夹下,则应执行如下编译操作:《JAVA程序设计》课程3.3包javac-d.Shape.javajavac-d.Triangle.javajavac-d.Circle.java如果想将包创建在d:\java文件夹下,执行如下的编译操作:javac-dd:\javaShape.javajavac-dd:\javaTriangle.javajavac-dd:\javaCircle.java在执行上述操作之后,我们可以查看一下所生成的包shape文件夹下的字节码类文件。事实上,常常将包中的类文件压缩在JAR(JavaArchive,用ZIP压缩方式,以.jar为扩展名)文件中,一个JAR文件往往会包含多个包,SunJ2SE所提供的标准类就是压缩在rt.jar文件中。②引用类包中的类《JAVA程序设计》课程3.3包在前边的程序中,我们已经多次引用了系统提供的包中的类,比如,使用java.util包中的Date类,创建其对象处理日期等。一般来说,我们可以如下两种方式引用包中的类。(a)使用import语句导入类,在前边的程序中,我们已经使用过,其应用的一般格式如下:import包名.*;//可以使用包中所有的类或:import包名.类名;//只装入包中类名指定的类在程序中import语句应放在package语句之后,如果没有package语句,则import语句应放在程序开始,一个程序中可以含有多个import语句,即在一个类中,可以根据需要引用多个类包中的类。(b)在程序中直接引用类包中所需要的类。其引用的一般格式是:包名.类名例如,可以使用如下语句在程序中直接创建一个日期对象:《JAVA程序设计》课程3.3包java.util.Datedate1=newjava.util.Date();(3)权限访问限定在前边介绍的类、变量和方法的声明中都遇到了访问限定符,访问限定符用于限定类、成员变量和方法能被其他类访问的权限,当时我们只是简单介绍了了其功能,且只使用了public(公有的)和默认(友元的)两种形式。在有了包的概念之后,我们将几种访问限定总结如下:①默认访问限定如果省略了访问限定符,则系统默认为是friendly(友元的)限定。拥有该限定的类只能被所在包内的其他类访问。②public访问限定由public限定的类为公共类。公共类可以被所有的其他类访问。《JAVA程序设计》课程3.3包3.private(私有的)访问限定private限定符只能用于成员变量、方法和内部类。私有的成员只能在本类中被访问,即只能在本类的方法中由本类的对象引用。4.protected(保护的)访问限定protected限定符也只能用于成员变量、方法和内部类。用protected声明的成员也被称为受保护的成员,它可以被其子类(包括本包的或其他包的)访问,也可以被本包内的其他类访问。综合上述,以表3-2简要列出各访问限定的引用范围。其中“√”表示可访问,“×”表示不可访问。注意:使用public限定符应注意以下两点:(1)public限定符不能用于限定内部类。(2)一个Java源程序文件中可以定义多个类,但最多只能有一个被限定为公共类。如果有公共类,则程序名必须与公共类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论