非静态的内部类可以访问外围类的所有成员
package practice;
public class Outter
{
private static int var1=1;
private int var2=4;
private static void s()
{
System.out.println("static function in Outter");
}
private void d()
{
System.out.println("function in Outter");
}
private class Inner
{
public void f()
{
System.out.println("static var in outter :"+var1);
System.out.println("var in outter :"+var2);
s();
d();
}
}
public static void main(String[]args)
{
Outter out=new Outter();
Outter.Inner in=out.new Inner();
in.f();
}
}
输出如下:
static var in outter :1
var in outter :4
static function in Outter
function in Outter
当在内部类中想要拥有一个外部类引用的时候可以使用
类名.this
例如outter.this
而在一个外部类创以前是不可能创建一个内部类对象的,就像上述代码所示的那样,先创建外围对象,然后通过.new才能创建其内部对象
当然上面所说的都是非静态的内部类
匿名内部类,当你需要一个辅助类完成某些任务又不希望这个类是公共可用的,这时匿名内部类就是一个很好的选择
但是当匿名类想要使用一个在其外部定义局部变量时那么那个参数引用必须是final类型的,至于为什么在内部类引用局部变量时必须是final型的,一种解释是因为局部变量与匿名类的生存期是不一致的,也就是说当一个方法调用结束了它的局部变量也就被”杀死”了,为匿名类却不一定,这样就造成了一个内部类使用了一个不存在的变量。
当不需要外围类与内部类存在任何联系时,我们应该使用static内部类。
既然不存在任何联系,在创建一个静态内部类时就不用去创建外围类了。
普通类与静态类的区别
普通类的字段与方法不能为静态的,其中也就不能包含静态类,而静态类却都可以做到。
内部类的存在价值,只说最重要的一点,那就是某种意义上的多重继承。
当希望继承两个类时,只有内部类才可以实现这样的效果(java中),这是因为内部类能够独立的实现一个类或者接口,无论外围类是否已经实现。