Java之内部类与向上转型详解(附源码)
2016-07-26 11:21
666 查看
前言
当将内部类向上转型为其基类,尤其是转型为一个接口的时候,内部类就有了用武之地。(从实现了某个接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。)这是因为此内部类----某个接口的实现----能够完全不可见,并且不可用。所得到的只是指向基类或者接口的引用,所以能够很方便地隐藏实现细节。示例接口
我们可以创建一个前一节示例的接口:package com.mufeng.thetenthchapter; public interface Destination { String readLabel(); }
package com.mufeng.thetenthchapter; public interface Contents { int value(); }
示例源码
现在Contents和Destination表示客户端程序员可用的接口。(记住,接口的所有成员自动被设置为public。)当取得了一个指向基类或者接口的引用时,甚至可能无法找出它确切的类型,看下面的例子:
package com.mufeng.thetenthchapter; class Parcel4 { private class PContents implements Contents { private int i = 11; @Override public int value() { // TODO Auto-generated method stub return i; } } protected class PDestination implements Destination { private String label; private PDestination(String whereTo) { // TODO Auto-generated constructor stub label = whereTo; } @Override public String readLabel() { // TODO Auto-generated method stub return label; } } public Contents contents() { return new PContents(); } public Destination destination(String s) { return new PDestination(s); } } public class TestParcel { public static void main(String[] args) { Parcel4 p = new Parcel4(); Contents c = p.contents(); Destination d = p.destination("Tasmania"); System.out.println(c.value()); System.out.println(d.readLabel()); } }
输出结果
11 Tasmania
源码解析
Parcel4中增加了一些新东西:内部类PContents是private,所以除了Parcel4,没有人能访问它。PDestination是protected,所以只有Parcel4及其子类、还有与Parcel4同一个包中的类(因为protected也给予了包访问权限)能访问PDestination,其他类都不能访问PDestination。这意味着,如果客户端程序员想了解或访问这些成员,那是要受到限制的。实际上,甚至不能向下转型成为private内部类(或protected内部类,除非是继承自它的子类),因为不能访问其名字,就像在TestParcel类中看到的那样。于是,private内部类给类的设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节。此外,从客户端程序员的角度来看,由于不能访问任何新增加的、原本不属于公共接口的方法,所以扩展接口是没有价值的。这也给Java编译器提供了生成更高效代码的机会。相关文章推荐
- maven update error:Cannot nest 'xxx/WEB-INF/classes' inside 'xxx'
- maven构建项目默认jdk版本修改
- 使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
- Debug---Eclipse断点调试基础
- idea和eclipse 的debug调试快捷键对比
- 使用ant时 出现 java.lang.OutOfMemoryErro r: Java heap space的解决办法
- java变量,初始化快,构造函数的执行顺序
- Java开发中的23种设计模式之创建型模式
- java之数据库之Mysql及navicat的基本知识
- Spring MVC Flash Attribute 的讲解与使用示例
- spring+mybatis通用dao层、service层的一些个人理解与实现
- Eclipse中输入系统变量和运行参数
- 错题726-java
- Spring 整合 velocity
- Java中从控制台输入数据的几种常用方法
- Error:java: Compilation failed: internal java compiler error
- java字符串运算
- java动态代理模式(jdk和cglib)
- SVN 使用记录
- JAVA语言关键字Abstract含义