JAVA中的内部类和 JAVA 的持有对象

内部类

为什么

在JAVA 中每个内部类都能实现一种接口,这也是实现多态的一种方式。无论外部类是否已经实现了该接口,对内部类都毫无影响

普通内部类

内部类的最基本实现
实现普通的内部类非常简单:

class Outer {
  private int i;
class Inner {
    public set(int x){ i = x;}
  }
}

内部类的特点

  • 可以访问外部类的私有域及方法
  • 可以继承接口
  • 可以匿名声明
  • 可以嵌套

关于内部类继承接口

内部类继承接口同外部类继承接口并无区别

interface Inner {
  void set(int x);
}

class Outer{
  class PInner implements Inner{
  ...
  }
  public PInner inner() { return new Inner();}
}

匿名声明内部类:
以下代码匿名声明了内部类,这个内部类实现了一个接口。

interface Inner {
  void set(int x);
}

class Outer{
  public Inner inner() {
    return new Inner() {
      poublic void set(int x){...}
    }
  }
}

事实上,上面的这两段代码作用并无区别,只是在调用方式上有所不同

// calling of 1st paragraph of code
// method one
Outer o = new Outer();
Outer.Inner i = o.new PInner();

// method two 
Outer o = new Outer();
Outer.Inner i = o.inner(); // inner method required

// calling of 2nd paragraph of code
Outer o = new Outer();
Inner i = o.inner();

又事实上,第一段代码也实现了Inner接口,所以也能使用第二段代码的调用方式。

私有内部类

将成员类声明为私有,然后使用方法创建内部类:

class Outer{
  private class PInner implements Inner{
  ...
  }
  public PInner inner() { return new Inner();}
}
嵌套类

什么是嵌套类

将内部类声明为static,则该类就变成了嵌套类。嵌套类不能引用外部类的变量,因为它为static,当引用外部类对象的时候,由于外部类并没有实例化故会报错。

对接口嵌套
内部类不仅可以作用于类,还能作用于接口,更有意思的是,内部类可以实现当前接口

interface Inner {
  void set(int x);
  class PIner implements Inner{
      void set(int x){...}
  }
}

为什么没有 static 和 public ?

由于接口里面的声明的方法都是默认为 static以及 public 的,所以无需再次作声明


JAVA 的持有对象

持有对象,holding,是java的泛型容器。 泛型容器大致可以分为两种,分别是 Collection 和 Map
Collection下面派生了 Set/List 相关的容器, 而Map则是其他语言的字典。

LinkedList or ArrayList ?

List 分为 LinkedList 和 ArrayList,这两个东西各有各的好处, LinkedList 动态插入速度快,而ArrayList随机访问速度快。

统一访问接口?

说到统一访问接口,就不得不提到迭代器(Iterator)
迭代器规范了泛型容器的访问方式,无论是Map 还是Collection 都实现了这个接口。

回到List

List 类定义了一些方法用于操作保存的对象,分别是:
boolean contains(object) // 判断一个对象是否存在于容器数组里面
List<type> subList(start, end) // 跟 substring方法类似,用于生成子容器
void retainAll(object) // 返回一个交集,保留两个容器中相同的对象。
void removeAll(object) // 移除所有在object容器中出现的元素
Array toArray() // 将对象返回成数组

迭代器

一般的迭代器只支持向下迭代,迭代器共有3个方法:

  • next
  • hasNext
  • remove
    调用remove之前,必须要先调用next

迭代器的使用

// new Iterator
Iterator<Object> it= Objects.iterator();
while(!it.hasNext()) {
it.next();
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 5,004评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 4,751评论 0 4
  • 转自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帅199207阅读 12,737评论 3 93
  • 说起北,想起了箭扣长城,那是北京;说起北,想起了禾木草原,那是北疆;说起北,想起了漠河北极村,那是东北。 想到箭扣...
    陶柔克阅读 2,801评论 0 0
  • Headings(找小标题) 1. 题型要求:文章由若干段话组成,要求给每段话找个小标题。 小标题即指该段话的段落...
    Ayoer阅读 1,891评论 1 1