1.定义
一个类的定义放在另一类中,这个类就是内部类
2.内部类的分类
a.普通内部类
b.方法内部类
c.静态内部类
d.匿名内部类
3.解释说明
a.普通内部类
#内部类可以在外部类中实例化对象
#内部类也可以在外部实例化对象
b.方法内部类
#内部类的实例化只能在该方法中
#内部类中不能使用该方法中非final局部变量
c.静态内部类
#静态是指内部类和静态成员变量和方法一样,没有外部类的对象时,也可以访问它。静态内部类仅能访问外部类的静态成员变量和方法。
#创建内部类的对象不需要依赖外部类的对象。
d.匿名内部类
#继承式匿名内部类
#接口式匿名内部类
#参数式匿名内部类
3.代码示例
a.普通内部类
//普通内部类
public class CommomInner
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.print();
//不推荐这么使用
Outer.Inner inner = outer.new Inner();
inner.print();
}
}
class Outer
{
class Inner
{
public void print()
{
System.out.println("普通内部类");
}
}
public void print()
{
Inner inner = new Inner();
inner.print();
}
}
b.方法内部类
//方法内部类
public class StaticInner
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.print();
}
}
class Outer
{
public void print()
{
class Inner
{
public void print()
{
System.out.println("方法内部类");
}
}
Inner inner = new Inner();
inner.print();
}
}
c.静态内部类
//静态内部类
public class StaticInner
{
public static void main(String[] args)
{
Outer.Inner inner = new Outer.Inner();
inner.print();
}
}
class Outer
{
//只有内部类才能用static修饰
static class Inner
{
public void print()
{
System.out.print("静态内部类");
}
}
}
d.匿名内部类
#继承式内部类
//继承式匿名内部类
public class ExtendsInner
{
public static void main(String[] args)
{
Parent parent = new Sub();
parent.print();
}
}
abstract class Parent
{
public abstract void print();
}
class Sub extends Parent
{
public void print()
{
Parent parent = new Sub()
{
public void print()
{
System.out.println("继承式匿名内部类");
}
};
parent.print();
}
}
#接口式内部类
//接口式匿名内部类
public class InterfaceInner
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.print();
}
}
interface Child
{
public void print();
}
class Outer
{
public void print()
{
Child child = new Child()
{
public void print()
{
System.out.print("接口式匿名内部类");
}
};
child.print();
}
}
#参数式内部类
//参数式匿名内部类
public class ParameterInner
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.print(new Child()
{
public void print()
{
System.out.print("参数式匿名内部类");
}
});
}
}
interface Child
{
public void print();
}
class Outer
{
public void print(Child child)
{
child.print();
}
}