《Java编程思想》第四版之内部类学习之(一)——简单使用

来源:互联网 发布:beyond compare 3 mac 编辑:程序博客网 时间:2024/06/05 03:27

 版权声明:学习内容均为本人笔记,代码均为本人依据课本所写或改编,笔记均为个人心得或书中摘抄



引言:内部类,即将一个类的定义放在另一个类的定义内部。内部类与组合是完全不同的概念。内部类看似是一种代码的隐藏机制,其实,它能够了解外部类,并且与之通信,这为我们的编程提供了极大的方便。


1.1创建内部类

//190public class Parcel2 {class Contents{private int i=11;public int value(){return i;}}class Destination{private String label;public Destination(String whereTo) {label=whereTo;}String readLabel(){return label;}}public Contents contents(){//外部类的方法,返回一个内部类对象return new Contents();}public void ship(String dest){Contents c=new Contents();Destination d=new Destination(dest);System.out.println(d.readLabel());}public static void main(String[] args){Parcel2 p=new Parcel2();p.ship("Tasmania");Parcel2 q=new Parcel2();Parcel2.Contents c=q.contents();//利用外部类的对象访问外部类方法,返回内部类的对象}}/*Output:Tasmania*/
从main中可以看出,我们从外部类的非静态方法中获取了内部类对象,所以必须指明这个对象的类型:OuterClassName.InnerClassName

1.2链接到外部类

从main中,使用内部类最重要的一点就是,生成的内部类对象可以与制造它的外部类对象进行通信,它可以访问外部类对象的所有成员和外围类的所有元素,不需要任何条件。
//192页interface Selector{boolean end();Object current();void next();}public class Sequence {private Object[] items;private int next=0;public Sequence(int size){//固定数组大小items=new Object[size];}public void add(Object x){//在末尾添加新的Objectif(next<items.length)items[next++]=x;}private class SequenceSelector implements Selector{//内部类实现Selector接口,迭代器设计模式private int i=0;public boolean end(){//检查序列是否到达末尾return i==items.length;}public Object current(){//访问当前对象return items[i];}public void next(){//移动下标到虾一位if(i<items.length)i++;}}public Selector selector(){//返回一个内部类return new SequenceSelector();}public static void main(String[] args){Sequence sequence=new Sequence(10);for(int i=0;i<10;i++)sequence.add(Integer.toString(i));//初始化外部类对象中的数组Selector selector=sequence.selector();//创建内部类对象,指向接口,接口调用实例的具体方法while(!selector.end()){System.out.print(selector.current()+" ");//输出外部类数组中元素selector.next();}}}/*Output:1 2 3 4 5 6 7 8 9*/
从内部类可以看到,内部类中使用了外部类的private类型的数组item,由此可以看出,外部类对象拥有创建它外部类对象的所有成员的访问权
原因:外部类创建内部类对象时,内部类对象会捕获一个指向外部类对象的引用,通过这个引用可以访问外部类的所有成员。



1.3使用.this和.new

生成外部类对象引用的方法:外部类的名字后面紧跟圆点和this,在编译期就会接受检查,没有运行开销
如果想让某个对象创建内部类对象,可以使用.new的语法来创建。

//193页public class Parcel3 {class Contents{private int i=11;public int value(){return i;}}class Destination{private String label;public Destination(String whereTo) {label=whereTo;}String readLabel(){return label;}}public static void main(String[] args){Parcel3 p=new Parcel3();Parcel3.Contents c=p.new Contents();//使用了.new语法创建内部类对象Parcel3.Destination d=p.new Destination("Tasmania");}}


1.4总结

内部类可以访问外部类的成员及方法,内部类对象的创建需要外部类的引用。获取外部类引用:外部类名字+圆点和this。



温馨提示:如果有什么错误,或者有什么意见(对于排版、知识块内容选取、讲述方式等),烦请评论或私聊,也许您的一个建议和一点指点能使我更加完善自己,也能让您感受到帮助他人的乐趣。祝您的编程之路一帆风顺!


如有交流请加微信:备注CSDN博友


原创粉丝点击