第08章_课后作业_抽象类、接口、包和常用API
- 格式:pdf
- 大小:191.48 KB
- 文档页数:5
实验五抽象类、接口与包一、实验目的1、熟练掌握抽象类abstract的概念。
2、熟练掌握接口interface的概念。
3、熟练包package的概念以及编译运行的方法。
4、熟练掌握内部类inner class的概念。
5、熟练掌握递归的概念。
6、理解面向对象的程序设计方法。
二、实验内容与要求1.编写求解几何图形(如三角形,矩型,圆,多边型)的周长、面积的应用程序,要求用到继承、多态、抽象类、接口、内部类等面向对象程序设计技术的特点。
2、重写上面的程序,要求三角形,矩型,圆,多边型的类放到不同的包中,用包的技术组织程序的设计。
同时要求程序能从键盘上接受数据以便求解不同的几何图形的周长面积。
提示:从键盘上输入双精度数的一种方法(程序片段)……public static void main(String args[]) throws IOException{BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));String x;x=keyin.readLine();double a=Double.parseDouble(x);……3.练习ng.Class类的使用,通过一个对象返回一个Class对象,如何获取一个类的名称,如何使用class生成一个类的对象。
获取类的描述信息。
4、编写一个应用程序,实现以下功能:①声明一个接口(Calculability),接口中包含一个方法area()。
②声明一个三角形类继承该接口,类名为Triangle,类中包含两个变量、一个带参数的构造方法和一个计算三角形面积的方法:三角形的底边长w三角形的高h构造方法Triangle(double width,double height)。
计算三角形面积的方法area(),该方法覆盖接口(Calculability)的同名方法,计算三角形的面积(w*h/2)。
实验 5 Java包、接口和异常处理的练习一、实验目的了解Java 中包(package)、接口(interface)和异常处理(exception)的作用,掌握包、接口、异常处理的设计方法。
二、实验要求1.了解Java 系统包的结构。
2.掌握创建自定义包的方法。
3.掌握使用系统接口的技术和创建自定义接口的方法。
4.理解系统异常处理的机制和创建自定义异常的方法。
三、实验内容(一)了解并使用 Java 的系统包包是类和接口的集合。
利用包可以把常用的类或功能相似的类放在一个包中。
Java 语言提供系统包,其中包含了大量的类,可以在编写Java 程序时直接引用它们。
为便于管理和使用它们,将这些类分为了不同的包。
包又称类库或API 包,所谓API(Application Program Interface)即使用程序接口。
API 包-方面提供丰富的类和方法供大家使用,如画图形、播放声音等,另一方面又负责和系统软硬件打交道,圆满实现用户程序的功能。
所有Java API 包都以"java."开头,以区别用户创建的包。
接口解决了Java 不支持多重继承的问题,可以通过实现多个接口达到和多重继承相同的功能。
处理程序运行时的错误和设计程序同样重要,只有能够完善处理运行时出错的程序,软件系统才能长期稳定地运行,异常处理就是说明如何处理程序运行时出错的问题。
(二)创建并使用自定义包1.自定义包的声明方式<package> <自定义包名>声明包语句必须添加在源程序的第一行,表示该程序文件声明的全部类都属于这个包。
2.创建自定义包Mypackage在存放源程序的文件夹中建立一个子文件夹Mypackage。
例如,在"E:\java\程序"文件夹之中,创建一个和包同名的子文件夹Mypackage(E:\java\程序\Mypackage),并将编译过的class 文件放入该文件夹中。
JA V A包、接口与抽象类【概述】包(Package)定义了软件单元,它能够独立发布,并能够与其它包组成应用程序,包的成员是一些相关联的类、接口,也可包含包中的类所使用的附加资源文件。
在Java程序的第一行代码,可以通过以下代码来申明源程序中所创建类型的包。
package 包名;如果某个Java程序源代码中没有上面的package 包名;那么这个源代码中定义的所有类型都属于一个默认包(default package)。
【包的主要作用】1.包将相互关联的接口和类结合成组。
2.包创建了命名空间来避免类型之间的命名冲突。
在一个包中的接口和类可以使用流行的公共名字来命名,而这些命名只在一个包内才有意义,在不同的包之间则可以有相同的命名。
3.包机制为开发应用提供了保护域。
包内的代码通过访问标志可以相互协作,而这些标志对外部代码是不可用的【包的命名约定】♦如果包名为c,那么相应的编译出的.class文件必须位于某个工作目录下的aaa\bbb\ccc目录里面或者某个Jar文件的aaa\bbb\ccc目录里面。
♦可以采用Internet域名反序,比如,可以将包命名为.zucc; 虽然这种命名模式使得包名变得很长,但却不容易重名。
【执行包中的类文件】对于包c中定义的某个类A,那么类文件A.class必定位于(1)工作目录下的aaa\bbb\ccc目录里面,或者(2)某个Jar文件中的aaa\bbb\ccc目录里面。
对于前一种情况,可以在命令提示符下,敲入java –cp 工作目录c.A 执行类A。
比如,如果工作目录是d:\test,那么可以键入java –cp d:\test c.A执行类A;如果命令提示符当前目录就是工作目录d:\test, 那么可以省去-cp d:\test, 而仅仅需要键入java c.A对于后一种情况,可以在命令提示符下,敲入下面命令可以执行类A;java –cp jar文件的路径文件名c.A比如,类文件A.class位于已经打包的jar文件abc.jar中,而abc.jar位于目录d:\test, 那么就可以键入如下命令来执行A.classjava –cp d:\test\abc.jar c.A【使用包成员(导入类型方式)】对于其它包中定义的类型,可以程序中使用类型的完全限定名(Fully qualified name, 即包名.类型名)来申明和使用类型;如果不想在程序中使用完全限定名(因为完全限定名比较长),而是希望通过简单的类型名来申明和使用其它包中的类型,那么可以通过import 语句将程序中使用到的类型(一般位于其它包)导入到当前程序中。
什么是抽象类什么是接⼝两者有什么区别?如何使⽤它⼀、抽象类:抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象⽅法,这是普通类所不能的。
抽象⽅法只能声明于抽象类中,且不包含任何实现,派⽣类必须覆盖它们。
另外,抽象类可以派⽣⾃⼀个抽象类,可以覆盖基类的抽象⽅法也可以不覆盖,如果不覆盖,则其派⽣类必须覆盖它们。
⼆、接⼝:接⼝是引⽤类型的,类似于类,和抽象类的相似之处有三点:1、不能实例化;2、包含未实现的⽅法声明;3、派⽣类必须实现未实现的⽅法,抽象类是抽象⽅法,接⼝则是所有成员(不仅是⽅法包括其他成员);另外,接⼝有如下特性:接⼝除了可以包含⽅法之外,还可以包含属性、索引器、事件,⽽且这些成员都被定义为公有的。
除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。
⼀个类可以直接继承多个接⼝,但只能直接继承⼀个类(包括抽象类)。
三、抽象类和接⼝的区别:1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.⽽接⼝只是⼀个⾏为的规范或规定,微软的⾃定义接⼝总是后带able字段,证明其是表述⼀类类“我能做。
”.抽象类更多的是定义在⼀系列紧密相关的类间,⽽接⼝⼤多数是关系疏松但都实现某⼀功能的类中.2.接⼝基本上不具备继承的任何具体特点,它仅仅承诺了能够调⽤的⽅法;3.⼀个类⼀次可以实现若⼲个接⼝,但是只能扩展⼀个⽗类4.接⼝可以⽤于⽀持回调,⽽继承并不具备这个特点.5.抽象类不能被密封。
6.抽象类实现的具体⽅法默认为虚的,但实现接⼝的类中的接⼝⽅法却默认为⾮虚的,当然您也可以声明为虚的.7.(接⼝)与⾮抽象类类似,抽象类也必须为在该类的基类列表中列出的接⼝的所有成员提供它⾃⼰的实现。
但是,允许抽象类将接⼝⽅法映射到抽象⽅法上。
8.抽象类实现了oop中的⼀个原则,把可变的与不可变的分离。
抽象类和接⼝就是定义为不可变的,⽽把可变的座位⼦类去实现。
“Java程序设计基础”课程习题一、填空1.Java程序分两类___Applet___和application,Java Application 类型的程序,程序从___main方法___开始执行。
2.定义一个Java类时,通过关键字__extends____指明该类的父类。
一个类可以有___1___个父类。
3.用public修饰的类称为_公有类或公用类__。
用public修饰的类成员称为公有成员。
被说明为public的内容可以被__所有其他类___ 使用。
如果public类文件与使用它的类文件不在同一目录中,需要通过__import____语句引入。
4.用___private___ 修饰的类成员称为私有成员。
私有成员只能在__本类__ 中使用。
5.如果子类定义的成员变量与父类的成员变量同名,称为___方法覆盖___ ,要表明使用子类的成员变量,可以在成员变量前加上关键字__super___ 。
6.____Object__ 类是Java类库中所有类的父类。
7.Java字符使用__16位的字符集,该字符集成为__Unicode____ 。
8.当子类中定义的方法与父类方法同名时,称子类方法___覆盖___ 父类方法,子类默认使用自己的方法。
使用父类的同名方法,必须用关键字__super__ 说明。
9.Java源程序文件名的后缀是___.java___,Java字节码文件名的后缀是_.class_____。
10.Java类名的第一个字母通常要求___大写___。
11.Java程序由____类__组成,每个程序有一个主类,Java程序文件名应与____主__类的名称相同。
12.Java__Application_类型的程序需要main()方法,程序从__main____开始执行。
13.布尔型数据类型的关键字是_boolean__ ,占用位数是___1位___ ,有__true__ 和_false_两种值。
抽象类、接口与包 5.5.1 抽象类假设我们要编写一个计算矩形、三角形和圆的面积与周长的程序,若按前面所学的方式编程,我们必须定义四个类:圆类、三角形类、矩形类和使用前三个类的公共类,它们之间没有继承关系,如图5.4所示。
程序写好后虽然能执行,但从程序的整体结构上看,三个类之间的许多共同属性和操作在程序中没有很好地被利用,致使重复编写代码,降低了程序的开发效率,且使出现错误的机会增加。
图5.4 具有相同特征却彼此独立的几个类 仔细分析上面例子中的三个类,可以看到这三个类都要计算面积与周长,虽然公式不同但目标相同。
因此,我们可以为这三个类抽象出一个父类,在父类里定义圆、三角形和矩形三个类共同的数据成员及成员方法。
把计算面积与周长的成员方法名放在父类给予说明,而具体的计算公式再在子类中实现。
如图5.5所示。
这样,我们通过父类就大概知道子类所要完成的任务,而且,这些方法还可以应用于求解平圆类 圆心座标半径 计算面积 计算周长三角形类底边长 高 计算面积 计算周长矩形类 长 宽 计算面积 计算周长行四边形、梯形等图形的周长与面积。
这种结构就是抽象类的概念。
图5.5 抽象类及其应用抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。
使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。
对于抽象类与抽象方法的限制如下:(1) 凡是用abstract 修饰符修饰的类被称为抽象类。
凡是用abstract 修饰符修饰的成员方法被称为抽象方法。
(2) 抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法。
(3) 抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类。
(4) 对于抽象方法来说,在抽象类中只指定其方法名及其类型,而不书写其实现代码。
(5) 抽象类可以派生子类,在抽象类派生的子类中必须圆类 圆心座标 半径三角形类 底边长 高 计算面积 计算周长长宽抽象类梯形类抽象方法计算面积 计算周长矩形计算面积上、下底边 长高实现抽象类中定义的所有抽象方法。
抽象类与接口一.抽象类(Abstract Class)与抽象方法1.抽象方法定义定义方法时用关键字abstract 修饰的方法,其特征是该方法没有方法体。
public abstract void noAction();2.抽象类定义类时用关键字abstract 修饰的类abstract class 类名{}例:abstract class MyClass{int myInt;abstract public void noAction(); //抽象方法!public int getMyInt(){//非抽象方法return myInt;}}3.说明:A.抽象方法必须包含在抽象类中,然而,抽象类中的方法不必都是抽象方法。
B.抽象类不能用来创建对象,但可以用来声明变量。
C.在抽象类中定义抽象方法在于建立一种约定,如果没有这种约定,则需要在各个子类中定义不同名称(不同实现)的方法,将使程序变得十分混乱.一般而言,在抽象类中定义了抽象方法后,就可以在子类中覆盖掉父类的同名方法,然后给予特定的实现。
注意:继承了抽象类的子类一定要覆盖父类的抽象方法,如果不是这样子类也将成为抽象类了。
4.final关键字用来修饰变量,方法和类4.1.public final int A=10; //表示变量为常数,程序运行中不能再改变其值,常数一般为对象所共有,故一般也将常量声明为static finalPublic static final double PI=3.1415926; PI 值保持不变,并为所有对象所共有4.2.Public final void f(){} //表示方法为最终方法,其含义为:继承包含final 方法的类的子类不能覆盖该最终方法,以达到保护父类方法的行为的目的. 即是说,最终方法具有保护方法的功能,禁止对该方法的行为作出任何修改。
4.3.final class MyClass{} 表示该类不能被继承,因为这样的类可能与其他类具有千丝万缕的联系,如果被继承,将导致灾难性后果.与abstract修饰的类相反例如://1。
Python抽象类和接⼝类⼀、抽象类和接⼝类继承有两种⽤途:⼀:继承基类的⽅法,并且做出⾃⼰的改变或者扩展(代码重⽤)⼆:声明某个⼦类兼容于某基类,定义⼀个接⼝类Interface,接⼝类中定义了⼀些接⼝名(就是函数名)且并未实现接⼝的功能,⼦类继承接⼝类,并且实现接⼝中的功能.实践中,继承的第⼀种含义意义并不很⼤,甚⾄常常是有害的。
因为它使得⼦类与基类出现强耦合。
继承的第⼆种含义⾮常重要。
它⼜叫“接⼝继承”。
接⼝继承实质上是要求“做出⼀个良好的抽象,这个抽象规定了⼀个兼容接⼝,使得外部调⽤者⽆需关⼼具体细节,可⼀视同仁的处理实现了特定接⼝的所有对象”——这在程序设计上,叫做归⼀化。
1.做出良好的抽象类,2.规定兼容接⼝3.调⽤者可以⽆需关⼼具体实现细节,可以⼀视同仁处理实现特定接⼝的所有对象。
#做出⼀个良好的抽象class Payment(object):#规定了⼀个兼容接⼝def pay(self):pass#微信⽀付class WeChatPay(object):def pay(self,money):print('微信⽀付了%s'%money)#⽀付宝⽀付class AliPay(object):def pay(self,money):print('⽀付宝⽀付了%s'%money)#苹果⽀付class ApplePay(object):def pay(self,money):print('苹果⽀付了%s'%money)def pay(obj,money):obj.pay(money)weixin = WeChatPay()alipay = AliPay()applepay = ApplePay()#调⽤者⽆需关⼼具体实现细节,可以⼀视同仁的处理实现了特定接⼝的所有对象pay(weixin,100)pay(alipay,200)pay(applepay,300)归⼀化使得⾼层的外部使⽤者可以不加区分的处理所有接⼝兼容的对象集合——就好象linux的泛⽂件概念⼀样,所有东西都可以当⽂件处理,不必关⼼它是内存、磁盘、⽹络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求⽽定)。
抽象类、接口和包——作业Question 1Given:11. public interface Status {12. /* insert code here */ int MY_VALUE = 10;13. }Which three are valid on line 12? (Choose three.)A. finalB. staticC. nativeD. publicE. privateF. abstractG. protectedQuestion 2Given:10. interface Foo {}11. class Alpha implements Foo { }12. class Beta extends Alpha {}13. class Delta extends Beta {14. public static void main( String[] args) {15. Beta x = new Beta();16. // insert code here17. }18. }Which code, inserted at line 16, will cause ang.ClassCastException?A. Alpha a = x;B. Foo f= (Delta)x;C. Foo f= (Alpha)x;D. Beta b = (Beta)(Alpha)x;Question 3Given:10. package com.sun.scjp;11. public class Geodetics {12. public static final double DIAMETER = 12756.32; // kilometers13. }Which two correctly access the DIAMETER member of the Geodetics class? (Choose two.)A. import com.sun.scjp.Geodetics;public class TerraCarta {public double halfway(){ return Geodetics.DIAMETER/2.0; } }B. import static com.sun.scjp.Geodetics;public class TerraCarta {public double halfway() { return DIAMETER/2.0; } }C. import static com.sun.scjp.Geodetics. *;public class TerraCarta {public double halfway() { return DIAMETER/2.0; } }D. package com.sun.scjp;public class TerraCarta {public double halfway() { return DIAMETER/2.0; } }Question 4Given:10. interface Foo { int bar(); }11. public class Sprite {12. public int fubar( Foo foo) { return foo.bar(); }13. public void testFoo() {14. fubar(15. // insert code here16.);17. }18. }Which code, inserted at line 15, allows the class Sprite to compile?A. Foo { public int bar() { return 1; } }B. new Foo { public int bar() { return 1; } }C. new Foo() { public int bar(){return 1; } }D. new class Foo { public int bar() { return 1; } }Question 5Given:1. public interface A {2. String DEFAULT_GREETING = “Hello World”;3. public void method1();4. }A programmer wants to create an interface calledB that has A as its parent. Which interface declaration is correct?A. public interface B extends A { }B. public interface B implements A {}C. public interface B instanceOf A {}D. public interface B inheritsFrom A { }Question 6Given:1. interface TestA { String toString(); }2. public class Test {3. public static void main(String[] args) {4. System.out.println(new TestA() {5. public String toString() { return “test”; }6. });7. }8. }What is the result?A. testB. nullC. An exception is thrown at runtime.D. Compilation fails because of an error in line 1.E. Compilation fails because of an error in line 4.F. Compilation fails because of an error in line 5.Question 7Given:10. abstract public class Employee {11. protected abstract double getSalesAmount();12. public double getCommision() {13. return getSalesAmount() * 0.15;14. }15. }16. class Sales extends Employee {17. // insert method here18. }Which two methods, inserted independently at line 17, correctly complete the Sales class? (Choose two.)A. double getSalesAmount() { return 1230.45; }B. public double getSalesAmount() { return 1230.45; }C. private double getSalesAmount() { return 1230.45; }D. protected double getSalesAmount() { return 1230.45; } Question 8Given:10. interface Data { public void load(); }11. abstract class Info { public abstract void load(); }Which class correctly uses the Data interface and Info class? A. public class Employee extends Info implements Data { public void load() { /*do something*/ }}B. public class Employee implements Info extends Data { public void load() { /*do something*/ }}C. public class Employee extends Info implements Data { public void load() { /*do something */ }public void Info.load() { /*do something*/ }}D. public class Employee implements Info extends Data { public void Data.load() { /*d something */ }public void load() { /*do something */ }}E. public class Employee implements Info extends Data { public void load() { /*do something */ }public void Info.load(){ /*do something*/ }}F. public class Employee extends Info implements Data{public void Data.load() { /*do something*/ }public void Info.load() { /*do something*/ }}Question 9Given:11. public abstract class Shape {12. private int x;13. private int y;14. public abstract void draw();15. public void setAnchor(int x, int y) {16. this.x = x;17. this.y = y;18. }19. }Which two classes use the Shape class correctly? (Choose two.)A. public class Circle implements Shape {private int radius;}B. public abstract class Circle extends Shape {private int radius;}C. public class Circle extends Shape {private int radius;public void draw();}D. public abstract class Circle implements Shape {private int radius;public void draw();}E. public class Circle extends Shape {private int radius;public void draw() {/* code here */}}F. public abstract class Circle implements Shape {private int radius;public void draw() { / code here */ }}接口编程题:(1)所有的可以拨号的设备都应该有拨号功能(Dailup)(2)所有的播放设备都可以有播放功能(Play)。