------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
嵌套类的概述:
嵌套类是一个在另一个类或者接口内部声明的类,嵌套类有两种嵌套类型:
1:静态内部类
2:非静态嵌套类,非静态嵌套类也称内部类,内部类的几种类型:
1:成员内部类
2:本地内部类
3:匿名内部类
嵌套类的行为表现类似于一个普通的类,嵌套类可以扩展为另一个类,实现接口,变成子类的父类等,下面是一个简单的嵌套类为例
piblic class outer{
class Nested{
}
}
还有就是在一个嵌套类中还可以有另一个嵌套类,这种不是很常见像这样:
public class S1{
class S2(
class S3{
}
)
}
对于顶层类而言,嵌套类也其他类成员无异,比如嵌套类与类成员一样也可以由这写修饰符,public,protected,private,default。
由于嵌套类是外部类的成员所以所以静态嵌套类 行为与内部类的行为不完全相同,下面是他们的区别:
1:静态嵌套类可以有静态成员,内部类则不行
2:像实例方法一样,内部类可以访问外层类的静态成员和非静态成员,包括pravate成员,静态嵌套类则只能访问外层类的静态成员
3:不需要先创建其外层类的实例就可以直接创建静态嵌套类实例,相反,将内部类本身实例话之前,必须先创建一个包装内部类的外层实例。
内部类的有点有:
1:内部类可以访问外层类的所有成员(包括pravate)
2:内部类有助于完全一个类的实现
3:内部类提供了一种在Swing和其他基于事件的应用程序中编写监听器的快捷方式:
代码演示,一个静态的嵌套类:
<span style="font-size:18px;">package com.itheima;
class Text11 {
private static int value=9;
static class Nested1{
int calculate(){
return value;
}
}
}
class StaticNested1 {
public static void main(String[] args) {
Text11.Nested1 nested=new Text11.Nested1();
System.out.println(nested.calculate());
}
}
</span>
关于静态嵌套类,几点应该注意的是:
1:引用嵌套类的格式
2:实例化静态的嵌套类时,不需要创建外层类实例
3:必须从静态嵌套类内部方位外层类的静态成员
成员内部类概述:
成员内部类是指其定义一个直接被另一个类或者 接口的声明包装类。只是当引用七外层类的实例时才会创建成员内部类实例,为了从外层类内部创建内部类实例,可以调用内部类的构造器,就像调用其他普通的类一样。但是,如果想从外层类的外部创建内部类的实例则必须使用一下语法
EnclostingClassName.InnerClassName inner=enclosingClassObjectReference.new InnerClassName();
像往常一样,从内部类,可以利用关键字this引用当前实例。要引用外层类的实例得利用这个语法:
EnclosingClassName.this
成员内部类代码演示:
<span style="font-size:18px;">package com.itheima;
class TopLevel{
private int value=9;
class Inner{
int calculate(){
return value;
}
}
}
public class text12 {
public static void main(String[] args) {
TopLevel toplevel=new TopLevel();
TopLevel.Inner inner=toplevel.new Inner();
System.out.println(inner.calculate());
}
}
</span>
注意:
成员内部类可以完全隐藏一个实现,有些事情不采用内部内是无法完成的。
局部内部类的概述
局部内部类简称局部类,从定义上来讲他不属于任何类的成员类,局部类有名称与没有名称的匿名类相反,局部类可以在任何代码快中进行声明,他的作用是在这个代码块之内,例如我们可以在一个方法中,一个if()中,一个while()中声明局部类。
下面是局部类代码演示:
<span style="font-size:18px;">import java.util.Date;
interface Logger{
public void log(String str);
}
public class Test13 {
String appStartTime=(new Date()).toString();
public Logger getLogger(){
class LoggerImpl implements Logger{
public void log(String message){
System.out.println(appStartTime+":"+message);
}
}
return new LoggerImpl();
}
public static void main(String[] args) {
Test13 test=new Test13();
Logger logger=test.getLogger();
logger.log("local class example");
}
}
</span>
注意:
有一个LoggerImpl的局部类,他出在一个方法的内部该方法必须返回Ligger接口的一个实现,并且这个实现不可以在其他 对方使用
匿名内部类的概述
匿名内部类根据定义可知就是没有名字,使用这种嵌套类是为了编写接口的实现
小结:
嵌套类是指在另一个类中声明的类,他有四种类型:
1:静态嵌套类
2:成员内部类
3:局部内部类
4:匿名内部类
使用嵌套类的好处是,完全隐藏一个类的实现,以及可以快速的编写一个其实例只存在于某一个上下文中的类。