内部类就是在外部类内部定义的一个类,该类可以放到外部类的里面、外部类的某个方法中、外部类某个表达式内.有了内部类以后,就可以访问外部类中的私有成员变量.
内部类共分为4中类型:
(1)、静态内部类
/**
* 静态内部类
* @author Administrator
*
*/
public class StaticInnerclassTest {
public static void main(String[] args) {
OutClass.InnerStatciClass inner = new OutClass.InnerStatciClass();
inner.test();
}
}
class OutClass {
private static int i = 3;
static class InnerStatciClass {
public void test() {
System.out.println(i);
}
}
}
a.对于静态内部类的初始化,通常使用外部类.内部类即可
b.静态内部类中只能访问外部的静态成员变量
c.编译后的class文件中,会出现OutClass.class和OutClass$InnerStatciClass.class字节码文件
(2)成员内部类
public class MemberInnerClassTest {
public static void main(String[] args) {
//注意内部类的初始方式
OutClass1.MemeberInnerClass member = (new OutClass1()).new MemeberInnerClass();
OutClass1 out = new OutClass1();
out.test();
member.test();
}
}
class OutClass1 {
private int j = 5;
class MemeberInnerClass {
int j = 2;
public void test() {
System.out.println(OutClass1.this.j);//打印外部类的成员变量
}
}
public void test() {
System.out.println(j);
}
}
a.访问外部类的成员变量:外部类名.this.外部类成员变量名
b.实例化方式:(new 外部类名()).new 内部类名()
c.在外部类的某个方法中掉用内部类:this.new 内部类名();
(3) 局部内部类
/**
* 局部内部类(通常定义在外部类的方法作用域中)
* @author Administrator
*
*/
public class LocalInnerClassTest {
public static void main(String[] args) {
OutClass2 out = new OutClass2();
out.test();
}
}
class OutClass2 {
private int j = 3;
public void test() {
final int j = 4;
class inner1 {
public void innerTest() {
System.out.println(j);//局部内部类只能访问final类型的变量
}
}
new inner1().innerTest();
}
}
a.在外部类的某个方法中作用域或更小作用域中的类
b.该内部类中只能起之外的被final修饰的变量
(4) 匿名内部类
public interface MyInterfce {
public String print();
}
/**
* 匿名内部类
* @author Administrator
*
*/
public class AnonyInnerClassTest {
public static void main(String[] args) {
OutClass3 out = new OutClass3();
String str = out.test(new MyInterfce() {
@Override
public String print() {
return "hello world";
}
});
System.out.println(str);
}
}
class OutClass3 {
public String test(MyInterfce mi) {
return mi.print();
}
}
a.匿名内部类就是没有类名的局部内部类
b.没有显示的继承或实现接口的关键字,但是可以继承或者实现接口,如本例中就隐式实现了MyInterface接口