1. 什么是内部类
将一个类定义在另一个类里面,在里面的那个类就称为内部类(内置类,或嵌套类)
2. 内部类的访问规则:
i. 内部类可以直接访问外部类中的成员,包括私有成员。
ii. 外部类要访问内部类中的成员必须要建立内部类的对象。
classOuter
{
private int x = 1;
class Inner
{
private int x = 2;
private void founc()
{
int x = 3;
System.out.println("founc_x ="+x);
System.out.println("inner_x ="+this.x);
System.out.println("outer_x ="+Outer.this.x);
}
}
void method()
{
Inner in = newInner();//外部类访问内部类要建立内部类对象
in.founc();
}
}
3. 内部类的位置
i. 内部类定义在成员位置上
可以被private static成员修饰符修饰,被static修饰的内部类只能访问外部类中的静态成员
ii. 内部类定义在局部位置上
也可以直接访问外部类中的成员,同时可以访问所在局部的局部变量,但必须是被final修饰的。同时不能被成员修饰符修饰
class Outer
{
int x = 3;
void method(final int z)
{
final int y = 4;
//内部类在局部位置,不能被成员修饰符修饰
class inner
{
void founc()
{
System.out.println(x);//Outer.this.x
//此时只能访问final型局部变量
System.out.println(y);
System.out.println(z);
}
}
new inner().founc();//非静态没对象不运行
}
}
4. 匿名内部类:就是内部类的简写格式
i. 定义匿名内部类的前提:
内部类 可以 继承一个类 或者 实现一个接口
ii. 匿名内部类的格式:
new 父类名(或接口名){定义子类内容}
其实就是一个匿名子类对象
interface MyInterface
{
public abstract void print();
}
class Outer
{
int x = 3;
/*
class Inner implementsMyInterface
{
void print()
{
System.out.println("result---"+x);
}
}
*/
void method()
{
//newInner().print();
new MyInterface()//匿名内部类
{
public void print()
{
System.out.println("result---"+x);
}
}.print();
}
}
5. 一个经典的匿名内部类的程序示例:
要求,根据主函数里面的语句补充接口定义和Test类中的内容
interface Inter
{
void method();
}
class Test
{
/*
static class Innerimplements Inter //内部类,成员位置
{
public voidmethod()
{
System.out.println("**methodrun**");
}
}
*/
static Inter founction()
{
//returnnew Inner();
return new Inter()
{
public void method()
{
System.out.println("methodrun");
}
};
}
}
class NamelessTest
{
public static void main(String[]args)
{
//关键在这个语句的解读
//Test.founction说明founction是静态,返回一个对象
Test.founction().method();
}
}