Java之嵌套接口详解(附源码)

示例源码

接口可以嵌套在类或其他接口中。这揭示了许多非常有趣的特性:

package com.mufeng.theninthchapter;

class A {
	interface B {
		void f();
	}

	public class BImp implements B {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	private class BImp2 implements B {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	public interface C {
		void f();
	}

	class CImp implements C {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	private class CImp2 implements C {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}

	}

	private interface D {
		void f();
	}

	private class DImp implements D {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	public class DImp2 implements D {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	public D getD() {
		return new DImp2();
	}

	private D dRef;

	public void receiveD(D d) {
		dRef = d;
		dRef.f();
	}
}

interface E {
	interface G {
		void f();
	}

	public interface H {
		void f();
	}

	void g();

	// Cannot be private within an interface:
	// private interface I{
	// void f();
	// }
}

public class NestingInterfaces {

	public class BImp implements A.B {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	class CImp implements A.C {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	// Cannot implement a private interface except
	// within that interface's defining class
	// class DImp implements A.D {
	// @Override
	// public void f() {
	// // TODO Auto-generated method stub
	//
	// }
	// }

	class EImp implements E {

		@Override
		public void g() {
			// TODO Auto-generated method stub

		}
	}

	class EGImp implements E.G {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}

	}

	class EImp2 implements E {

		@Override
		public void g() {
			// TODO Auto-generated method stub

		}

		class EG implements E.G {

			@Override
			public void f() {
				// TODO Auto-generated method stub

			}

		}
	}

	public static void main(String[] args) {
		A a = new A();
		// Can't access A.D
		// !A.D ad=a.getD();

		// Doesn't return anything but A.D
		//!A.DImp2 di2 = a.getD();

		//Cannot access a member of the interface
		//!a.getD().f();

		//Only another A can do anything with getD():
		A a2=new A();
		a2.receiveD(a.getD());
	}

}

源码解析

在类中嵌套接口的语法是相当显而易见的,就像非嵌套接口一样,可以拥有public和“包访问”两种可视性。

作为一种新添加的方式,接口也可以被实现为private的,就像在A.D中所看到的(相同的语法既适用于嵌套接口,也适用于嵌套类)。那么private的嵌套接口能带来什么好处呢?读者可能会猜想,它只能够被实现为DImple中的一个private内部类,但是A.DImp2展示了它同样可以被实现为public类。但是,A.DImp2只能被其自身所使用。你无法说它实现了一个private接口D。因此,实现一个private接口只是一种方式,它可以强制该接口中的方法定义不要添加任何类型信息(也就是说,不允许向上转型)。

getD()方法使我们陷入了一个进退两难的境地,这个问题与private接口相关:它是一个返回对private接口的引用的public方法。你对这个方法的返回值能做些什么呢?在main()中,可以看到数次尝试使用返回值的行为都失败了。只有一种方式可成功,那就是将返回值交给有权使用它的对象。在本例中,是另一个A通过receiveD()方法来实现的。

接口E说明接口彼此之间也可以嵌套。然而,作用于接口的各种规则,特别是所有的接口元素必须是public的,在此都会被严格执行。因此,嵌套在另一个接口中的接口自动就是public的,而不能声明为private

   NestingInterfaces展示了嵌套接口的各种实现方式。特别要注意的是,当实现某个接口时,并不需要实现嵌套在其内部的任何接口。而且,private接口不能在定义它的类之外被实现。

时间: 2024-08-01 21:45:21

Java之嵌套接口详解(附源码)的相关文章

转载—— android 瀑布流的实现详解,附源码

介绍 参考自:https://github.com/dodola/android_waterfall,因为原来的代码封装不好,所以,我根据源码的思路,重新写了一遍,所以有了现在这个项目:https://github.com/youxilua/waterfall4android 原作者表示: 试过在1万张可以流畅的滑动,不出现内存溢出情况 设计思路 之前的作者的自定义view 只有主滑动一层,其他的设置要在相应的活动设置,个人觉得,重用起来比较麻烦,所以决定封装一层.现在定义一个默认的瀑布流只需5

struts2内置拦截器和自定义拦截器详解(附源码)

一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截器,拦截器才可以正常的工作和运行.Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现.大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与 拦截器链的配置.内置拦截器虽然在struts2中都定义了,但是并不是都起作用的.因为并不是所有拦截器都被加

SpringMVC视图机制详解[附带源码分析]

目录 前言 重要接口和类介绍 源码分析 编码自定义的ViewResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本文将分析SpringMVC的视图这部分内容,让读者了解SpringMVC视图的设计原理. 重要接口和类介绍 1. View接口 视图基础接口,它的各种实现类是无

SpringMVC拦截器详解[附带源码分析]

目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍 1. Hand

Android应用Context详解及源码解析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马上要诞生这篇文章.我们平时在开发App应用程序时一直都在使用Context(别说你没用过,访问当前应用的资源.启动一个activity等都用到了Context),但是很少有人关注过这玩意到底是啥,也很少有人知道getApplication与getApplica

Android应用AsyncTask处理机制详解及源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机制详解及源码分析>文章),这里继续分析Android的另一个异步机制AsyncTask的原理. 当使用线程和Handler组合实现异步处理时,当每次执行耗时操作都创建一条新线程进行处理,性能开销会比

Android-多线程断点下载详解及源码下载(三)

本项目完成的功能类似与迅雷等下载工具所实现的功能--实现多线程断点下载. 主要设计的技术有: 1.android中主线程与非主线程通信机制. 2.多线程的编程和管理. 3.android网络编程 4.自己设计实现设计模式-监听器模式 5.Activity.Service.数据库编程 6.android文件系统 7.缓存 博文链接: Android-多线程断点下载详解及源码下载(一) Android-多线程断点下载详解及源码下载(二) Android-多线程断点下载详解及源码下载(四) 本篇接着上

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

详解LAMP源码编译安装

实战:LAMP源码编译安装 家住海边喜欢浪:zhang789.blog.51cto.com 目录 详解LAMP源码编译安装 LAMP简介 一.准备工作 二.编译安装 Apache 三.编译安装 MySQL 四.编译安装 PHP 测试LAMP搭建开源数据web管理程序phpMyadmin 详解LAMP源码编译安装 LAMP简介 LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装L