最近在学习安卓的一些知识,加上身体不舒服,好久没有写博客了,今天就总结一下java中的内部类的相关知识。
内部类,从字面着手就是在某个类的内部又定义了一个类。举个例子:
class Outer
{
private String index="The String is in Outer Class";
public class Inner
{
String index="The String is in Inner Class";
void print()
{
String index="The String is in print Method";
System.out.println(index);
System.out.println(this.index);
System.out.println(Outer.this.index);
}
}
void print()
{
Inner inner = new Inner();
inner.print();
}
Inner getInner()//注意:必须使用此方法创建内部类实例对象
{
return new Inner();
}
}
public class TestOuterAndInner
{
public static void main(String[] args)
{
Outer outer = new Outer(); //先产生外部类对象
//Outer.Inner inner = outer.getInner();//内部类前没有public时的访问方法
Outer.Inner inner = outer.new Inner(); //利用对象的new方法
inner.print();
}
}
在这段代码里面,Inner就是一个内部类,对比内部类和外部类,除了内部类是写在一个类里面,没有其他不同,所以内部类其实唯一不同就是写在类里面,它也有自己的数据成员和方法。不过正因为内部类所处位置,它可以直接访问外部类中的所有属性,因此当想要对一个类的一些属性或方法对其它类进行封装,而只对一个类开放时,就想到了用内部类。还要注意的就是内部类产生对象的方法,并且外部类无法直接访问内部类中的成员。内部类也是类,所以也可以是静态的,也可以是抽象的。
内部类里面还有比较特殊的一种,叫匿名内部类。从文本出发,匿名肯定就是没有名字了,这个内部类就更有意思了。具体解释就是在类中需要实例化这个类的地方,通常为方法内,定义一个没有名称的类。
举个例子:
public class TestAnonymity {
public static void main(String[] args) {
Object obj = new Object() {
public int hashCode() {
return 42;
}
};
System.out.println(obj.hashCode());
}
}
这段代码里定义了一个匿名内部类,将hashCode()方法进行了覆盖。这里new Obiect()其实不是new一个Object这个大类的对象,new的是那个匿名内部类的对象。
由于匿名内部类这种特殊的类型,它不能有构造方法,不能定义任何静态成员和方法,不能有修饰符,而且只能创建匿名内部类的一个实例。因此还是要慎用。