java中的内部类有四种:静态内部类,成员内部类,匿名内部类,局部内部类。
1.静态内部类
使用static修饰的内部类。如下:
class Outter{
static class Inner{
......
}
}
在外部类加载的时候,静态内部类也随之加载,它的完整类名是itcast.Outter.Inner。编译后的class文件名为“Outter$Inner.class”.由于静态内部类是静态的,所以他无法访问外部类的非晶态成员。静态内部类相对于外部类几乎是独立的,他可以在没有外部类对象的情况下,单独创造一个内部类对象。
2.成员内部类
没有使用static关键字修饰的内部类,如下:
class Outter{
class Inner{
......
}
}
此时的内部类需要外部类创建了对象以后才可以被加载到JVM中,它属于外部类的某个实例,因此他可以调用外部类的静态和非静态成员,创建成员内部类的时候首先创建一个外部类的实例再调用这个实例调用new语句,代码如下:
Outter.Inner i=new Outter() . new Inner();
3.局部内部类
局部内部类就没有范围的概念了,它仅仅在定义它的方法中有效,如下:
public void show(){
class MyLocal{
。。。。。。
}
}
局部内部类不能使用static关键字,只能使用final和abstract关键字,尽可以访问外部类带有final关键字的局部变量.
4.匿名内部类。
匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。
java 代码如下:
interface OneInterface
{
void show();
}
public class noNameClass
{
public OneInterfacedest()
{
return new OneInterface(){
public void show()
{
System.out.println("Hello world!!");
}
};
}
public static void main(String args[])
{
noNameClass c=new noNameClass();
OneInterface hw=c.dest();
hw.show();
}
}
|