内嵌类是指嵌套在一个类中的类,又有别称嵌套类(NestedClass)或内部类(InnerClass),分为三种形式:成员类、方法内嵌类、匿名内嵌类。下面一一介绍:
一、成员类
内嵌类中最普通的一种,将其简单看作外部类的一个成员,大部分问题都能理解,另有以下几点需注意:
1、对外部类同名变量的隐藏,成员类中的this指向当前的成员类,而非外部类,成员类中访问外部类的当前对象用:外部类名.this 实现访问。
2、成员类的类名不能与外部类的类名相同,但可以与包中其它类或其它包中类相同,因为成员类实际名字是:外部类名$成员类名.java 。
3、静态方法(尤其main方法)中不能直接创建成员类的的对象,必须先创建外部类的对象,再创建成员类的对象。eg: OuterOne.InnerOne x=new OuterOne().newInnerOne();
二、方法内嵌类
方法内嵌类也无甚特殊,只是将类的声明和定义放到方法中,需要注意的一点是因为方法内嵌类与方法本身定义的一些局部变量没有直接的逻辑上的联系,故规定:方法内嵌类只能访问方法本身定义的常量!当然外部类的成员依然是可以访问的。
三、匿名内嵌类
理解起来就是Java允许创建对象的同时定义类的实现,但不必给出实现类的类名和对象名。eg:
interface Sample{//定义一个待实现的接口。
void testMethod();
}
public class AnonymousInner{
piblic void outMethod(){
//也可以命名一个对象,之后再调用testMethod方法。eg:Sample s=new Sample{....};s.testMethod();
new Sample{
//注意不能少了这个public,原接口可以默认但实现时不能少。
public void testMethod(){
System.out.println("just for test.");
}
}.testMethod();
}
public static void main(String args[]){
Anonymous test=new Anonymous();
test.outMethod();
}
}
需要注意的是匿名内嵌类产生的字节码文件命名是以编号的方式,如上例中匿名内嵌类的字节码文件则为:AnonymousInner$1.class