更新时间:2020-02-05 09:19:58 来源:极悦 浏览2119次
内部类
可以将一个类定义放在另一个类的定义内部,这就是内部类。
创建内部类
如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须具体地指明这个对象的类型:OuterClassName.InnerClassName(外部类名.内部类名)。
链接到外部类
当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外为对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。
所有内部类自动拥有对其外围类所有成员的访问权。这是如何做到的呢?当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。幸运的是,编译器会帮你处理所有的细节,但你现在可以看到:内部类的对象只能在与其外围类的对象相关联的情况下才能被创建(就像你应该看到的,在内部类是非static类时)。构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。不过绝大多数时候这都无需程序员操心。
使用.this与.new
如果你需要生成外部类对象的引用,可以使用外部类的名字后面紧跟远点和this。
publicclassDotThis{
voidf(){System.out.println("DotThis.f()");}
publicclassInner{
publicDotThisouter(){
returnDotThis.this;
}
}
publicInnerinner(){
returnnewInner();
}
publicstaticvoidmain(String[]args){
DotThisdt=newDotThis();
DotThis.Innerin=dt.inner();
in.outer().f();
}
}
要创建某个内部类的对象,你必须在new表达式中提供其他外部类的对象的引用个,这里需要使用.new方法。
publicclassDotNew{
publicclassInner{
publicintf(){
return11;
}
}
publicstaticvoidmain(String[]args){
DotNewdt=newDotNew();
DotNew.Innerin=dt.newInner();
System.out.println(in.f());
}
}
由上可以总结出创建内部类对象有两种途径:
1)在内部类创建一个方法,该方法指向内部类的一个引用,如代码一中的inner()方法:
publicInnerinner(){
returnnewInner();
}
2)使用.new创建一个内部类对象,如代码二中:
DotNewdt=newDotNew();
DotNew.Innerin=dt.newInner();
内部类与向上转型
当将内部类向上转型为其基类,尤其是转型为一个接口的时候,内部类就有了用武之地。(从实现了某个接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。)这是因为此内部类----某个接口的实现----能够完全不可见,并且不可用。所得到的只是指向基类或者接口的引用,所以能够很方便地隐藏实现细节。
如果客户端程序员想了解或访问这些成员,那是要受到限制的。实际上,甚至不能向下转型成为private内部类(或protected内部类,除非是继承自它的子类),因为不能访问其名字,就像在TestParcel类中看到的那样。于是,private内部类给类的设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节
可以在一个方法里面或者在任意的作用域定义内部类。这么做有俩个理由:
1)如前面所讲,你实现了某类型的几口,于是可以创建并返回对其的引用
2)你要解决一个复杂的问题,想创建一个类辅助你的解决方案,但是又不想这个类是公共可用的。
极悦Javase相关视频免费下载学习
Javase视频教程【301集】:
Java视频下载【JavaSE进阶】:
以上就是极悦注册机构小编介绍的“Javase基础-内部类,内涵全套免费视频教程”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
相关内容
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习