- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java程序设计中各种“内部类”比较与应用探析
Java程序设计中各种“内部类”比较与应用探析
【摘 要】在一个类的内部定义的类称为内部类,内部类可分为实例内部类、静态内部类、局部内部类等。本文就内部类的应用给出类相应的分析。
【关键词】内部类;实例内部类;静态内部类;局部内部类
在Java语言中,在一个类的内部定义的类称为内部类,内部类允许把一些逻辑相关的类组织在一起,并且控制内部类代码的可视性。内部类按作用域可以分为成员内部类和局部内部类,其中成员内部类又可以分为实例内部类和静态内部类,下面就三者的比较与应用进行分析。
1 实例内部类、静态内部类和局部内部类的比较分析
1.1 主要特征
实例内部类的实例引用特定的外部类的实例;静态内部类的实例不与外部类的任何实例关联;局部内部类的可见范围是所在的方法。
1.2 可用的修饰符
实例内部类可是使用访问控制修饰符(public、protected、private),abstract,final;静态内部类可以使用访问控制修饰符,static,abstract,final;局部内部类只能使用abstract或final来修饰。
1.3 可用访问外部类的哪些成员
实例内部类可用直接访问外部类的所有成员;静态内部类只能直接访问外部类的静态成员;局部内部类可以直接访问外部类的所有成员,并且能访问所在方法的final类型的变量和参数。
1.4 拥有成员的类型
实例内部类只能拥有实例成员;静态内部类可以拥有静态成员和实例成员;局部内部类只能拥有实例成员。
1.5 外部类如何访问内部类的成员
外部类必须通过实例内部类的实例来访问;外部类中的静态成员可以通过其静态内部类的完整类名来访问;外部类必须通过局部内部类的实例来访问。
2 内部类的应用分析
2.1 封装类型
面向对象的核心思想之一是封装,把所有不希望对外公开的实现细节封装起来。顶层类只能处于public和默认访问级别,而内部类可以处于public、protected、private和默认4种访问级别。此外,如果一个内部类仅仅为特定的方法提供服务,那么可以把这个内部类定义在方法之内。由此可见内部类是一种封装类型的有效手段。以下private类型的InnerTool内部类实现了公共的Tool接口。
public interface Tool{public int add(int a,int b);}
public class Outer{
private class InnerTool implements Tool{
public int add(int a,int b){
return a+b;
}
}
public Tool getTool(){
return new InnerTool();
}
}
在客户类中不能访问Outer.InnerTool类,但可以通过Outer类的getTool()方法获得InnerTool的实例,由此可见,此私有内部类可以用来封装类型。
2.2 直接访问外部类的成员
内部类的一个特点是能够访问外部类的各种访问级别的成员。假定有类A和类B,类B的reset方法负责重新设置类A的实例变量count的值,一种实现方法是把类A和类B都定义为外部类,为了使类B能够访问类A的count属性,类A必须提供getCount()和setCount()方法,此外还建立了类B到类A的关联关系。假如应用需求要求类A的count属性不允许白除了来类B之外的其他类读取或设置,那么以上的实现方式就不能满足这一需要。在这种情况下,把类B定义为内部类就可以解决这一问题,而且会使代码更加简捷。
class A{
private int count;
public int add(){return ++count;}
class B{
public void reset() { if(count0) count=1;else count=-1;}
}
}
当类B作为类A的实例内部类时,可以直接访问类A的count属性。Java虚拟机会保证类B的实例持有类A的实例的引用,因此无须显式地建立类B与类A的关联。
2.3 回调(CallBack):
假设下面的Teachable接口和Programmer基类,它们都提供了一个work方法,但方法的功能是不一样的。
interface Teachable { void work(); }
public class Programmer{
private String name;
//
文档评论(0)