浅析Java中的嵌套类和内部类
当前位置:以往代写 > JAVA 教程 >浅析Java中的嵌套类和内部类
2019-06-14

浅析Java中的嵌套类和内部类

浅析Java中的嵌套类和内部类

副标题#e#

以前看<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();
    }
    
}


#p#副标题#e#

5.2,匿名内部类:

顾名思义,匿名内部类就是没有名字的局部类。它不利用要害字class, extends, implements以及结构函数。

它凡是作为要领的一个参数传入,好比在android开拓中对一个Button添加一个OnClickListener监听器。

匿名内部类隐匿的担任了一个父类可能实现了一个接口。好比:

mUiHandler.post(new Runnable{
    @override
    public void run(){
    //
    }
    
});
    
AsyncClient.get(url, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers,
                    JSONObject response) {
                // TODO Auto-generated method stub
                super.onSuccess(statusCode, headers, response);}} );

内部类通过将相关的类组织在一直,从而低落了定名空间的巨大性。

6,内部类的序列化问题。

#p#分页标题#e#

对任何种类内部类(包罗局部内部类和匿名内部类)的序列化都是不被勉励的。因为java编译器在对内部类举办编译的时候,将举办“合成结构”。合成结构使得java编译器实现了java的新特性,可是却没有对JVM做出相应的改变。然而,差异的java编译器对合成结构是有不同的,因而,假如对内部类举办了序列化,将使得差异的JRE实现中存在兼容性问题。

查察本栏目

    关键字:

在线提交作业