您的位置:首页 > 其它

内部类/内部接口那点事

2014-09-15 20:08 253 查看
先上总结:
1、一个类的静态内部类,因为是静态的,所有不需要有包裹类的对象就可以实例化这个内部类(new Out.Inner()),所以在包裹类的静态方法中可以直接new这个内部类,而且静态内部类不可以访问包裹类的成员变量。
2、一个类的非静态内部类,必须要先有包裹类的对象才能实例化这个内部类(new Out().new Inner()),且,在包裹类的静态方法中不能实例化非静态内部类(原因:非静态内部类可以访问包裹类的的成员变量,但包裹类的静态方法不可以)。
3、静态接口,这个我经常用,以前都是迷迷糊糊的就用了,不管写不写成static一样用,原因是内部接口不管写不写static它都是static的。

测试代码:
public class InnerClass {
	private int i;
	public static void main(String[] args) {
//		new Cls1().func(); // error
		new Cls2().func();
	}
	
	// 非静态内部类, 在他包裹类的静态方法中不能直接new
	// 因为内部类可以访问包裹类的成员变量,而在上面的静态方法中不能访问成员变量
	// 所以如果可以new,就违背了自身
	class Cls1 {
		public void func() {
			i++;
			System.out.println("cls1");
		}
	}
	
	// 静态内部类, 可以在包裹类的静态方法中直接new
	// 因为他是静态的, 可以在不实例化包裹类的前提下实例化
	static class Cls2 {
		public void func() {
//			i++; // 不可以访问, 因为该类可以在包裹类未实例化的前提上实例化
			System.out.println("cls2");
		}
	}
	
	// 一个类的内部接口本身就是静态的
	public interface If {
		
	}
}

class Cls3 {
	public void test() {
		new InnerClass().new Cls1().func(); // 对于非静态内部类,必须先有包裹类的对象才能有内部类的对象
		new InnerClass.Cls2().func(); // 静态的不需要
	}
	
	public class Ifimpl implements InnerClass.If {
		
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: