之前看过内部类,但是感觉有些复杂,没有太大的收获;最近看了疯狂java讲义的书,用重新对java的内部类有了重新的认识,现在记录如下,以备以后查阅毕竟自己的东西以后看起来会更快,同时也给其他学习java的爱好者一个参考,如有不当之处还望多多包涵;
1、非静态内部类
内部类就是在一个类OutClass的内部再定义一个类InnerClass,那么这个类InnerClass就是内部类,非静态内部类就是外部类的一个成员,所以内部类可以访问外部类的成员,但是外部类不能访问内部类的成员,必须通过在外部类中定义一个内部类的对象然后通过该对象访问内部类的成员;例如下面的例子所示:
package cn.zzti.innerclass;
public class OutClass {
/**
* @param args
*/
private int numberOut = 10;
public void outClassMethod() {
System.out.println(numberOut);
}
public class InnerClass {
public void out() {
System.out.println(numberOut);//外部类的实例变量
}
}
public InnerClass getInnerClassObject() {
return new InnerClass();
}
public static void main(String[] args) {
}
}
那么内部类对象和外部类对象究竟是什么关系呢?
内部类对象必须寄存在外部类对象里,也就是说如果有一个内部类对象存在就一定有一个外部类对象存在,但是外部对象不一定寄存有内部类对象;这也正解释了为什么内部类可以访问外部类的成员,而外部类不能访问内部类的成员的原因;当外部类成员属性和内部类成员属性和内部类某一个方法里的局部成员重名的时候可是使用OutClass.this.param和this.param的方法访问,并且在非静态内部类中不能定义静态的成员变量;例如下面的程序示例:
package cn.zzti.innerclass;
public class OutClass {
/**
* @param args
*/
private int numberOut = 10;
public void outClassMethod() {
System.out.println(numberOut);
}
public class InnerClass {
private int numberOut = 10;
//public static int errorParam=10;
public void out() {
int numberOut = 10;
System.out.println(numberOut);//方法内部的变量
System.out.println(this.numberOut);//内部类的实例变量
System.out.println(OutClass.this.numberOut);//外部类的实例变量
}
}
public InnerClass getInnerClassObject() {
return new InnerClass();
}
public static void main(String[] args) {
}
}
2、静态内部类
静态内部类和一般类里的静态方法非常相似,由于静态成员不能访问实例成员,所以静态内部类不能访问外部类的实例成员,但是可以访问外部类的静态成员,包括静态属性和静态方法,如下的程序实例所示:
package cn.zzti.staticinnerclass;
public class StaticInnerClass {
/**
* @param args
*/
public static int a = 0;
public int b = 0;
private static InnerClass innerClass = new InnerClass();// 在外部类中定义内部类的对象
public static void outPrint() {
System.out.println(a);
System.out.println(innerClass.d);// 在外部类中访问内部类的成员
}
private static class InnerClass {
public static int c = 0;
public int d = 0;
public void inPrint() {
System.out.println(a);// 外部类的成员属性
outPrint();// 外部类的成员方法
}
}
public static void main(String[] args) {
}
}
3、匿名内部类
匿名内部类是指没有名称的类,定义匿名内部类时需要实现接口或者抽象类,因为匿名内部类没有类名称,所以匿名内部类中不能含有构造方法;如下程序实例所示:
public interface Interfaces {
public void method();
}
public class AnonymousInnerClass {
/**
* @param args
*/
public static void main(String[] args) {
final int a=0;
new Interfaces(){
{
System.out.println("匿名内部类没有类名,所以在匿名内部类中不能定义构造器,可以使用实例初始化块");
}
@Override
public void method() {
System.out.print("anonymous inner class");
System.out.println(a);
}
};
}
}
匿名内部类如果访问外部类的局部变量,则局部变量必须是final类型的;否则会出现编译错误