内部类
1:定义在方法内部
public class A {
public A say() {
class B extends A {
public void test() {
System.out.println("say hello");
}
}
B b = new B();
return b;
}
}
2:定义在作用域内的类
3:实现了接口的匿名类
4:匿名类:扩展了非缺省构造器
5:匿名类:执行了字段初始化
6:匿名类:实例初始化构造器
内部类可以使用外围类的所有元素 注意看怎么实例化B
public class A {
String name;
private class B {
public void say() {
System.out.println(name);
}
}
public static void main(String[] args) {
A a = new A();
a.name = "z";
B b = a.new B();
b.say();
}
}
如果内部类不需要外围类的任何信息 可以static修饰
不管嵌套多少层 都可以获取外围元素
public class A {
String name;
private class B {
public void say() {
System.out.println(name);
}
private class C {
void f() {
say();
System.out.println(name);
}
}
}
public static void main(String[] args) {
A a = new A();
a.name = "z";
B b = a.new B();
B.C c = b.new C();
c.f();
}
}
内部类的继承 必须传递一个B类的引用 如果不写A的构造器 则报错
class B {
class C {}
}
public class A extends B.C {
A(B b) {
b.super();
}
}
内部类实现的回调函数 此方法可以获取i++的进度 利用钩子
interface Increment {
void incr();
}
class MyClass {
protected int i;
public void say() {
System.out.println("哈哈哈");
}
static void f(MyClass myClass) {
System.out.println(myClass.i);
};
}
class Call extends MyClass {
private class CC implements Increment {
@Override
public void incr() {
i++;
}
}
public Increment getInc() {
return new CC();
}
}
public class B {
public static void main(String[] args) {
Call call = new Call();
Increment inc = call.getInc();
inc.incr();
inc.incr();
inc.incr();
inc.incr();
MyClass.f(call);
inc.incr();
inc.incr();
MyClass.f(call);
}
}