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接口不能在定义它的类之外被实现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值