内部类
一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类。
类的五大成员:属性,方法,构造器,代码块,内部类。
内部类与局部内部类
class Outer
{
private int n= 100;
private void m2()
{
}
public void m1()
{
class Inner //局部内部类
{
//可以直接访问外部类的所有成员,包括私有
//内部类相当于局部变量,不能添加访问修饰符,但是可以使用final修饰
//作用域:仅仅在定义它的方法或代码块中
private int n= 20;
public void f()
{
System.out.println(n);//20
//当外部类与局部类重名 就近原则,调用外部类 外部类名.this.成员
System.out.println(Outer.this.n);//100
m2();
}
}
//创建局部内部类
Inner inner = new Inner();
inner.f();
}
//内部类,定义在成员位置上,相当于一个类的成员
//可以添加任何修饰符
public class Inner2()
{
public void say()
{
System.out.println(666);
}
}
}
匿名内部类(超重点)
作用:简化开发,对于某些对象只需要存在一次,则可用匿名类。
1.本质是类 2.内部类 3. 该类没有名字 4.同时是一个对象
class Outer2
{
private int n2 = 10;
public void method()
{
//匿名内部类
//fish 的编译类型 A
//fish 的运行类型 Outer2$1
//在底层 自动分配一个类
//class Outer2$1 implements A
// {
// @Override
// public void cry()
// {
// System.out.println("fish cry");
// }
// }
A fish= new A()
{
@Override
public void cry()
{
System.out.println("fish cry");
}
};
fish.cry();
System.out.println(fish.getClass());//Outer2$1
//class Outer2$2 extends Father
Father father=new Father("pig")
{
@Override
public void test()
{
System.out.println("pig eat");
}
};
father.test();
}
}
interface A //接口
{
public void cry();
}
class Father
{
public Father(String name)
{}
public void test()
{}
}
练习
public class AnonmousClass
{
public static void main(String[] args)
{
CellPhone cellPhone = new CellPhone();
cellPhone.alarmClock(new Bell()
{
@Override
public void ring()
{
System.out.println("wake up");
}
});
cellPhone.alarmClock(new Bell()
{
@Override
public void ring()
{
System.out.println("go to study");
}
});
}
}
interface Bell
{
void ring();
}
class CellPhone
{
public void alarmClock(Bell bell)//形参类型是Bell
{
bell.ring();//实现方法
}
}