《第04章接口、内部类和包.ppt》由会员分享,可在线阅读,更多相关《第04章接口、内部类和包.ppt(48页珍藏版)》请在三一办公上搜索。
1、Java2程序设计实用教程(第2版),第4章 接口、内部类和包,4.1 接口4.2 内部类4.3 包4.4 Java API基础,4.1 接口,4.1.1 接口与实现接口的类4.1.2 用接口实现多重继承,4.1.1 接口与实现接口的类,声明接口public interface 接口 extends 父接口 public static final 数据类型 成员变量=常量值;public abstract 返回值类型 成员方法(参数列表);例如,public interface Plane1/平面图形接口 public abstract double area();/计算面积,2.声明实现接口
2、的类,修饰符 class 类 extends 父类 implements 接口列表例如,public class Rectangle2 implements PlaneGraphics2,3.接口的作用,接口与类相似是Java的一种高级编程机制是一组常量定义和抽象方法定义的集合作用利用接口,在Java中可实现多重继承利用接口可以实现不相关类的相同行为,而不考虑这些类之间的层次关系通过接口可以指明多个类需要实现的方法,了解对象的交互性界面,而不必了解对象所对应的类,4.理解接口,接口的思想在于它可以增加很多类都需要实现的功能,使用相同的接口类不一定有继承关系.同一个类也可以实现多个接口。接口只关
3、心功能,并不关心功能的具体实现.,5.接口回调,接口回调是指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法.类似于子类对象赋给父类变量,调用的实际是子类的方法。,图4.1 图形接口与实现图形接口的类,【例4.1】图形接口与实现图形接口的类。,设计平面图形接口PlaneGraphics2。设计长方形类Rectangle2,实现平面图形接口。,6.接口的特点,接口及接口中成员的访问权限都是public接口中的成员方法都是公有的、抽象的实例成员方法接口
4、中的所有抽象方法必须全部被实现接口的类覆盖接口中的成员变量都是常量接口不能被实例化接口是引用数据类型 PlaneGraphics2 g1=new Rectangle2(10,20);,4.1.2 用接口实现多重继承,一个类可以继承一个父类并实现多个接口图4.2 继承机制,【例4.2】长方体类继承长方形类并实现立体图形接口。,设计立体图形接口SolidGraphics2。设计长方体类Cuboid1,继承长方形类并实现立体图形接口。长方体类Cuboid1中必须再次覆盖area()和print()方法。计算周长方法存在问题。,图4.3 长方体类的多重继承,【例4.3】球类实现多个接口。,图4.4 球
5、类的多重继承,7.接口的继承,图4.5 接口的继承,8.接口与抽象类的区别,相同点:两者都包含抽象方法。两者都不能被实例化。两者都是引用数据类型。不同点:抽象类约定多个子类之间共同使用的方法;接口约定多个互不相关类之间共同使用的方法。抽象类与子类之间采用单重继承机制;一个类实现多个接口则实现了多重继承的功能。抽象类及其类中成员具有与普通类一样的访问权限;接口的访问权限有public和默认两种,接口中成员的访问权限均是public。抽象类中可以包含非抽象方法,也可以声明构造方法;接口中的方法全部是抽象方法,不能声明构造方法。抽象类中可以声明成员变量,子类可以对该成员变量赋值;接口中只能声明常量。
6、,4.Java用接口实现多重继承比C+多重继承的优越之处,图4.6 Java单重继承时执行父类或祖先类中的方法,4.2 内部类,声明内部类public class Line/直线类,外部类 protected Point p1,p2;/直线的起点和终点 protected class Point/点类,内部类 protected int x,y;/内部类的成员变量 protected Point(int x,int y)/内部类的构造方法 this.x=x;this.y=y;,2.内部类特性,内部类的类特性内部类不能与外部类同名。内部类具有封装性。内部类具有继承性。内部类具有抽象性。内部类的成
7、员特性使用点运算符“.”引用内部类。例如:Line.Point内部类具有4种类中成员的访问权限。内部类具有静态特性。,【例4.4】设计点类作为直线类的内部类。,设计一个接口Direction,其中约定表示左、右、上、下4个方向的4个常量。设计点类作为直线类的内部类,点类实现方向接口。声明和使用接口中常量声明和调用内部类的成员方法内部类Point编译生成字节码的文件名为Line$Point.class。,图4.7 以(100,100)为起点的4个方向的4条直线,4.3 包,4.3.1 包的概念4.3.2 创建、声明和导入包,4.3.1 包的概念,问题的提出什么是包从逻辑概念看,包(package
8、)是类的集合,一个包中包含多个类;从存储概念看,包是类的组织方式,一个包对应一个文件夹,一个文件夹中包含多个字节码文件;包与类的关系,就像文件夹与文件的关系一样。包中还可以再有子包,称为包等级,子包对应一个子文件夹。,4.3.2 创建、声明和导入包,创建与包同名的文件夹set classpath=.;C:Program FilesJavajdk1.5.0lib;C:myjava声明类所在的包package 包1.包2;例如,package mypackage;/声明所在的包public interface PlaneGraphics2引用包中的类包1.包2.类|接口,4.3.2 创建、声明和导
9、入包,导入包import 包1.包2.类|接口|*;import mypackage.PlaneGraphics2;默认包路径:当前文件夹 包之间类及类中成员的访问权限包中非内部的类或接口只有2种访问权限:public和缺省。在类中成员的4种访问权限中,public和private权限与包无关,而protected和缺省权限与包有关。,4.3.2 创建、声明和导入包,Java源程序结构package/声明包,01句import/导入包,0多句public class 或interface/声明公有类或接口,01句,文件名与该名相同class/声明默认类,0多句interface/声明接口,0多
10、句包可以压缩成文件jar.exe,4.4 Java API基础,4.4.1 Java提供的包概述4.4.2 java.lang语言包4.4.3 java.util实用包,4.4.1 Java提供的包概述,Java的常用包java.lang 语言包java.util 实用包java.awt 抽象窗口工具包java.appletjava.io 输入输出流包 网络包java.sqljavax.swing查看Java包中的类查看Java的源程序及包等级导入Java的包import java.util.Date;,4.4.2 java.lang语言包,Object类package java.lang;p
11、ublic class Object public Object()/构造方法 public final native Class getClass();/返回当前对象所在的类 public boolean equals(Object obj)/比较当前对象与obj是否相等 public String toString()/返回当前对象的信息字符串 protected void finalize()throws Throwable/析构方法,图4.13 Object类中equals()方法,2.Math数学类,public final class Math extends Object pri
12、vate Math()public static final double E=2.7182818284590452354;/常量 public static final double PI=3.14159265358979323846;public static double abs(double a)/求绝对值 public static double max(double a,double b)/最大值 public static double min(double a,double b)/最小值 public static double random()/返回一个0.01.0之间的随机
13、数,3.Comparable接口,public interface Comparable int compareTo(T o)/比较对象 其中,是Comparable接口的参数,表示一个类。,4.基本数据类型的包装类,8个Byte、Short、Integer、Long、Float、Double、Character、Boolean。public final class Integer extends Number implements Comparable public static final int MIN_VALUE=0 x80000000;/最小值常量,-231 public stati
14、c final int MAX_VALUE=0 x7fffffff;/最大值常量,231-1 public Integer(int value)/构造方法 public Integer(String s)throws NumberFormatException public static int parseInt(String s)throws NumberFormatException/将字符串转换为整数,静态方法 public boolean equals(Object obj)/覆盖Object类中方法 public String toString()/覆盖Object类中方法 publ
15、ic int compareTo(Integer anotherInteger)/比较两个对象的大小,返回两者之间的差值,实现Comparable接口中方法,Double和Float类,Double类和Float类实现了对double和float基本型数据的类包装。可以使用Double类的构造方法:Double(double num)创建一个Double类型的对象;使用Float类的构造方法:Float(float num)创建一个Float类型的对象。Double对象调用doubleValue()方法可以返回该对象含有的double型数据;Float对象调用floatValue()方法可以返
16、回该对象含有的float型数据。,2.Byte,Integer,Short,Long类,下述构造方法分别可以创建Byte、Integer、Short和Long类型的对象:Byte(byte num)Integer(int num)Short(short num)Long(long num)Byte、Integer、Short和Long对象分别调用byteValue()、intValue()、shortValue()和longValue()方法可以返回该对象含有的基本型数据。,Character类,Character类实现了对char基本型数据的类包装。可以使用Character类的构造方法:C
17、haracter(char c)创建一个Character类型的对象。Character对象调用charValue()方法可以返回该对象含有的char型数据。,5.String字符串类,public final class String extends Object implements java.io.Serializable,Comparable,CharSequence public String()/构造方法 public String(String original)public String toString()/覆盖Object类中方法 public int length()/返
18、回字符串的长度 public boolean equals(Object obj)/比较字符串是否相等,覆盖Object类中方法 public boolean equalsIgnoreCase(String s)/比较字符串是否相等,忽略字母大小写 public int compareTo(String anotherString)/比较字符串的大小,实现Comparable接口方法 public int compareToIgnoreCase(String str)/比较字符串的大小,忽略字母大小写,【例4.5】设计一个已排序的对象数组类,实现查找算法。,数组元素的通用性设计private
19、Object table;private Comparable table;/存放实现Comparable接口对象使用Integer对象的必要性使用泛型类与否的差别public int compareTo(Integer anotherInteger)/Integer类public int compareTo(String anotherString)/String类SortedArray sa1=new SortedArray(10);,6.Class类操作类,public final class Class private Class()/构造方法 public String getNam
20、e()/返回当前类名字符串 public Class getSuperclass();/返回当前类的父类 public Package getPackage()/返回当前类所在的包System.out.print(this.getClass().getName()+);,Class类的说明,Class是java.lang包中的类,该类的实例用来封装对象运行时的状态。当一个类被加载且创建对象时,和该类相关的一个类型为Calss的对象就会自动创建。Class类本身不提供构造方法,因此,不能使用new运算符和构造方法显示地创建一个Class对象。任何对象调用getClass()方法都可以获取和该对象
21、相关的一个Class对象,这个Class对象调用如下的方法可以获取创建对象的类的有关信息.,使用Class实例化一个对象,创建对象最常用的方式就是使用new运算符和类的构造方法,实际上我们也可以使用Class对象得到一个类的实例。为了得到一个类的对象,可以先得到一个和该类相关的Class对象,做到这一点并不困难,只要使用Class的类方法public static Class forName(String className)throws ClassNotFoundException就可以返回一个和参数className指定的类相关的Class对象。再让这个Class对象调用public Ob
22、ject newInstance()throws InstantiationException,IllegalAccessException方法就可以得到一个className类的对象。,7.System系统类,public final class System extends Object private System()public final static InputStream in=nullInputStream();public final static PrintStream out=nullPrintStream();public final static PrintStrea
23、m err=nullPrintStream();public static native viod arraycopy(Object src,int src_pos,Object dst,int dst_pos,int length)/复制数组 public static void exit(int status)/结束当前运行的程序 public static native long currentTimeMillis();/获得当前日期和时间,返回从1970-1-1 00:00:00开始至当前时间的累计毫秒数 public static Properties getProperties()
24、/获得系统全部属性 public static String getProperty(String key)/获得指定系统属性,8.Runtime运行时类,public class Runtime extends Object private Runtime()/构造方法 public static Runtime getRuntime()/返回与当前应用程序相联系的运行时环境 public long totalMemory()/返回系统内存空间总量 public long freeMemory()/返回系统内存剩余空间的大小【例4.6】获得运行时信息。,4.4.3 java.util实用包,
25、日期类Date日期类public class Date extends Object implements java.io.Serializable,Cloneable,Comparable public Date()/构造方法,获得系统当前日期和时间的Date对象 this(System.currentTimeMillis();public Date(long date)/构造方法,以长整型值创建Date对象 public void setTime(long time)/设置时间对应的长整型值 public long getTime()/返回对象中的时间值 public boolean be
26、fore(Date when)/判断是否在指定日期之前 public boolean after(Date when)/判断是否在指定日期之后 public int compareTo(Date anotherDate)/比较两个日期,(2)Calendar日期类,public abstract class Calendar extends Object implements Serializable,Cloneable,Comparable public static final int YEAR/年,常量 public static final int MONTH/月 public sta
27、tic final int DATE/日 public static final int HOUR/时 public static final int MINUTE/分 public static final int SECOND/秒 public static final int MILLISECOND/百分秒 public static final int DAY_OF_WEEK/星期,(2)Calendar日期类,public abstract class Calendar extends Object implements Serializable,Cloneable,Comparab
28、le public static Calendar getInstance()/创建实例 public int get(int field)/返回日期 public final Date getTime()/返回对象中的日期和时间 public final void setTime(Date date)/设置对象的日期和时间 public final void set(int year,int month,int date)public final void set(int year,int month,int date,int hour,int minute)例如,Calendar now=Calendar.getInstance();/获得实例int year=now.get(Calendar.YEAR);/获得对象中的年份值【例4.7】获得系统当前日期和时间,并按指定格式输出。,2.集合API,Collection有2个子接口:Set(不重复集合)和List(有序不重复集合)。表示数据结构的类有:LinkedList(链表)、Vector(向量)、Stack(栈)、Hashtable(散列表)、TreeSet(树)等。,实验4 设计实现接口的类,设计圆柱体类和圆椎体类将Person1类的成员变量改为出生日期,再设计age()方法求年龄。,