版权声明:学习内容均为本人笔记,代码均为本人依据课本所写或改编,笔记均为个人心得或书中摘抄
引言:内部类,即将一个类的定义放在另一个类的定义内部。内部类与组合是完全不同的概念。内部类看似是一种代码的隐藏机制,其实,它能够了解外部类,并且与之通信,这为我们的编程提供了极大的方便。
1.1创建内部类
//190
public 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){//在末尾添加新的Object
if(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博友