内部类
内部类可以直接访问外部类成员 包括私有成员
外部类要访问内部类中的成员必须要建立内部类的对象
class Outer
{
private int num = 3;
class Inner
{ void show()
{
直接访问num
}
}
public void method()
{
Inner in = new Inner;
in.show();
}
}
内部类一般用于类的设计
分析事物时 发现该事物描述中还有事物 而且这个事物还在访问被描述事物的内容
这时就可以将还有的事物用内部类来描述
直接访问外部类中的内部类的成员
Outer.Inner in = new Outer().new Inner();
in.show();//少用
如果内部类是静态的话 代表 外部类一加载内部类就存在 此时 就相当于一个外部类
Outer.Inner in = new Outer.Inner();这个时候就是可以直接new内部类
当内部类中定义了静态成员 那么该内部类必须是静态
只有内部类是静态的那么该静态成员才可以是属于那种类一加载就能访问
为什么内部类能直接访问外部类中成员呢?
因为内部类持有了外部类的引用 即 外部类名.this
内部类放在局部位置
比如函数内部
内部类访问局部变量的时候 变量一定是final类型 ?
内部类在局部位置只能访问局部中被final修饰的局部变量
匿名内部类
实质就是匿名子类对象
new 父类or接口(){子类内容}
内部类的简写格式
前提 内部类必须继承或者实现一个外部类或者接口
首先要匿名 就是没有名字 new什么 new他父亲 (){方法要实现其父亲的方法}
abstract class Demo
{
abstract void show();
}
class Outer
{
int num = 4;
public void method()
{
new Demo()//这就是匿名内部类
{
public void show()
{
System.out.println("show....");
}
}//在这里还可以调用里面的show方法
}
}
以上格式若想调用方法只能再new在. 如何不new调用多个方法
那要给匿名内部类一个标志 并不是给内部类起名字
abstract Inter{
abstract void show1();
abstract void show2();
}
class Outer
{
//原始写法
//class Inner extedns Inter
//{
// void show1(){}
// void show2(){}
//}
public void method()
{
//原始写法
//Inner in = new Inner();
//in.show1();
//in.show2();
//匿名写法
Inner in = new Inter(){
void show1(){}
void show2(){}
};
in.show1();
in.show2();
}
}
使用场景:
当函数参数是接类型的时候 而且接口中的方法不超过三个
可以用匿名内部类作为实际参数进行传递参数过多就容易臃肿
class InnerClass
{
public static void main(String[] args)
{
System.out.println("hello world");
show(new Inter(){
public void show1(){}
});
}
public static void show(Inter in)
{
in.show1();
in.show2();
}
}
内部类细节
匿名内部类就是基于多态的基础上用父类应用指向一个子类对象
所以匿名内部类真的不能访问子类中未重写父类方法的方法 即 子类特有的方法