1.在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者成为外部类。
内部类分为四种:
1:实例内部类:
定义在类的内部,方法的外部,如
class OuterClass {
private int date1 = 1;
public int date2 = 2;
public static int date3 = 3;
public void test() {
System.out.println("OuterClass ::test()");
}
class InnerClass {
public int date1 = 100;
private int date4 = 4;
public int date5 = 5;
public static int date6 = 6;
public void test() {
System.out.println("InnerClass::test()");
}
}
}
a:如何实例化内部类: 可以通过
OuterClass out = new OuterClass();
OuterClass.InnerClass inner = out.new InnerClass();
这两行代码来实例化,
public class Test1 {
public static void main(String[] args) {
OuterClass out = new OuterClass();
OuterClass.InnerClass inner = out.new InnerClass();
}
}
然后就可以通过inner来访问InnerClass里面的成员了
b:如何在内部类访问和外部类同名的成员变量:
可以直接在内部类中实例化外部类对象,通过name.访问:
class InnerClass {
OuterClass out1 = new OuterClass();
public int date1 = 100;
private int date4 = 4;
public int date5 = 5;
public static int date6 = 6;
public void test() {
System.out.println("InnerClass::test()");
System.out.println(out1.date1);
}
此时的date1访问的就是外部类的date1,及打印1。
还可以通过OuterClass.this.类名来访问:
class InnerClass {
public int date1 = 100;
private int date4 = 4;
public int date5 = 5;
public static int date6 = 6;
public void test() {
System.out.println("InnerClass::test()");
System.out.println(OuterClass.this.date1);
}
此时的访问也是外部类的date1,及打印1。
2:静态内部类:
在InnerClass前加上static修饰,及:
class OuterClass {
private int date1 = 1;
public int date2 = 2;
public static int date3 = 3;
public void test() {
System.out.println("OuterClass ::test()");
}
static class InnerClass {
public int date1 = 100;
private int date4 = 4;
public int date5 = 5;
public static int date6 = 6;
public void test() {
System.out.println("InnerClass::test()");
}
}
}
a:如何实例化静态内部类:
可以通过OuterClass.InnerClass inner = new OuterClass.InnerClass();
public class Test1 {
public static void main(String[] args) {
OuterClass.InnerClass inner = new OuterClass.InnerClass();
}
}
注意在此内部类中不能直接访问外部类的非静态对象,但可以间接访问,及在内部类中实例化一个外部类对象,通过name.访问:
static class InnerClass {
OuterClass out = new OuterClass();
public int date1 = 100;
private int date4 = 4;
public int date5 = 5;
public static int date6 = 6;
public void test() {
System.out.println("InnerClass::test()");
System.out.println(out.date1);
}
}
3:局部内部类:
定义在外部类的方法内
只能在所定义的方法体内部使用
不能被public,static等修饰
及:
class OuterClass {
private int date1 = 1;
public int date2 = 2;
public static int date3 = 3;
public void test() {
class InnerClass {
public int date1 = 100;
private int date4 = 4;
public int date5 = 5;
public static int date6 = 6;
public void test() {
System.out.println("InnerClass::test()");
}
}
System.out.println("OuterClass ::test()");
}
}
4:匿名内部类:
匿名内部类与接口有关,是在“实例化接口”的过程中创建的匿名对象,及
interface ITsetable {
void test ();
}
public class Test2 {
public static void main(String[] args) {
new ITsetable() {
@Override
public void test() {
}
};
}
}
此时想要调用test方法只要在};后改成}.test就好
还有一种
public class Test2 {
public static void main(String[] args) {
ITsetable it = new ITsetable() {
@Override
public void test() {
}
};
it.test();
}
}
这里就是直接创建了一个匿名对象,通过it来访问test,这里还发生了动态绑定。
其实我们用的比较多的是实例内部类和静态内部类,局部内部类和匿名内部类知道就好。