当描述事物时,事物的内部还有事物,那么该事物用内部类来描述,因为内部事物在使用外部事物的内容。
内部类访问规则:
1. 内部类可以访问外部类任何成员,包括私有化成员;
之所以可以直接访问,是因为内部类中持有了一个外部类的引用,格式: 外部类名.this
2. 外部类要访问内部类成员,必须建立内部类对象
访问格式:
- 当内部类在外部类的成员位置上,而且非私有,可以在外部其他类中建立内部类对象。
- 当内部类在外部类的成员位置上,就可以被成员修饰符修饰,例如private(封装内部类)static(当内部类静态后,内部类只能访问外部类的静态成员,出现了访问局限)
- 假设内部类静态,外部类非静态,调用内部类非静态成员方法: Outer.Inner().func();别的情况以此类推!
- 注意: 当内部类中定义了静态成员,该内部类必须是静态的!
- 注意2: 当外部类中的静态方法访问内部类时,该内部类也必须是静态的
内部类在成员位置范例:
class Outer
{
private int x = 3;
class Inner
{
void func()
{
System.out.println(x); //内部类可以直接访问外部类成员
}
}
void method()
{
Inner in = new Inner(); //外部类需要建立内部类对象才能访问内部类
in.func();
}
}
class InnerDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();
//直接建立内部类对象:
Outer.Inner in = new Outer().new Inner();
in.func();
}
}
3. 内部类定义在
局部位置时
- 不可以被成员修饰符修饰;
- 可以直接访问外部类中的成员,因为还持有外部类的引用;但是不可以访问所在局部中的局部变量,除非其有final修饰
内部类在局部位置范例(注意final):
class Outer
{
void method(final int a)
{
final int x = 3;
//局部位置上的内部类:
class Inner
{
void func()
{
System.out.println("x = " + x + " a = " + a); //调用所在局部的变量x与a
}
}
new Inner().func(); //在外部调用内部类需创建内部类对象
}
}
class InnerDemo2
{
public static void main(String[] args)
{
new Outer().method(1);
}
}
1. 匿名内部类其实就是内部类的简写格式;
2. 匿名内部类必须要继承一个类或者实现接口;
3. 匿名内部类格式:
new 父类或者接口(){定义子类内容}
4. 匿名内部类是一个匿名子类对象。
5. 匿名内部类的方法最好不超过三个,因为本来是用来简化书写的。
示例(代码中匿名内部类部分替代了被注释的部分):
//抽象类(父类)
abstract class AbsClass
{
abstract void show();
}
class Outer
{
/*
class Inner extends AbsClass
{
void show()
{
System.out.println("show");
}
}
*/
void func()
{
//new Inner().show();
//匿名内部类(子类)对象:
new AbsClass() //父类名
{
void show() //父类方法复写
{
System.out.println("show");
}
void show1() //子类自己的方法
{
System.out.println("show1111");
}
}.show(); //方法调用
}
}
class AnonymousInnerClassDemo
{
public static void main(String[] args)
{
new Outer().func();
}
}