2016-03-27
内部类:就是把一个类的定义放在另外一个外围类定义的里面。
class OutterClass{ class InnerClass { } }
1. 内部类主要有四种:成员内部类(member)、静态内部类(static)、局部内部类(local)、匿名内部类(anonymous)
(1)成员内部类:这种内部类的方法可以直接使用外部类实例变量和实例方法,包括private。
不能含有static方法,不能有static变量,static final除外;可以继承有static方法的类。
成员内部类如果有与外部类同名的成员变量和方法,默认情况访问成员内部类成员,如果访问外部类变量和方法,
OuterClass.this.variable OuterClass.this.method
外部类要访问内部类成员,需要先new一个内部类对象,再通过指向这个对象的引用来访问。
(2)静态内部类:将内部类声明为static,也叫作嵌套类。
与静态方法类似,只能访问外部类的static成员,不能直接访问实例变量和实例方法,需要通过对象引用。
静态内部类中可以包括static成员和方法。
public class Outer{ private static class Inner{ //name of this class is Outer.Inner } private Inner x; public Outer(){ x=new Inner();} public static void main(String[] a) { Inner x = new Inner(); new Outer(); } }
(3)局部内部类:在method或者statement中定义的类。
局部内部类与局部变量类型,不能使用private、public等访问修饰符,也不能使用static,可以使用final和abstract
局部内部类只在这个方法之内有效。
局部内部类可以访问外部类成员。
(4) 匿名内部类:就是没有名字的局部内部类,不用关键字class、extend、implement,没有constructor。其根本是把类的定义和创建放在了一起,一般格式是
new ClassOrInterfaceName() { }
匿名内部类可以继承一个类或者实现一个接口。
匿名内部类使用的参数必须是final。
在生成的class文件中,匿名类会生成 类名$1.class 的文件,数字根据是第几个内部类而以此类推。
2. 内部类的继承
普通类extend内部类。因为内部类的constructor必须连接到指向外部类对象的引用,所以当一个类继承这个内部类的时候,那个连接到外部类的引用也要初始化。
class WithInner{ class Inner{} } public class InheritInner extends WithInner.Inner { InheritInner(WithInner wi){ wi.super(); } public static void main(String[] args){ WithInner wi = new WithInner(); InheritInner ii = new InheritInner(wi); } }
每一个内部类可以独立的继承一个接口或者类,无论外围类是否继承了某个接口或者类,对内部类都没有影响。再加上java提出了一个类可以实现多个接口,所以内部类和接口解决了java不能多重继承的问题。这也是java和C++的区别之一,C++可以多重继承。
资料来源:感谢各位的分享,希望慢慢能了解透彻
http://www.tuicool.com/articles/n2aYra7
http://www.cnblogs.com/dolphin0520/p/3811445.html
http://android.blog.51cto.com/268543/384844/
http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html