A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝强勇 中级黑马   /  2013-2-14 15:43  /  1859 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内部类的知识点我都清楚,但是我很迷惑内部类在什么情况下使用呢?

3 个回复

倒序浏览
看了楼主的问题:内部类的使用情形?
首先理解内部类的作用
1) 当我们需要在某一情形下实现一个接口,而在另一情形下又不需要实现这个接口时,我们可以使用内部类来解决这一问题。让内部类来实现这个接口。
2) 内部类有效的解决了多重继承的问题。
这是一些例子,希望对楼主理解内部类有所帮助
1,在main方法中直接产生内部类对象
    package org.zj.sample2;
    class Outer {
        private int index = 100;
        class Inner {
             private int index = 50;
             void print() {
               int index = 30;
               System.out.println(index); // 30
               System.out.println(this.index); // 50
               System.out.println(Outer.this.index); // 100
             }
    }
    }

    class Test {
        public static void main(String[] args) {
             Outer outer = new Outer();
             Outer.Inner inner = outer.new Inner(); // 注意此处变化
             inner.print();
        }
    }


2,在方法中定义内部类
    在方法中定义的内部类只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。而且方法体中的内部类不能有访问说明符。
    package org.zj.sample;
    class InOut {
        String str=new String(\"Between\");
        public void amethod(final int aArgs){
             class Inner{
            public Inner(){
              System.out.println(\"This is Inner.\");//此句可看出它与匿名内部类用法的不同。
            }
               public void sayHello(){ [Page]
                    System.out.println(str);
                    System.out.println(aArgs);
               }
           }
        Inner inner=new Inner();//此句必须放在定义类Inner的后面
           inner.sayHello();
        }
        public static void main(String[] args){
             InOut inOut=new InOut();
             inOut.amethod(33);
        }
    }

    在方法体中使用内部类可以使用一个已命名的构造子,或重载构造子。而匿名内部类只能用于实例初始化。
3,内部类的继承
    当一个类继承自一个内部类时,缺省的构造器不可用。必须使用如下语法:
    enclosingClassReference.super();(见下例绿色部分)
    package org.zj.sample;
    class WithInner{
        class Inner{
             public void sayHello(){
               System.out.println(\"Hello.\");
             }
        }
    }
    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);
             ii.sayHello();
       }
    }

    结果:
    Hello.

4.匿名内部类
    未使用匿名内部类的情况:这里单独写了一个内部类Inner。
    package org.zj.example;
    abstract class A{
        abstract public void sayHello();
    }

    class Outer {
        public static void main(String[] args){
           class Inner extends A{
               public void sayHello(){ [Page]
                    System.out.println(\"Hello!\");
               }
           }
           new Outer().callInner(new Inner());
        }

        public void callInner(A a){
             a.sayHello();
        }
    }

    使用匿名内部类的情况:直接在new A()中给出Inner的定义。
    package org.zj.example;
    abstract class A{
        abstract public void sayHello();
    }

    class Outer {
        public static void main(String[] args){
           new Outer().callInner(new A(){
               public void sayHello(){
                  System.out.println(\"Hello!\");
               }
           });
        }

        public void callInner(A a){
             a.sayHello();
        }
    }

希望对你有所帮助。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
回复 使用道具 举报
本帖最后由 黄成超 于 2013-2-16 09:47 编辑

要想知道内部类在什么情况下使用,首先需了解使用内部类有什么好处:
1 隐藏代码;
2 拥有外围内所有成员的访问成员权限,能访问外部类的所有成员
如下代码所示:
  1. interface Selector
  2. {
  3.         boolean end();
  4.         Object current();
  5.         void next();
  6. }
  7. class  Outer
  8. {
  9.         private Object[] items;
  10.         private int next = 0;
  11.         public Outer(int size){items = new Object[size];}
  12.         
  13.         public void add(Object x)
  14.         {
  15.                 if(next < items.length)
  16.                 {
  17.                         items[next++] = x;
  18.                 }
  19.         }

  20.         private class Inner implements Selector
  21.         {
  22.                 private int i = 0;
  23.                 public boolean end(){ return i == items.length;}
  24.                 public Object current(){return items[i];}
  25.                 public void next(){ if(i<items.length)i++;}
  26.                
  27.         }
  28.         public Selector selector()
  29.         {
  30.                 return new Inner();
  31.         }
  32.         public static void main(String[] args)
  33.         {
  34.                 Outer out = new Outer(10);
  35.                 for(int i = 0;i<10;i++)
  36.                         out.add(Integer.toString(i));

  37.                 Selector selector = out.selector();
  38.                
  39.                 while(!selector.end())
  40.                 {
  41.                         System.out.print(selector.current()+" ");
  42.                         selector.next();
  43.                 }
  44.         }
  45. }
  46. //Output: 0 1 2 3 4 5 6 7 8 9
复制代码
由上可知,内部类的可以拥有外围类的访问成员权限,所以,内部类提供了某种进入外围类的窗口。
然而,内部类使用原因更在于:每一个内部类都可以独立的继承自一个(接口的)实现。而每一个接口对应着不同功能的实现,
这在一定程度上就如实现了多继承一样,这样操作,有效避免了外围类直接实现接口造成的程序臃肿,使程序更加灵活。
特别是针对抽象类的时候,就只能使用内部类(没有多继承)。
另外,使用内部类可以用不同方式实现同一接口或继承同一类等。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马