在分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述的事物,这个还有的事物就可以定义为内部类来描述。
1、内部类的特点
①内部类可以直接访问外部类中的成员,因为内部类持有了外部类的引用,外部类名.this
②外部类如果要访问内部类的成员,必须要建立内部类的成员。
③如果内部类中定义了静态成员,则该内部类是静态的。
④如果内部类是静态的,该内部类相当于一个外部类。因为静态成员可以直接用类名调用,不需要创建对象。
class Outer
{
private static int num = 31;
class Inner// 内部类。
{
void show()
{
System.out.println("show run..."+num);
}
/*static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的。
{
System.out.println("function run ...."+num);
}
*/
}
public void method()
{
Inner in = new Inner();
in.show();
}
}
public class InnerClass1
{
public static void main(String[] args)
{
// Outer out = new Outer();
// out.method();
//直接访问外部类中的内部类中的成员。
Outer.Inner in = new Outer().new Inner();
in.show();
//如果内部类是静态的。 相当于一个外部类
// Outer.Inner in = new Outer.Inner();
// in.show();
// 如果内部类是静态的,成员是静态的。
// Outer.Inner.function();
}
}
2、内部类可以放在局部位置上,当内部类放在局部位置上时,只能访问局部中被final修饰的局部变量
3、匿名内部类
匿名内部类就是内部类的简写格式,使用前提:内部类必须继承或实现一个外部类或者接口。匿名内部类其实就是一个匿名的子类对象。格式:new 父类或者接口() {子类内容}
abstract class Demo
{
abstract void show();
}
class Outer
{
int num = 3;
void method(){
new Demo(){
void show(){
System.out.println("show ........"+num);
}
}.show();
}
}
class InnerClass3
{
public static void main(String[] args)
{
new Outer().method();
}
}
匿名内部类中方法有多个时如何调用?
interface Inter
{
void show1();
void show2();
}
class Outer
{
public void method()
{
Inter in = new Inter()
{
public void show1()
{
System.out.println("show1 run ...");
}
public void show2()
{
System.out.println("show2 run ...");
}
};
in.show1();
in.show2();
}
}
class InnerClass4
{
public static void main(String[] args)
{
new Outer().method();
}
}