Welcome 微信登录

首页 / 软件开发 / JAVA / 浅析Java中的嵌套类和内部类

浅析Java中的嵌套类和内部类2014-08-21以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧。昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很大的疑惑:嵌套类跟内部类有什么区别?只有是否有关键字static的区别吗?

所以今天找了个时间查了一下两者的详细区别,总结在这篇博客中,既方便自己的复习和学习,也启示他人吧。

1,概念:

定义在一个类内部的类,叫作“嵌套类”。嵌套类分为两种:static的和非static的。后者又有一个专门的名字,叫作“内部类”。所以从概念可以看出,嵌套类跟内部类是所属关系,后者包含于前者。示例代码如下:

class OuterClass {...static class StaticNestedClass {...}class InnerClass {...}}
同时,嵌套类是其所在类的成员。内部类可以访问所在类的所有成员,即使该成员是private的。而static嵌套类则不得访问所在类的成员。同时,嵌套类,static和非static的,都可以被声明为private、public、protected和default的。

2,为什么要使用嵌套类?

好处应该都比较文本化吧,以后在使用的过程中去理解和体会吧:对只在一个地方使用的类进行逻辑上的分组;增加了封装性;易于阅读和维护。

3,static嵌套类:

因为static嵌套类不能直接访问所在类的非static成员变量和方法,所以static嵌套类必须通过绑定所在类的实例来进行访问。而对于所在类的静态成员和方法包括private、protected和public的,可以访问。因为它也有static修饰。

static嵌套类通过写出封装的类名来进行实例化和访问其内部成员:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
4,内部类:

因为内部类是所在类的成员,所以它可以访问所在类的任意变量和方法,但是它本身却不能定义任何static的变量或方法。

同时,内部类的实例化方式也与static嵌套类有所不同:

OuterClass outerObject=new OuterClass();OuterClass.InnerClass innerObject = outerObject.new InnerClass();
5,内部类的分类:

以前曾经接触过内部类的分类,这里一并总结一下:

以前的所谓的一些面试宝典里面差不多都是将内部类分为四个种类:

静态内部类(既static嵌套类)、成员内部类(既上述内部类)、局部内部类和匿名内部类。前两者都已经介绍过了,下面专门看一下后面两者。

5.1,局部内部类:

定义在方法内部的类叫作“局部内部类”。它的作用域仅限于方法作用域内,只能在方法的作用域内定义和实例化,是用处最小的类类型。和局部变量一样,它不能被修饰为private, public, protected和static的,并且只能访问方法内部定义的final变量。

class LocalInner{int a = 1;public void doSomething(){int b = 2;final int c = 3;// 定义一个局部内部类class Inner3{public void test(){System.out.println("Hello World");System.out.println(a);// 不可以访问非final的局部变量// error: Cannot refer to a non-final variable b inside an inner// class defined in a different method// System.out.println(b);// 可以访问final变量System.out.println(c);}}// 创建局部内部类的实例并调用方法new Inner3().test();}}public class LocalInnerClassTest{public static void main(String[] args){// 创建外部类对象LocalInner inner = new LocalInner();// 调用外部类的方法inner.doSomething();}}