• JAVA内部类学习


    1.内部类自动拥有对其外围类的所有成员的访问权限。

    实际上,当某个外围类对象创建一个内部类对象时,此内部类对象自动捕获了一个指向外围类对象的引用。

    内部类对象可以通过:外部类名.this 来获取外部类对象。

    例子:

     1 public class Outer 
     2 {
     3     public class Inner
     4     {
     5         public Outer outer()
     6         {
     7             //生成对外部类对象的引用
     8             return Outer.this;
     9         }
    10     }
    11     
    12     public Inner inner()
    13     {
    14         return new Inner();
    15     }
    16 
    17     public static void main(String[] args)
    18     {
    19         Outer o = new Outer();
    20         Outer.Inner i1 = o.inner();
    21         Outer.Inner i2 = o.inner();
    22         System.out.println(i1 == i2);
    23         System.out.println(i1.outer() == i2.outer());
    24     }
    25 }

    运行结果:

    1 false
    2 true

    2.通过new语法创建内部类对象

     1 public class Outer 
     2 {
     3     public class Inner{}
     4 
     5     public static void main(String[] args)
     6     {
     7         Outer o = new Outer();
     8         Outer.Inner i = o.new Inner();
     9         System.out.println(o.getClass());
    10         System.out.println(i.getClass());
    11     }
    12 }

    运行结果:

    1 class Outer
    2 class Outer$Inner

    所以很显然1中:System.out.println(i1.outer() == i2.outer()); 结果为true。

    因为创建内部类对象需要外围类对象的引用。

    3.static内部类对象并不含有外围类对象的引用,所以创建static内部类对象不需要外围类的实例。

     1 public class Outer 
     2 {
     3     public static class Inner{}
     4     
     5     public Inner newInner()
     6     {
     7         return new Inner();
     8     }
     9     
    10     public static Inner staticNewInner()
    11     {
    12         return new Inner();
    13     }
    14 
    15     public static void main(String[] args)
    16     {
    17         Outer o = new Outer();
    18         Outer.Inner i1 = o.newInner();
    19         System.out.println(i1.getClass());
    20         Outer.Inner i2 = Outer.staticNewInner();
    21         System.out.println(i2.getClass());
    22     }
    23 }

    4.内部类的灵活性

    一个例子体现:假如我们要实现一个sequence类,要为sequence实现iterator的功能使得可以正序和逆序访问sequence。最好的方法就是使用内部类(提供两个方法,返回两个各自实现iterator接口的内部类对象):

     1 import java.util.Iterator;
     2 
     3 public class Sequence 
     4 {
     5     private Object[] items;
     6     private int next = 0;
     7     
     8     public Sequence(int size)
     9     {
    10         items = new Object[size];
    11     }
    12     
    13     private class order1 implements Iterator
    14     {
    15         public boolean hasNext(){return false;}
    16         public Object next(){return null;}
    17     }
    18     
    19     private class order2 implements Iterator
    20     {
    21         public boolean hasNext(){return false;}
    22         public Object next(){return null;}
    23     }
    24     
    25     public Iterator i_order1()
    26     {
    27         return new order1();
    28     }
    29     
    30     public Iterator i_order2()
    31     {
    32         return new order2();
    33     }
    34 }
  • 相关阅读:
    iOS开发常见错误(转)
    SVN各种错误提示产生原因及处理方法大全(转)
    SVN常见问题(转)
    iPhone6 Plus、iPhone6、iPhone5S和之前版本真实分辨率
    各类 HTTP 返回状态代码详解(转)
    js:全局作用域和调整浏览器窗口大小
    python之制作模块
    python之模块time | strftime || 模块datetime | timedelta | 计算3天前的日期
    python之模块 sys | os
    python之正则表达式 | match | split | findall | sub替换 |
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/5759855.html
Copyright © 2020-2023  润新知