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

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



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


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博友


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值