`
longdick
  • 浏览: 579928 次
  • 性别: Icon_minigender_1
  • 来自: 0
社区版块
存档分类
最新评论

再来说说Nested Class

阅读更多

有时候开发时为了方便,在代码中使用了不少嵌套类(nested class),但是使用过程中如果不了解嵌套类的特性,可能会造成意想不到的情况。

Java对象想要通过网络传输,必须实现序列化接口,于是我们在Service中定义了了一个实现了序列化接口的内部类,然后调用远程接口将其传输到网络上。

 

一运行报异常:不能将没有实现序列化接口的Object序列化。

怎么回事,这是一个很简单的内部类,的确已经实现了序列化接口了,其定义的成员都是可序列化的String类型;将其换成普通类没有问题。难道不能使用序列化的内部类?

 

 

其实我们使用的内部类是嵌套类(nested class)的一种,而

nested class 共有四种:

  • static nested class  静态嵌套类
  • inner class              内部类(非静态)
  • local class               本地类(定义在方法内部)
  • anonymous class    匿名类

静态嵌套类的行为更接近普通的类,另外三个是真正的内部类。区别在于作用域的不同。

以下是对他们的性质描述:

 

Types of Nested Classes Type Scope Inner
static nested class member no
inner [non-static] class member yes
local class local yes
anonymous class only the point where it is defined yes

 

以下还有一段程序说明它们的区别和使用方式:

 

/**
 *
 * 普通内部类持有对外部类的一个引用, 静态内部类却没有
 *
 * @author howard
 */
public class OutterClass {

    /*
     * this is static nested class
     */
    private static class StaticNestedClass {
        private void yell() {
            System.out.println(this.toString());
            // OutterClass.this.yell();//静态内部类实例没有外部类实例的引用
        }
    }

    /*
     * this is inner class
     */
    private class InnerClass {
        private void yell() {
            System.out.println(this.toString());
            OutterClass.this.yell();//内部类实例显式使用外部类实例的方式
        }
    }

    private void yell() {
        System.out.println( this.toString());
    }

    private void run() {
        /*
         * this is local class
         */
        class LocalClass {
            public void yell(){
                System.out.println(this.toString());
            }
        }
        /*
         * this is anonymous class
         */
        new Object() {
            public void yell(){
                System.out.println(this.toString());
            }
        }.yell();
        LocalClass lc=new LocalClass();
        InnerClass ic = new InnerClass();
        StaticNestedClass sc=new StaticNestedClass();
        lc.yell();
        ic.yell();
        sc.yell();
    }

    public static void main(String[] args) {
        OutterClass oc = new OutterClass();
        oc.run();
    }
}

 

仔细分析如上代码,可以得出一个结论,所有的内部类,Local内部类,匿名内部类都可以直接访问外面的封装类的实例变量和方法。而静态嵌套类则不能。

 

调试代码可以发现,内部类,Local内部类,匿名内部类的实例都持有一个外部封装类实例的隐式引用;

而java对象序列化要求对象里所有的对象成员都实现序列化接口。

 

所以,如果只有内部类实现序列化,而外部封装类没有实现序列化接口,就会在对内部类进行序列化的时候报出异常。

 

1
0
分享到:
评论
1 楼 zhong_wei_hu 2009-11-10  

相关推荐

    Java面试宝典

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    Java面试宝典2011版

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    Java面试宝典2017.zip

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    Java问题宝典2012版

    Static Nested Class 和 Inner Class的不同。 20 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 22 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    java 面试常问的问题 如何回答

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    java面试宝典

    30、Static Nested Class 和Inner Class 的不同? 11 31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和...

    千方百计笔试题大全

    30、Static Nested Class 和Inner Class 的不同? 11 31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和...

    java面试宝典2012版.pdf

    Static Nested Class 和 Inner Class的不同。 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface...

    java基础题 很全面

    17. Static Nested Class 和 Inner Class的不同。 9 18. 什么时候用assert。 9 19. GC是什么? 为什么要有GC? 9 20. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 10 21. Math.round(11.5)...

    Java面试宝典2010版

    Static Nested Class 和 Inner Class的不同。 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    最新Java面试宝典pdf版

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    Java面试笔试资料大全

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    Java面试宝典-经典

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    JAVA面试宝典2010

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    java面试题大全(2012版)

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    Java面试宝典2012版

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    java面试宝典2012

    Static Nested Class 和 Inner Class的不同。 20 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 22 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    Java面试宝典2012新版

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

Global site tag (gtag.js) - Google Analytics