Java内部类

来源:互联网 发布:软件挖矿 编辑:程序博客网 时间:2024/06/05 21:09

内部类,顾名思义,将一个类的定义放在另一个类的定义内部。内部类看起来像是一种代码隐藏机制,将类置于其他类的内部,但是,内部类远不止于此,它了解外围类,并能与之通信。

内部类分为:成员内部类,局部内部类,匿名内部类,静态内部类

当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员。原因是当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。并且,内部类对象只能在与其外围类的对象相关联的情况下才能被创建(除了static类),构建内部类对象时,需要一个指向其外围类对象的引用。

1.成员内部类

作为外部类的一个成员存在,与外部类的属性、方法并列

内部类和外部类的实例变量可以共存

在内部类中访问实例变量:this.属性

在内部类访问外部类的实例变量:外部类名.this.属性

对于一个名为outer的外部类和其内部定义的名为inner的内部类,编译完成后出现outer.class和outer$inner.class

成员内部类中不能有静态成员

代码如下:

2.匿名内部类

匿名内部类没有名字,没有构造方法,类中不能有静态成员,访问的外部的局部变量的类型只能是final型的,具体原因参看

http://feiyeguohai.iteye.com/blog/1500108,里面讲的非常清晰。

3.局部内部类

在代码块中定义的,典型的方式是在一个方法体里面创建。局部内部类不能有访问说明符,因为它不是外围类的一部分,其修饰符只能是final或者abstract;但是它可以访问当前代码块内的常量,(即final修饰的,否则会造成线程不安全问题,原因和匿名内部类的原因一样)以及此外围类的所有成员。

局部内部类和匿名内部类很相似,但有一个区别,局部内部类中有构造器。

4.静态内部类

如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static

这样的话就意味着:

1)要创建静态内部类的对象,并不需要其外围类的对象。

2)不能从静态内部类的对象中访问非静态的外围类对象。

public class Parcel
{
private static class ParcelContents implements Contents
{
private int i = 11;
public int value()
{
return i;
}
}
protected static class PareclDestination implements Destination
{
private String label;
private PareclDestination(String whereTo)
{
label = whereTo;
}
public static void f()
{

}
static int x=10;
static class AnotherLevel
{
public static void f()
{

}
static int x =10;
}
}
public static Destination destination(String s)
{
return new PareclDestination(s);
}
public static Contents contents()
{
return new ParcelContents();
}
public static void main(String[] args)
{
Contents c = contents();
Destination d = destination("HelloWorld");
}
}

}

参考文献:《Java编程思想第四版》

0 0
原创粉丝点击