ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:18.26KB ,
资源ID:7039850      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7039850.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(java语言基础内部类2.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

java语言基础内部类2.docx

1、java语言基础内部类2内部类 内部类包括如下几种形式: l 作为类成员的内部类; l 成员方法中定义的内部类; l 匿名内部类; l 静态内部类。 1作为类成员的内部类 1.1内部类的编写 内部类和外部类的定义形式相同,但是需要在类中定义: public class MyOuter public class MyInner 该文件编译后能够生成两个类:MyOuter.class和MyOuter$MyInner.class。 注意:内部类的访问控制符有:public、protected、private和缺省的,与类的成员变量和成员方法的访问控制符相同,而外部类的访问控制符只有public和缺省

2、的。 内部类可以访问所在的外部类的成员变量,包括私有成员变量,就像类自身的方法能够访问类的所有类型的成员变量一样,例如下面的代码是正确的: public class MyOuter private String name=test; class MyInner public void print() System.out.println(name); 内部类中不能定义static类型的方法,下面的代码是错误的: public class MyOuter private String name=test; class MyInner public static void print() Syst

3、em.out.println(name); 内部类可以是抽象的,内部类可以继承某个类,也可以实现某个接口, public class MyOuter private String name=test; abstract class MyInner1 public abstract void print(); class MyInner2 extends MyInner1 implements Serializable public void print() System.out.println(name); 内部类也可以是final类。 1.2从外部类的代码中使用内部类 可以把内部类的对象作为

4、外部类的成员变量使用,可以在外部类的方法中使用内部类的对象。 下面的代码演示了如何把内部类的对象作为成员并且展示了两种实例化的代码: public class MyOuter private MyInner in=new MyInner(); /定义的时候实例化 private MyInner in2; / 先定义 public MyOuter() in2 = new MyInner(); / 在构造方法中实例化,也可以在其他方法中实例化 下面的代码展示了如何在外部类的方法中使用内部类的对象: public class MyOuter public void makeInner() MyInn

5、er in3 = new MyInner(); /方法中定义变量并实例化 in3.print(); 上面的实例化代码相当于MyOuter.MyInner in3 = this.new MyInner();,因为在类的内部使用所以在类型前面省略了MyOuter,实例化的时候省略的“this.”。 1.3 从外部类的代码外实例化内部类 在外部类的代码之外使用内部类,就像访问类的实例变量一样,需要先创建外部类的对象,然后通过外部类的对象访问内部类的方法,下面的代码展示了用法: public static void main(String args) MyOuter.MyInner in = new

6、MyOuter().new MyInner(); in.print(); MyOuter out = new MyOuter(); MyOuter.MyInner in2 = out.new MyInner(); in2.print(); 代码中展示了两种方式,两种方式的作用是相同的,下面的代码是错误的: MyOuter.MyInner in3 = MyOuter.new MyInner(); MyOuter.MyInner in4 = new MyOuter.MyInner(); 注意:在外部类的代码之外使用内部类,内部类必须是可见的,下面的代码是错误的: public class MyOu

7、ter private class MyInner public void print() System.out.println(name); public class Main public static void main(String args) MyOuter.MyInner in = new MyOuter().new MyInner(); 1.4 在内部类中引用外部类实例或者内部类实例 在类中引用当前实例可以使用this,但是内部类中要引用内部类的实例或者内部类所在的外部类的实例如何引用呢?在内部类中引用内部类自身的实例仍然是通过this,在内部类中引用外部类的实例需要使用外部类的

8、名字加上this的方式,下面的代码展示了用法: public class MyOuter int x=20; public class MyInner2 int x=10; public void print() int x=5; System.out.println(局部变量x的值:+x); System.out.println(内部类成员变量x的值:+this.x); System.out.println(外部类成员变量x的值:+MyOuter.this); public static void main(String args) new MyOuter().new MyInner2().

9、print(); 程序的运行结果: 局部变量x的值:5 内部类成员变量x的值:10 外部类成员变量x的值:20 李绪成 2 成员方法中定义的内部类 2.1内部类的编写 成员方法中的内部类的编写与作为成员变量的内部类的编写方法基本相同,下面的代码展示了用法: public class MyOuter2 public void test() class MyInner public void print() System.out.println(x); 方法内部的类具有如下特点: l 方法内部定义的类就像方法的局部变量,所以在类外或者类的其他方法中不能访问这个内部类。 l 没有访问控制符,因为该类

10、只能在定义该类的方法中并且在类的定义之后使用; l 不能访问方法的局部变量,除非局部变量是final类型的; l 能够访问外部类的各种成员变量,如果内部类所在的方法是静态方法,则这个内部类只能访问外部类的静态成员; l 可以使用final和abstract修饰。 2.2方法中内部类的访问 方法中的内部类只能在定义该内部类的方法中访问,并且是方法中内部类的定义之后访问。下面的代码展示了用法: public void main2(String args) class MyInner public void print() System.out.println(x); MyInner in = ne

11、w MyInner(); in.print(); 李绪成 3 匿名内部类 顾名思义,匿名内部类没有类名,而我们创建对象是根据类名创建的,没有类名如何创建对象的?可以使用类的定义直接创建实例,例如下面的代码: Parent p = new Parent() public void print() System.out.println(匿名内部类中的输出方法); ; new后面的信息表示创建了一个继承了Parent类的子类的实例。 匿名内部类有两种形式: l 通过继承父类而形式的匿名内部类; l 通过实现接口而形式的匿名内部类。 下面分别介绍。 3.1通过继承父类而形成的匿名内部类 看下面的代码:

12、 class Parent public void print() System.out.println(父类的输出方法); public class MyOuter3 Parent p = new Parent() public void print() System.out.println(匿名内部类中的输出方法); ; 在MyOut3中声明了类型为Parent的成员变量,通过new Parent来实例化对象,但是这里的实例化代码与以前见到过的实例化代码不同,以前的代码这样写: Parent p = new Parent(); 而这里是: Parent p = new Parent() 这

13、里的大括号意味着新创建了一个类,这个类是Parent的子类,在子类中可以覆盖父类中的方法或者实现父类中定义的抽象方法,上面的代码重写了父类中的print方法。 注意在倒数第二行的“;”,这个分号不能省略。 上面的代码中定义的成员变量p指向了匿名内部类的实例,也可以在成员方法中定义局部变量指向匿名内部类的实例。 对于匿名内部类的实例的方法的调用是通过执行该实例的父类引用,利用了Java语言的多态性。下面的代码展示了如何调用(在MyOuter3中增加的代码): public static void main(String args) new MyOuter3().p.print(); 输出结果是:

14、 子类中的输出方法 注意:因为匿名内部类中的方法都是通过父类引用访问的,所以不能在匿名内部类中定义父类中没有声明的方法,这样的方法不能被访问到。如果是为了匿名内部类中的方法之间共享代码,可以编写供内部方法调用的在父类中没有定义的方法。 3.2通过实现接口而形成的匿名内部类 匿名内部类也可以通过实现接口来创建,与继承父类没有本质区别。下面的代码展示了使用接口创建匿名内部类: interface Fly public void takeof(); /起飞 public void landing(); /降落 public class MyOuter3 Fly bird = new Fly() pu

15、blic void takeof() System.out.println(小鸟起飞了); public void landing() System.out.println(小鸟降落了); ; 代码中new Fly()意味着创建了一个实现了Fly接口的类的对象,这个类就是匿名内部类。这个匿名内部类必须实现接口中定义的所有方法,这与普通类实现接口的要求是相同的。在这个类中也不能定义其他的业务方法,这些方法是通过接口的引用访问的,因为接口中没有声明该方法,所以该方法将不能被访问。 注意:new Fly()实例化的对象是实现了Fly接口的类的对象,而不是实例化Fly接口,接口是不能被实例化的。 这些

16、匿名内部类被实例化以后通过父类引用或者接口引用访问,通常都会有一个引用指向这个新创建的匿名内部类的实例。有个特殊的应用不需要创建引用指向匿名内部类的实例,而是传递给形参,看下面的代码(在MyOuter3中添加如下代码): public static void main(String args) / 直接把匿名内部类的实例作为实参使用 new MyOuter3().printFly(new Fly() public void takeof() System.out.println(飞机起飞); public void landing() System.out.println(飞机降落); );

17、public void printFly(Fly fly) / 参数需要是实现Fly接口的类的对象 fly.takeof(); fly.landing(); 注意:我们自己在开发程序的时候尽量不要使用内部类,内部类不利于代码重用,如果非常确定这个类只会使用一次,可以使用匿名内部类。 李绪成 4 静态内部类 4.1静态内部类的定义 静态内部类与作为成员的内部类基本相同,只是这个内部类是静态的,使用static,类似于静态成员变量和静态成员方法。下面的代码展示了如何定义静态内部类: public class MyOuter4 static class MyInner 与静态方法一样,在静态内部类中

18、只能访问外部类的静态方法,看下面的代码: public class MyOuter4 int x = 10; static int y = 20; static class MyInner public void print() System.out.println(x); / 错误 System.out.println(y); / 正确 System.out.println(x);是错误的,因为它试图访问非静态成员变量x,System.out.println(y)是正确的。 4.2静态内部类的使用 在实例化作为实例成员变量的内部类的时候,要先创建外部类的对象,然后通过对象的new操作符创建内部类的实例。而静态内部类就像静态方法一样,可以通过类名直接访问而不用创建实例。下面的代码展示了在外部类的内容和外部类的外部如何访问静态内部类(第一个方法是在MyOuter4中添加的代码,第二个方法是测试类中的代码): public void outprint() MyInner inner = new MyInner(); inner.print(); public static void main(String args) MyOuter4.MyInner inner = new MyOuter4.MyInner(); inner.print();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1