Java 的内部类
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
Inner class的名字不能与包含它的类名相同;
lInner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。
分类:成员内部类(static成员内部类和非static成员内部类)
局部内部类(不谈修饰符)、匿名内部类
class A {private int s;public class B{public void mb() {s = 100; System.out.println("在内部类B中s=" + s);} }public void ma() {B i = new B();i.mb();}
}public class Test { public static void main(String args[]){A o = new A();o.ma();}
}
内部类特性
- Inner class作为类的成员:
- 可以声明为final的
- 和外部类不同,Innerclass可声明为private或protected;
- Innerclass 可以声明为static的,但此时就不能再使用外层类的非static的成员变量;
- lInner class作为类:
- 可以声明为abstract类,因此可以被其它的内部类继承
- 【注意】非static的内部类中的成员不能声明为static的,只有在外部类或static的内部类中才可声明static成员。
匿名内部类
匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
new 父类构造器(实参列表)|实现接口(){
//匿名内部类的类体部分
}
interface A{public abstract void fun1();
}
public class Outer{public static void main(String[] args) {new Outer().callInner(new A(){//接口是不能new但此处比较特殊是子类对象实现接口,只不过没有为对象取名public void fun1() {System.out.println(“implement for fun1");}});// 两步写成一步了}public void callInner(A a) {a.fun1();}
}