您的位置:首页 > 其它

内部类的使用1--隐藏实现

2010-11-29 22:03 197 查看
内部类的声明和调用语法


内部类就是声明在其他类的内部的类。

类中使用内部类,跟使用其他类没有什么不同。内部类作为一个成员跟其他变量也非常相像,能用final修饰,能访问其外部的变量等。

在类外面创建一个外部类的实例时有两种方式。非静态时A.B ab = new A().new B()。静态的 A.B AB = A.new B();而通常情况下我们不会直接来new 这个类而是外部类提供一个方法给我们得到内部类的实例。

另外一种使用办法是,你做了一件比较复杂的事情,但是又不想被人知道就可以使用内部类。

开发不依赖类型的代码,隐藏细节

有了内部类,就能够更好的实现封装代码的细节部分,比如有一个公用的接口,而使用私有内部类来实现这个接口,再通过外部类的方法返回接口的一个实例。

这样就使的,客户程序员只能使用引用来进行开发,阻碍了任何依赖于类型的代码,并完全隐藏了实现的细节。

例如:

]interface Driver{
	String getName();
};
public class Bus {
	private class Driver1 implements Driver{
		private String name = "Driver1";
		public String getName() {
			return name;
		}
	}
	
	Driver getDriver(){
		return new Driver1();
	}
	public static void main(String[] args) {
		Driver driver1 = new Bus().getDriver();
		System.out.println(driver1.getName());
	}
}


方法或者作用域中的内部类

上面的代码除了把内部类声明在成员变量的位置外,还能直接声明在方法的内部,例如:

]interface Driver{
	String getName();
};
public class Bus {
	Driver getDriver(){
		class Driver1 implements Driver{
			private String name = "Driver1";
			public String getName() {
				return name;
			}
		}
		return new Driver1();
	}
	public static void main(String[] args) {
		Driver driver1 = new Bus().getDriver();
		System.out.println(driver1.getName());
	}
}



匿名内部类

像上面这种声明在方法内部的类,类名是没有作用的,因此有了声明匿名内部类的方法:

]public class Bus {
	Driver getDriver(){
		return new Driver(){
			private String name = "Driver1";
			public String getName() {
				return name;
			}
		};
	}
	public static void main(String[] args) {
		Driver driver1 = new Bus().getDriver();
		System.out.println(driver1.getName());
	}
}



把return 和new 构造器卸载了一起,表示得到一个继承了Driver的实例。

这种用法最常见的就是在SWING图形见面开发的时候来定义事件监听器。

如果匿名内部类继承的类是有构造器参数的话,需要用return new Driver(param)来进行声明。

内部类使用外部类的变量

如果方法内的内部类(包括匿名内部类),需要直接使用其外面的变量(不包括构造器使用)则需要保证外部的变量为final类型的,否则会有编译错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: