java内部类(2)

来源:互联网 发布:作文拟题技巧知乎 编辑:程序博客网 时间:2024/06/10 08:45
public MyIterator<Object> iterator() {class Iterator implements MyIterator<Object> {private int index = 0;public boolean hasNext() {// TODO 自动生成的方法存根return index < obj.length;}public Object next() {// TODO 自动生成的方法存根return obj[index++];}}return new Iterator();}

      内部类可以分为 普通内部类,局部内部类,匿名内部类,静态内部类四种。普通内部类及内部原理在上一篇文章中已经介绍,下面一一介绍其他内部类。

局部内部类

在一个类的方法中或者任意作用域内定义的内部类,叫做局部内部类。

现在有这样一个需求:有一个自定义的集合类MyList,有个迭代器接口 MyIterator,
MyIterator定义如下:
public interface MyIterator<T> {boolean hasNext();T next();}
集合类定义如下:
public class MyList {private Object obj[];private int i = 0;public MyList(int length) {this.obj = new Object[length];}public void add(Object o) {if (i < obj.length) {this.obj[i++] = o;}}public static void main(String[] args) {MyList myList = new MyList(10);for (int i = 0; i < 10; i++) {myList.add(i);}//如何通过迭代器去遍历呢?}}
当然我们实现方法有多种,这里我们主要通过新增 iterator方法获取迭代器接口:
public MyIterator<Object> iterator() {class Iterator implements MyIterator<Object> {private int index = 0;public boolean hasNext() {// TODO 自动生成的方法存根return index < obj.length;}public Object next() {// TODO 自动生成的方法存根return obj[index++];}}return new Iterator();}
遍历方法如下:
MyIterator<Object> iterator = myList.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}
以上就是局部内部类的一个应用,我们再看另外一个应用:
public void say(final String word) {class InnerClass {public void InnerSay() {System.out.println(word);}}}
可以看到在局部内部类中调用了父方法中的变量,必须将该变量申明为final类型,拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。
final 修饰的参数不能改变,若要改变其值呢? 可以设计成 final int[] a=new int[1] 设计成数组长度为1的,然后 改变a[0]的值。

匿名内部类

匿名内部类实例如下:

interface JieKou {void say();}public class OuterClass {public JieKou InnerClass() {return new JieKou() {@Overridepublic void say() {// TODO Auto-generated method stub}};}}

可以看到匿名内部类特征,没有类名,return后面语句指的是:“创建一个实现JieKou接口类的对象“。匿名内部类和正规的继承相比有些受限,因为匿名类既可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个。那么匿名类没有构造器,怎么初始化呢?我们可以通过实例初始化来实现内部类数据的初始化,实例如下:

interface JieKou {void say();}public class OuterClass {public JieKou InnerClass(String name) {return new JieKou() {String name;{this.name = name; //此时不需要 参数name为 final}@Overridepublic void say() {// TODO Auto-generated method stub}};}}




静态内部类

静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:    

    1、 它的创建是不需要依赖于外围类的。   

    2、 它不能使用任何外围类的非static成员变量和方法。

静态内部类eg:

public class OuterClass {private String name;private static int age;static class InnerClass {public void say() {System.out.println(age);}}}

通过上面代码可以看到,静态内部类可以引用外部类的静态属性和方法,引用不了非静态属性。

以上就是我对内部类的理解,我了解的也非常片面,很多东西都只能是在使用中体会,内部类在java集合中有着非常广泛的使用,大家可以通过学习java集合的源码来提高对内部类的认识!咱们一起努力加油咯!

0 0
原创粉丝点击