内部类
- 类中定义的类,内部类依赖于外部类而存在。
- 创建内部类对象是,会隐式的把其外部类对象的引用传给内部类并保存,这样,内部类对象始终都可以访问外部类对象。
- 如果内部类声明为静态类,那么内部类就不能随便访问外部类的成员变量,仍然只能访问外部类的静态成员变量。
- 外部类只能使用public和缺省的包访问权限修饰类,而内部类可以使用public,protected,private访问权限来修饰类。
内部类分类
成员内部类,方法内部类,匿名内部类,静态内部类。
成员内部类 :作为外部类的一个成员存在,与外部类的属性,方法并列。
成员内部类,直接定义在类中。就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
class Outer {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); //创建成员内部类的对象,左边的Outer可以不要
inner.print("调用内部类的方法");
}
public class Inner {
public void print(String str) {
System.out.println(str);
}
}
}
局部内部类,是指内部类定义在方法和作用域内。
局部内部类只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。
class Outer {
public In play(){
class Inner extends In{
public void print(String str) {
System.out.println(str);
}
}
return new Inner();
}
public static void main(String[] args) {
Outer outer = new Outer();
In inner = outer.play(); //创建指向局部内部类的基类对象引用,只有这样才可以在局部内部类的作用于外使用局部内部类
inner.print("调用内部类的方法");
}
}
class In{
public void print(String str)
{
}
}
与成员内部类定义的唯一区别是前面加了一个static的修饰符。
静态内部类,不需要内部类对象和外部类对象之间的联系。
class Outer {
static class Inner{
static class In{
}
public void print(String str) {
System.out.println(str);
}
}
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner(); //创建静态内部类的对象
inner.print("调用内部类的方法");
}
}
有时候我为了免去给内部类命名,便倾向于使用匿名内部类,因为它没有名字。
匿名内部类是不能加访问修饰符的。即它的访问权限修饰符只能是friendly(默认的)。
class Outer {
public Inner getInner(final int i,int j) {
return new Inner(){
int k;
{
k=i;//如果是k=j,会报错
}
};
}
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.getInner(2014,11); //创建指向匿名内部类的父类对象引用
}
public class Inner {
public void print(String str) {
System.out.println(str);
}
}
}