1、Java中,内部类定义在类的范围内,分为4种:静态内部类、成员内部类、局部内部类、匿名内部类
2、静态内部类(static inner class):只能访问外部类的静态成员变量与成员方法,生成静态内部类的方式:
OuterClass.InnerClass inner = new OutClass.InnerClass();
例如:
public class StaticInnerClassTest {
public static void main(String[] args) {
StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
}
}
class StaticInner
{
private static int a = 4;
public static class Inner
{
public void test()
{
System.out.println(a);
}
}
}
3、成员内部类(member inner class):
(1)class MemberInner
{
private int a = 4;
public class Inner
{
private int a = 5;
public void test()
{
System.out.println(a);
}
}
}
当调用test()时会输出:5,就近原则,先输出其本身的属性值;如果本身没有该属性,则调用外部类的属性。如果我们想要访问外部类的a,则可以使用OuterClass.this.a即:MemberClass.this.a
(2)成员内部类可以访问外部类的静态的与非静态的成员方法与成员变量。生成成员内部类的对象的方式为:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
若想在成员内部类中访问外部类的成员变量,可以使用:OuterClass.this.a;
4、局部内部类(local inner class)(用的最少):定义在方法中,只能访问方法中生命的final类型的变量
public class LocalInnerClassTest {
public static void main(String[] args) {
LocalInner inner = new LocalInner();
inner.doSomething();
}
}
class LocalInner {
public void doSomething() {
final int a = 4;//局部内部类只能访问方法中的final变量
class Inner {
public void test() {
System.out.println("helloWorld");
}
}
new Inner().test();
}
}
5、匿名内部类(Anonymous Inner Class):使用最多,它是一个Local Inner Class,没有名字、构造方法,但是它会隐式的继承一个父类或实现一个接口,
public class AnonymousInnerClassTest {
@SuppressWarnings("deprecation")
public String get(Date date)
{
return date.toLocaleString();
}
public static void main(String[] args) {
AnonymousInnerClassTest test = new AnonymousInnerClassTest();
String str = test.get(new Date(){
public String toLocaleString()//匿名内部类重写了它的父类的toLocaleString()方法
{
return "hello world";
}
});//new Date(){}生成了一个继承了Date的类的对象 ,比如 public class MyDate extends Date{},该new Date(){}生成的是MyDate的对象
System.out.println(str);
}
}
发的萨菲
例子例子:
是
的