内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类。
内部类是一个非常有用的特性,它允许你吧一些逻辑相关的类组织在一起,并控制内部类的可视性。
创建内部类
创建内部类就是把类的定义置于外围类的里面
public class Outer{
class inner{
private int i=11;
public int value(){
return i;
}
}
}
内部类的访问规则
1:内部类可以直接访问外部类中的成员,包括私有
2:外部类要访问内部类,必须建立内部类对象
代码示例:
Outer.Inner in=newOuter().new Inner();//用到极少
in.method();
3:内部类成员和外部类成员对象类型和名称相同
内部类之所以能够访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式是Outer.this
class Outer{
private int x=3;
class Inner{
void function(){
int x=6;
System.out.println("inner:"+this.x);//打印的值为6
System.out.println("outer:"+Outer.this.x);//打印的值位3
}
}
}
4:当内部类定义在外部类的乘员位置上,而且非私有,可以直接建立内部类对象
格式 外部类名.内部类名 变量名=外部类对象.内部类对象;
5:当内部类在乘员位置上,就可以被成员修饰符所修饰
比如:private:将内部类在外部类中进行封装
内部类可以被static修饰:内部类就具备了static的特性,当内部类被static修饰后,只能访问外部类中的静态成员变量了
静态内部类示例class Outer{
class Outer{
private static int x=3;
static class Inner{
void function(){
System.out.println(x);//打印的值为3
}
}
}
new Outer.Inner().function();//内部类对象调用function
new Outer.Inner.function();//这个是function为static的情况下
PS:当内部类中定义了静态成员,该内部类必须是静态的
内部类定义在局部时,不可以被成员修饰符修饰,可以直接访问外部类中的成员,因为还持有外部类的引用,但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量
匿名内部类:
1 匿名内部类其实就是内部类的简写格式
定义匿名内部类的前提内部类必须是继承一个类或者实现接口
//没有简化前
class ABSDemo{
abstract void show();
}
class Outer{
int x=3;
class Inner extends ABSDemo{
void show(){
System.out.println(x);
}
}
}