java 程序设计 案例教程

39
Java Java 程程程程 程程程程 程程程程 程程程程 程程程程程程程 第 05 第

Upload: luisa

Post on 04-Jan-2016

134 views

Category:

Documents


0 download

DESCRIPTION

Java 程序设计 案例教程. 第 05 章. 北京大学出版社. 第 05 章 Java 接口与包. 教学目标. Java 语言的接口 接口的定义 接口的实现 Java 语言的包 包的创建与使用. 5.1 Java 语言 的接口与包. 5.1.1 接口的定义 Java 中不允许有多重继承,即如果一个类有父类的,它只能有一个父类。但 Java 并没有限制从多个类中分别继承特性的自由和方便,因此提供了接口这个机制。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Java 程序设计 案例教程

JavaJava程序设计程序设计案例教程案例教程

北京大学出版社

第 05 章

Page 2: Java 程序设计 案例教程

Java 程序设计案例教程

第第 0505 章 章 JavaJava 接口与包 接口与包

Java语言的接口 接口的定义 接口的实现 Java语言的包 包的创建与使用

教学目标

Page 3: Java 程序设计 案例教程

Java 程序设计案例教程

5.1 Java5.1 Java 语言的接口与包语言的接口与包5.1.1 接口的定义

Java中不允许有多重继承,即如果一个类有父类的,它只能有一个父类。但 Java并没有限制从多个类中分别继承特性的自由和方便,因此提供了接口这个机制。接口 (interface)是类的另一种表现方式,

“ ”它是一种特殊的 类 ,更确切地说,它是抽象类功能的另一种实现方法,可将其想

“ ”象为一个 纯 的抽象类。

Page 4: Java 程序设计 案例教程

Java 程序设计案例教程

接口的定义: [public] interface 子接口名 [extends 父接口名列表 ]

{ //接口体 //数据成员声明 //抽象方法声明 [public][abstract][native] 返回值方法名 (参数列表 )

[throw 异常列表 ]; }

一个类只能有一个父类,但它可同时有多个接口,实现多重继承。

 注意:所有属性都必须是 public 、 static 、 final类型;所有方法都必须是 public 、 abstract 类型。

Page 5: Java 程序设计 案例教程

Java 程序设计案例教程

例 5-1 在系统定义的接口—— DataInput 定义语句。

public interface java.io.DataInput{ public abstract boolean readBoolean( ); //读入布尔型数据 public abstract byte readByte( ); //读入字节型数据 public abstract char readChar( ); //读入字符型数据 public abstract double readDouble( ); public abstract float readFloat( ); public abstract void readFully(byte b[] ); //读入全部数据存入字节数 public abstract void readFully(byte b[],int off, int len); public abstract int readInt( ); public abstract String readLine( ); public abstract long readLong( ); public abstract short readSshort( ); public abstract int readUnsignedByte( ); public abstract int readUnsignedShort( ); public abstract String readUTF( ) public abstract int skipBytes(int n); //将读取位置跳过 n个字节}

Page 6: Java 程序设计 案例教程

Java 程序设计案例教程

注意以下几点 :(1) 接口定义用关键字 interface而不是 class。(2) 修饰符 public用来指明任意一个类都可以调用此接口;若无此修饰符,则只有那些与本接口在同一个包中的类才能访问它。

(3) 接口体中的数据成员全是用 final static修饰的,即它们一定是给出标识符的常量,即使在定义时未写也是如此。

(4) 接口体中定义的方法都是抽象方法。(5) 接口没有构造方法。(6) 接口也具有继承性,且一个接口可以继承多个父接口。 (这点与类的继承不同。 )

Page 7: Java 程序设计 案例教程

Java 程序设计案例教程

5.1.2 5.1.2 接口的实现接口的实现

因为没有方法体,所以接口必须被继承,在实现接口的类中必须实现那些抽象方法,给出方法具体的实现细节。实现接口的这些类的实例对应的是一种代码实现,即使有同名同参数类表的方法也不会再产生混乱。

Page 8: Java 程序设计 案例教程

Java 程序设计案例教程

实现接口应注意以下问题。(1) 用 implements声明该类将要实现哪些接口。(2) 若实现某接口不是 abstract类,则在类定义部分必须实现指定接口的所有抽象方法。即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。

(3) 若实现某接口是 abstract类,则它可以不实现该接口的方法。

(4) 一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。

(5) 接口的抽象方法的访问修饰符都已指定为 public,所以类在实现方法时,必须显示地使用 public修饰符,否则将被系统警告。

Page 9: Java 程序设计 案例教程

Java 程序设计案例教程

用户定义类的完整格式用户定义类的完整格式[修饰符 ] class 类名 [extends父类名 ] [implements 接口名列表 ]

{ [修饰符 ] 数据成员; //声明及初始化 [修饰符 ] 方法成员; //声明及方法体}引发接口的名字冲突,一般系统将按以下方式处理

(1) 父接口中有同名的有名常量,使用指定具体有名常量的格式: <接口名 >. <常量名 >。

(2) 若两个直接父接口中包含有相同名但返回类型不同方法,那么将引发编译错误。

(3) 若两个直接父接口中包含有相同名且返回类型相同的方法,那么类中只能继承保留一个。

Page 10: Java 程序设计 案例教程

Java 程序设计案例教程

interface A{ //接口 A定义 String a= "接口 A中的常量 "; void showA(); adstract void setAColor();}interface B extends A{ //接口 B定义,继承 A String b="接口 B中的常量 "; void showB(); adstract void setBColor();} interface C extends B{ //接口 C定义,继承 B String c="接口 C中的常量 "; void showC(); adstract void setCColor();}

例 5-2 实现接口应用程序。

Page 11: Java 程序设计 案例教程

Java 程序设计案例教程

class implnterfaceABC implements C{ //类实现接口 public void showA() { System.out.println(); } public void setAColor() { System.out.println("设置的是接口A的颜色! "); } public void showB() { System.out.println(); } public void setBColor() { System.out.println("设置的是接口B的颜色! "); } public void showC() { System.out.println(); } public void showC() { System.out.println(); } public void setCColor() { System.out.println("设置的是接口C的颜色! "); }}

Page 12: Java 程序设计 案例教程

Java 程序设计案例教程

public class interfacelnheritanceTest{

public static void main(String[] args){

implnterfaceABC intf=new implnterfaceABC();

intf.showA(); intf.setAColor();

intf.showB(); intf.setBColor();

intf.showC(); intf.setCColor();

}

}

Page 13: Java 程序设计 案例教程

Java 程序设计案例教程

设计类的过程中,应该注意如下事项(1) 类的定义与实现是放在一起保存的,整个类必须保存在一个文件中。

(2) 公共类名即是文件名。(3) 新类必须在已有类的基础上构造。(4) 在已有类的基础上构造新类的过程称为派生。(5) 派生出的新类称为已有类的子类。(6) 子类继承父类的方法和属性。(7) 当没有显式指定父类时,父类隐含为 Java.lang包中的

Object类。 Object类是 Java中唯一没有父类的类,是所有类的父类。

(8) 使用 extends可以继承父类的数据成员和方法成员,形成子类,也就是说子类是父类派生出来的。

Page 14: Java 程序设计 案例教程

Java 程序设计案例教程

抽象类和接口的主要区别(1) 在接口中所有的方法都是抽象方法,都没有方法体;而在抽象类中定义的方法可以不限于抽象方法。

(2) 接口中定义的成员变量都默认为终极类变量,即系统会为其自动增加 final 和 static这两个关键字,并且对该变量必须设置初值,而抽象类中没有此限制。

(3) 一个类只能由唯一的一个类继承而来,但可以实现多个接口。

抽象类和接口相似之处: 二者都不能实例化。

Page 15: Java 程序设计 案例教程

Java 程序设计案例教程

5.1.3 5.1.3 接口回调接口回调

接口回调是指把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。

Page 16: Java 程序设计 案例教程

Java 程序设计案例教程

interface ShowMessage{void ShowSB(String s);

}class TV implements ShowMessage{

public void ShowSB(String s){System.out.println(s);

}}class PC implements ShowMessage{

public void ShowSB(String s){System.out.println(s);

}}public class Test_ex{

public static void main(String args[]) { ShowMessage sm; //声明接口变量

sm=new TV(); //接口变量中存放对象的引用sm. ShowSB("电视机 "); //接口回调sm=new PC(); //接口变量中存放对象的引用sm. ShowSB("三星 A5000"); //接口回调

}}

例 5-3 在使用接口回调技术。

Page 17: Java 程序设计 案例教程

Java 程序设计案例教程

5.1.45.1.4 节小结节小结

接口的定义和实现。在 Java程序设计中,一个类只 能有一个父类,这样程序结构简单,层次清楚。但 实际中往往需要多重继承,因此 Java提供了接口用 于实现多重继承 ,一个类可以有一个父类和多个接口。接口定义

[修饰符 ] interface <接口名 >{ 接口体 }

接口实现 class <类名 > implements <接口 1> , <接口 2> ,… { 类体 }

Page 18: Java 程序设计 案例教程

Java 程序设计案例教程

5.2 Java5.2 Java 包包Java 程序设计就是定义类的过程。

包含 :系统定义好的类和用户自行定义的类。包是类和接口的一种松散集合。使用包的主要目的是实现不同程序之间类的重用。

Page 19: Java 程序设计 案例教程

Java 程序设计案例教程

5.2.1 5.2.1 创建包创建包创建无名包

系统自动为每个 .java源文件创建一个无名包。该 .java 源文件中定义的所有类隶属于这个包,它们之间 ( 除 private, protect类型外 )可以相互引用。

注意:无名包中的类不能被其他包中的类使用和复用。

创建有名包 创建有名包时,必须在整个源文件的第一行完成。 明语句格式:  package 程序包名; 例如: package CardSystem;

//在当前文件夹下建立子文件夹 CardSystem package CardSystem .CardClasses;

//在当前文件夹的子文件夹 CardSystem下建立子文

件夹 CardClasses

Page 20: Java 程序设计 案例教程

Java 程序设计案例教程

5.2.2 5.2.2 使用包使用包使用包名、类名前缀

在同一个类中,在要使用的属性或方法名前加上类名作为前缀。若要使用其他包中的类,须在类名前再加上包名作为前缀。例如: CardClasses.D200 my200=new CardClasses.D200(12345,12); System.out.println(my200.toString( ));

加载需要使用的类使用 import 语句将需要使用的整个类加载到当前程序中。例如: import CardClasses.D200; //在程序开始加载其他包的类 D200 my200=new D200(12345, 12);

加载整个包 先设置包的路径;使用 import 语句加载其他包中的一个类或

引入整个包,格式如下:import 程序包名.类名;import 程序包名. * ;

Page 21: Java 程序设计 案例教程

Java 程序设计案例教程

包的访问权限 一个包中只有访问权限为 public的类才能被其他包引

用 (创建此类的对象 ),其他有默认访问权限的类只能在同一个包中使用。( 1 ) public类的成员

public类的 public成员可以被其他包的代码访问。 它的 protected成员可以被由它派生的在其他包中的子类访问。( 2)默认访问权限类的成员

默认访问权限类的成员,不能被其他包的代码访问。

Page 22: Java 程序设计 案例教程

Java 程序设计案例教程

包 接口和类的用途java.applet Applet

java.awt 图形和图形用户接口java.awt.datatranster 剪切和粘贴功能java.awt.event 事件处理java.awt.image 图像处理java.awt.peer 平台无关图形java.beans 软件组件java.io 输入 / 输出java.lang 语言的核心功能java.lang.reflect 映射 (“ 自省” )

java.math 任意精度算术运算java.net 联网

常用 java 和 javax子包

Page 23: Java 程序设计 案例教程

Java 程序设计案例教程

包 接口和类的用途java.rmi 远程方法调用java.rmi.dgc 支持 java.rmi

java.rmi.registry 支持 java.rmi

java.rmi.server 支持 java.rmi

java.security 安全java.security.acl 支持 java.security

java.security.interfaces 支持 java.security

java.sql 数据库java.text 国际化java.util 各种工具java.util.zip 压缩和解压缩java.rmi 远程方法调用

常用 java 和 javax子包

Page 24: Java 程序设计 案例教程

Java 程序设计案例教程

常用javax

子包及其接口和类的用途

包 接口和类的用途javax.accessibility 判定技术javax.swing “ 轻便”的图形和图形用户javax.swing.border 专用边界javax.swing.colorchooser 颜色选择javax.swing.event 扩展 java.awt.event 的事件处理javax.swing.filechooser 文件选择javax.swing.plaf 可插入的外观和效果javax.swing.plaf.basic 基本的外观和效果javax.swing.plaf.metal 金属的外观和效果javax.swing.plaf.multi 复合体的外观和效果javax.swing.table 数据的表单表示javax.swing.text 文本的表示和处理javax.swing.text.html HTML 文本javax.swing.text.rtf RTF(Rich Text Format) 文本javax.swing.tree 数据的树型表示javax.swing.undo 文本编辑中的撤销功能

Page 25: Java 程序设计 案例教程

Java 程序设计案例教程

常用类—— System系统类

用 System类获取标准输入 /输出, System类的3个属性如下所述。

(1)  public static PrintStream err; //标准错误输出

(2)  public static InputStream in; //标准输入 例如: char c=System.in.read( );

(3)  public static PrintStream out; //标准输出 例如: System.out.println(“Hello! Guys.”);

Page 26: Java 程序设计 案例教程

Java 程序设计案例教程

常用类—— Runtime运行时类 Runtime类可以直接访问运行时的资源,如 totalMemory()方法可以返回系统的内存总量, freeMemory()方法可以返回内存的剩余空间。

Page 27: Java 程序设计 案例教程

Java 程序设计案例教程

常用类——类操作类 Class 和 ClassLoader

Class 类提供运行的信息,例如名字、类型及父类等。

例如: this.getClass().getName() ;可以得到当前对象的类名。当前对象 (this) 调用 Object 类的getClass() 方法,得到当前对象的类返回给Class 类,再调用 Class 的 getName() 方法,得到当前对象的类名。

ClassLoader 类提供把类装入运行环境的方法。

Page 28: Java 程序设计 案例教程

Java 程序设计案例教程

Date类的构造方法Date()可获得系统当前日期和时间。

常用类—— Date时间和日期类

方 法 描 述

boolean after(Date date) 如果调用 Date 对象所包含的日期迟于由 date 指定的日期,则返回 true ;否则返回 false

boolean before(Date date) 如果调用 Date 对象所包含的日期早于由 date 指定的日期,则返回 true ;否则返回 false

boolean equals(Object date)比较两个日期。如果调用 Date 对象包含的时间和日期与由 date 指定的时间和日期相同,则返回 true; 否则返回 false

int compareTo(Date date)将调用对象的值与 date 的值进行比较。如果这两者数值相等,则返回 0 ;如果调用对象的值早于 date 的值,则返回一个负值;如果调用对象的值晚于 date 的值,则返回一个正值

int compareTo(Object date) 如果 obj 属于类 Date ,其操作与 compareTo(Date) 相同;否则,引发一个 ClassCastException 异常

Page 29: Java 程序设计 案例教程

Java 程序设计案例教程

常用类—— Date时间和日期类方 法 描 述

int getYear() 返回该日期表示的年,并减去 1900

int getMonth() 返回该日期表示的月,返回值在 0 ~ 11 之间,0 表示一月

int getDate() 返回该日期表示的一个月的日,返回值在 1 ~31 之间

int getDay() 返 回 该 日 期 表 示 的 星 期 , 返 回 值 在 0 ~ 6 之间, 0 表示星期天

int getHours() 返回该日期表示的时,返回值在 0 ~ 23 之间

int getMinutes() 返回该日期表示的分,返回值在 0 ~ 59 之间

int getSeconds() 返回该日期表示的秒,返回值在 0 ~ 60 之间。数值 60 只出现在计算闰秒的 JVM 中

Page 30: Java 程序设计 案例教程

Java 程序设计案例教程

常用类—— Date时间和日期类方 法 描 述

long getTime() 返回该日期表示的从 GMT1970.1.1 , 00:00:00起的毫秒数

void setYear(int year) 设置该日期的年为指定数值加 1900

void setMonth(int month) 将该日期的月设置为指定的数值。 Month 是在0 ~ 11 之间的月值

void setDate(int date) 将一个月中的日期设置为指定数值。 Date 是在1 ~ 31 之间的值

String toString() 创建日期规范的字符串表示,且返回结果

void setTime(long time)设置表示从 GMT1970.1.1 , 00:00:00起的毫秒数的日期,time 为毫秒数

long getTime() 返回该日期表示的从 GMT1970.1.1 , 00:00:00起的毫秒数

Page 31: Java 程序设计 案例教程

Java 程序设计案例教程

Calendar类可以将 Date()对象的属性转换成 YEAR 、 MONTH 、 DATE 和DATE_OF_WEEK等常量。

Calendar类没有构造方法,可以用getInstance()方法创建一个实例,再调用get方法和常量获得日期或时间的部分值。

常用类—— Calendar类

Page 32: Java 程序设计 案例教程

Java 程序设计案例教程

5.2.35.2.3 节小结节小结 包是类的逻辑组织形式。在程序设计中,可 用系统提供的包,也可声明类所在的包,同一个包中类的名字不能重复。 包是有等级的,即包中可以有包。 创建和包的使用,要求不仅会引入系统包,还能自己创建包或引用其他设计者设计的包。包的引用有两种方法:

一种是用 import 语句引用;一种是使用包名、类名做前缀进行引用。

Page 33: Java 程序设计 案例教程

Java 程序设计案例教程

5.3 5.3 综合应用案例综合应用案例

interface Income{public void getFee();

}interface AdjustTem{

public void controlTemperature();}class Bus implements Income{

public void getFee(){System.out.println(" 公共汽车: 1 元 / 张,不计算千米

数 ");}

}class Taxt implements Income,AdjustTem{

public void getFee(){System.out.println(" 出租车: 1.60 元 / 千米:起价 3 千

米 "); }

public void controlTemperature(){ System.out.println(" 安装了 haier 空调: 8700 元 / 台 ");

}}

案例 5.3.1 单位主管对各类支出基本价格的了解管理程序。

Page 34: Java 程序设计 案例教程

Java 程序设计案例教程

案例 5.3.1

class Cinema implements Income,AdjustTem{public void getFee(){

System.out.println(" 电影院:门票, 10 元 / 张 ");}public void controlTemperature(){ System.out.println(" 安装了中央空调: 27567 元。 ");}

}public class Test_interface1{

public static void main(String args[]){Bus ql=new Bus();

Taxt dzh=new Taxt(); Cinema hx=new Cinema(); ql.getFee(); dzh.getFee(); hx.getFee(); dzh.controlTemperature(); hx.controlTemperature();}

}

Page 35: Java 程序设计 案例教程

Java 程序设计案例教程

案例 5.3.2 获取当前年份、出生年份程序

文件 Date.jave 中的代码: package Firstpackage;import java.util.*; // 导入 Java 的实用包中所有的类public class Date{ // 声明 Date 类 private int year,month,day; public Date(int y,int m,int d){ year=y; month=m; day=d;}public Date(){;}public int thisyear(){ // 方法 thisyear 得到当前年份 return Calendar.getInstance().get(Calendar.YEAR); }}

Page 36: Java 程序设计 案例教程

Java 程序设计案例教程

文件 Person_ex.java 中的代码: import Firstpackage.*; // 导入 Firstpackage 的实用包中所有的类class Person{ // 声明 Person

String name;int age;public Person(String na,int ag){

name=na;age=ag;

}public Person(){;}public int birth(int y){ // 此方法得到出生的年份

return y-age+1;}

}public class Person_ex{public static void main(String args[]){

Person ps=new Person("Tom ",21);Date now=new Date(); // 创建包 Firstpackage 中类 Date 的对象int y=now.thisyear();System.out.println(ps.name+"was born in "+ps.birth(y));}

}

案例 5.3.2 获取当前年份、出生年份程序

Page 37: Java 程序设计 案例教程

Java 程序设计案例教程

5.4 5.4 章小结与重点章小结与重点通过对接口和包的学习,使得 Java程序设计更加灵活完整;重点学习了接口的定义和实现;接口用于实现多重继承,接口的声明是由 interface关键字定义的;接口的实现是由类声明语句中 implements关键字实现的。在程序设计中使用和设计包。包引用两种方法:

一种是用 import语句引用;另一种是使用包名、类名做前缀进行引用。

Page 38: Java 程序设计 案例教程

Java 程序设计案例教程

5.5 5.5 章习题章习题简答题

Java 实现多重继承的机制是什么?怎么实现?什么是抽象类?什么是抽象方法?Java 的接口有什么特点?

编写程序以电话类为父类,移动电话和固定电话为两个子类,并使移动电话实现接口:可移动。固定电话又有子类:无绳电话。定义这几个类,明确它们的继承关系。

Page 39: Java 程序设计 案例教程

Java 程序设计案例教程

5.6 5.6 章综合实验项目章综合实验项目实验项目:区分能力的接口程序。 实验要求:利用接口继承完成生物 (Biology)、动物

(Animal)、人 (Man)3个接口的定义。其中Biology接口定义一个抽象方法breath() , Animal接口定义两个抽象方法 sex()和 ate() , Man接口定义两个抽象方法 think()和 study();定义一个 NormalMan类实现上述 3个接口中定义的抽象方法。