《J接口和内部类》PPT课件.ppt

上传人:w****2 文档编号:16539359 上传时间:2020-10-09 格式:PPT 页数:45 大小:967KB
收藏 版权申诉 举报 下载
《J接口和内部类》PPT课件.ppt_第1页
第1页 / 共45页
《J接口和内部类》PPT课件.ppt_第2页
第2页 / 共45页
《J接口和内部类》PPT课件.ppt_第3页
第3页 / 共45页
资源描述:

《《J接口和内部类》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《J接口和内部类》PPT课件.ppt(45页珍藏版)》请在装配图网上搜索。

1、接口和内部类 Interfaces void method2(); 一个抽象类甚至可以没有抽象方法 只要包含有 abstract 方法,类就必须被声明 为 abstract,否则就不能编译。 抽象类的语法 Java (SSXDU 2010) 6 abstract class AnimalKingdom private String phylum; public AnimalKingdom(String p) phylum = p; public String getPhylum() return phylum; public abstract void eat(); 抽象类:例 定义抽象方法的

2、类必须是抽象类。 抽象类中的抽象的方法 -在该类中定义但不 在该类中提供实现 ,由继承类提供细节。 Java (SSXDU 2010) 7 抽象类和方法 可以有数据 和定义 不可以创 建实例 必须定义所有的 abstract方法才可 以被实例化 (否则类 仍然是 abstract类 ) Java (SSXDU 2010) 8 abstract Instrument 一些方法和数据可以被定义 剩余其它代码是一样的 abstract class Instrument private int i; / Storage allocated for each public abstract void p

3、lay(Note n); public String what() return Instrument; public abstract void adjust(); Java (SSXDU 2010) 9 接口 (interface) 和抽象 (abstract)类有什么不同 ? 为什么都存在与 Java中 ? 什么时候该用一个抽象类,什么时候改用一个 接口 ? 问题? 接口 Interfaces Java (SSXDU 2010) 11 接口 “纯 (pure)” abstract class 完全抽象的类 允许创建者象建立一个类一样进行创建 : method names, argumen

4、t lists, and return types, but no method bodies. can also contain fields, but these are implicitly static and final. 常量 “所有实现了该特定接口的类看起来都像这样” interface public void keyReleased(KeyEvent e); public void keyTyped(KeyEvent e); 一个接口描述方法但不提供方法的具体实现 方法名、参数列表和返回类型 Java (SSXDU 2010) 13 例 ordinary class Java

5、(SSXDU 2010) 14 例 代码 interface Instrument / Compile-time constant: int I = 5; / static / Automatically public String what(); void adjust(); class Wind implements Instrument public void play(Note n) System.out.println(Wind.play() + n); public String what() return Wind; public void adjust() Other clas

6、ses are similar Java (SSXDU 2010) 18 Java中的多重继承 没有任何与接口相关的存储,因此也就无法阻止多个接 口的组合。 C+中,组合多个类的接口的行为被称为多重继承。它 可能会使你背负很沉重的包袱,因为每个类都有一个实 现。 Java中只有一个类有具体实现。 Java (SSXDU 2010) 19 例: Adventure interface CanFight void fight(); interface CanSwim void swim(); interface CanFly void fly(); class ActionCharacter pu

7、blic void fight() class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly public void swim() public void fly() When you define a new interface, you are defining a new reference data type. Java (SSXDU 2010) 20 例: Adventure (续) public class Adventure public static void t(CanFight x) x.

8、fight(); public static void u(CanSwim x) x.swim(); public static void v(CanFly x) x.fly(); public static void w(ActionCharacter x) x.fight(); public static void main(String args) Hero h = new Hero(); t(h); / Treat it as a CanFight u(h); / Treat it as a CanSwim v(h); / Treat it as a CanFly w(h); / Tr

9、eat it as an ActionCharacter Using an Interface as a Type Java (SSXDU 2010) 21 通过继承来扩展接口 interface Monster void menace(); interface DangerousMonster extends Monster void destroy(); interface Lethal void kill(); class DragonZilla implements DangerousMonster public void menace() public void destroy()

10、interface Vampire extends DangerousMonster, Lethal void drinkBlood(); a simple extension only when inheriting interfaces Java (SSXDU 2010) 22 组合接口时的名字冲突 interface I1 void f(); interface I2 int f(int i); interface I3 int f(); class C public int f() return 1; class C2 implements I1, I2 public void f()

11、 public int f(int i) return 1; / overloaded class C3 extends C implements I2 public int f(int i) return 1; / overloaded class C4 extends C implements I3 / Identical, no problem: public int f() return 1; / Methods differ only by return type: /! class C5 extends C implements I1 /! interface I4 extends

12、 I1, I3 interfaces I3 and I1 are incompatible; both define f( ), but with different return type f( ) in C cannot implement f( ) in I1; attempting to use incompatible return type Java (SSXDU 2010) 23 群组常量 接口中的域是 public, static 和 final 的,所以接 口就称为了一种很便捷的用来创建常量组的工具 Java SE5之前要产生类似 C或 C+中 enum (Java SE5)

13、类型 public interface Months int JANUARY = 1, FEBRUARY = 2, MARCH = 3, APRIL = 4, MAY = 5, JUNE = 6, JULY = 7, AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10, NOVEMBER = 11, DECEMBER = 12; 不必显式指定 public Java (SSXDU 2010) 24 初始化接口中的域 自动 static和 final 不可以是 “空 final” 可以被非常量表达式初始化 既然是 static的,它们就可以在类第一次被加 载时初始化

14、The fields are not part of the interface. The values are stored in the static storage area for that interface. Java (SSXDU 2010) 25 嵌套接口 接口可以嵌套在类或其他接口中。 class A interface B void f(); public class BImp implements B public void f() interface E interface G void f(); public class NestingInterfaces publi

15、c class BImp implements A.B public void f() class EImp2 implements E public void g() class EG implements E.G public void f() Java (SSXDU 2010) 26 再看接口 interface KeyListener public void keyPressed(KeyEvent e); public void keyReleased(KeyEvent e); public void keyTyped(KeyEvent e); Java (SSXDU 2010) 27

16、 适配器 class KeyAdapter implements KeyListener public void keyPressed(KeyEvent e) ; public void keyReleased(KeyEvent e) ; public void keyTyped(KeyEvent e) ; Java (SSXDU 2010) 28 接口练习 P179 练习 12 P181 练习 14 内部类 Inner Classes Java (SSXDU 2010) 30 内部类 可以将一个类的定义放在另一个类的定义内部, 这就是内部类。 内部类是非常有用的特性,因为它允许你把一些逻辑

17、相关的类组织在一起,并控制位于内部的类的可视性。 与组合完全不同。 Since JDK 1.1 As a result, they are not as well done as some other aspects of the language Java (SSXDU 2010) 31 内部类 Someone to share my most private thoughts (and variables and methods). Someone who knows EVERYTHING about me. An intimate relationship shared between

18、two objects - an outer and an inner. You dont have to make an instance of an inner class in order to have an instance of the outer class. But you can NEVER make an instance of my inner class without an outer object to bind it to. Outer objects can have several inner objects. Java (SSXDU 2010) 32 内部类

19、 把一个类的定义置于另一个外围类的里面。 包含内部类的类称为 外部类。 与一般的类一样,内部类可以有自己的成员变 量和成员方法。 使用内部类必须要先了解内部类与包围它的外 部类之间的关系,以及它们之间的成员如何实 现相互访问。 如果想从外部类的非静态方法之外的任意位置创建某 个内部类的对象,那么就必须具体地指明这个对象的 类型: OuterClassName.InnerClassName Java (SSXDU 2010) 33 内部类 class Outer private int size ; /外部类的成员变量 private String thoughts = My outer tho

20、ughts; class Inner /声明内部类 String innerThoughts = My inner thoughts; /内部类的成员变量 void doStuff() /内部类的成员方法 / inner object has its own this System.out.println( innerThoughts ); / and it also has a kind of outer this / even for private data of outer class System.out.println(thoughts); Java (SSXDU 2010) 34

21、 内部类 class TestMe public static void main( String args ) / instantiate me, the outer object Outer o = new Outer(); / Inner i = new Inner(); / NO! Cant instantiate Inner by itself! Outer.Inner i = o.new Inner(); / now I have my special inner object i.doStuff(); / OK to call methods on inner object Yo

22、u can also instantiate both the outer class and inner class at the same time: Outer.Inner i = new Outer().new Inner(); Java (SSXDU 2010) 35 内部类的特性 Java将内部类作为外部类的一个成员,就如同 其成员变量与成员方法一样; 所以,一般类只能是 public和非 public(缺省 ),而 内部类可以指定为 private 和 protected; 如果内部类为 private,只有本类可以使用它; 如果内部类为 protected,只有外层类、与外层类

23、 处于同一包中的类、以及外层类的子类可以访问它; 内部类 可以 实现接口 及 抽象类中的抽象方法 外层类可以将上述实现细节乃至内部类都 隐藏 起来, 给外界提供接口 Java (SSXDU 2010) 36 嵌套类的访问规则 内部类与外部类的访问规则 内部类与外部类各有自己的成员; 在外部类中, 通过内部类对象引用内部类 ;在外部 类的 main方法或其他类中访问内部类,在必须给出 内部类的完整名字,如, Group1. Student 在内部类中,可以直接引用外部类的所有成员 ,包 括外部类的静态成员、实例成员以及私有成员; Java (SSXDU 2010) 37 嵌套类的访问规则 pub

24、lic class Group2 private int count; public class Student String name; public Student(String n1) name = n1; count+; public void output() System.out.print(this.name + ); public void output() Student s1 = new Student(李明 ); s1.output(); System.out.println( count = +this.count); public static void main (

25、String args) Group2 g2 = new Group2( ); g2.output(); Group2.Student s = new Group2.Student(李四 ); s.output(); 声明内部类 访问其外部类的 成员变量 内部类的成员:name, output() 编译出错,因在静态方法 main中, 不能访问非静态成员类 Student 的构造方法 创建内部类对象, 并通过内部类对象 访问内部类成员 外部类方法,与内 部类方法同名 问题:该语句能否 正确执行 Java (SSXDU 2010) 38 内部类的特性 内部类可以定义为抽象类型 但需要被外部类的其

26、他内部类继承与实现 内部类可以是一个接口 但这个接口需要被外部类的其他内部类实现 Java (SSXDU 2010) 39 public class Group5 public interface Student_info public void output(); public class Student implements Student_info int count; String name; public Student(String n1) name = n1; count+; public void output() System.out.println(this.name +

27、count=+this.count); public Group5(String name1) Student s1; int i=0; while (i0) g5 = new Group5(args); 内部接口 实现内部接口 内部类 内部类的构造方法 实现接口方法 外部类的构造方法 外部类引用内部类: 创建内部类对象,通过内部 类对象访问内部类方法 Java (SSXDU 2010) 40 运行并输入参数 输出结果 由于 count是实例成员, 不能纪录创建对象的个数 Java (SSXDU 2010) 41 静态嵌套类 顶层嵌套类 class Outer static class Inn

28、er 静态嵌套类只与外部类有关,而不是外部类的实例。 Outer.Inner i = new Outer.Inner(); 要访问外部类中的非静态成员,则必须在内部类创建外部类的对象,通过对象名访问外部非静态成员 非静态内部类不能声明静态成员,只有静态内部类才可以声明静态成员; 由于内部类被声明为静态后无法正常访问外部类非静态成员,受到很大的限制 Java (SSXDU 2010) 42 使用静态内部类的原因 需要在内部类定义静态成员; 希望隐藏内部类; 避免类名重复 在开发大型应用程序时需要设计大量的类,类存在重 名的可能 为了避免这种情况,可以把可能重名的类设置为 static、 publ

29、ic的内部类 其他类在引用时要使用完成的内部类名标识( 外部类 名 .内部类明 ),这样就避免了类名重复。 Java (SSXDU 2010) 43 public class Group6 public static class Student static int count; String name; int number; public Student(String n1) name = n1; count+; number = count; public void output() System.out.println(this.name + number=+this.number);

30、 public static void main (String args) Group6.Student s1 = new Group6.Student(A); s1.output(); Group6.Student s2 = new Group6.Student(B); s2.output(); 定义静态公用内部类 静态内部类中的 静态变量 纪录创建对象的序号 静态内部类的构造方法 创建一个对象 序号自动增加 在静态 main方法中,通过完整的内 部类标示符创建内部类对象 Java (SSXDU 2010) 44 在静态 main方法中,通过完整的内部类标示符 Group6.Student

31、创建内部类对象,并使用静态 成员变量记录创建对象的序号 Java (SSXDU 2010) 45 静态内部类的特殊用法 编译上面源程序 Group6.Java,查看类的字节 码文件,不但有编译后产生的类 Group6的字节 码文件 Group6 .class,还产生一个名字为 Group6$Student.class的文件,嵌套类的 字节码文件名是以外部类名和“ $”开头,接着 是嵌套类的名字 在开发应用程序时需要编写大量的类,并需要 对这些类进行调试、演示 根据静态内部类的特点,在编写一个类时,在类中可 以定义一个静态内部类作为一个独立的、可选的辅助 功能,如,用作代码的测试和演示,方便而有

32、效 Java (SSXDU 2010) 46 public class Outer /外部类 private int i, j; static int s=1; Outer(int a,int b) i=a; j=b; public void dis() System.out.println(i+ +j); public static class Test /含有静态 main方法的静态内部类 public static void main (String args) /测试外部类 Outer t=new Outer(10,100); /创建外部类对象 t.dis(); System.out.

33、println(s); /静态内部类可访问外部类静态成员 例:利用静态内部类调试外部类 首先编译源程序 Outer.java,会产生两个 class 文件: Outer.class和 Outer$Test.class。 然后 运行 Outer$Test可完成对外部类的测试 Java (SSXDU 2010) 47 匿名内部类 / A method that returns an anonymous inner class. public class Parcel6 public Contents cont() return new Contents() private int i = 11;

34、public int value() return i; ; / Semicolon required in this case public static void main(String args) Parcel6 p = new Parcel6(); Contents c = p.cont(); combines the creation of the return value with the definition of the class Java (SSXDU 2010) 48 小结 接口( interface)就是方法定义和常量值的集合。 从本质上讲,接口是一种特殊的抽象类,这种 抽象类中只包含常量和方法的定义,而没有变 量和方法的实现。 An interface defines a protocol of communication between two objects. 不相关的类可以实现( implement)同一个接口, 同一个类可以实现多个不相关的接口。 允许一个类的定义在另一个类里 集中使用某些共同特性 GUI event handlers

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!