Interface InnerClass {
int getNum();
}
public class AnonymInnerClass {
public InnerClass getInnerClass(final int num, String str) {
return new InnerClass() {
int number = num + 3;
public int getNum() {
reurn number;
}
};
}
public static void main(String[] args) {
AnonymInnerClass anonymInnerClass = new AnonymInnerClass();
InnerClass inner = anonumInnerClass.getInnerClass(4, "test");
System.out.println(inner.getNum());
}
}
// 输出结果:7
1. 非静态内部类有着一个指向外部类对象的引用。
2. 普通内部类对象的创建:
? ? ? ? Outer o = new Outer();
? ? ? ? Outer.Inner in = o.new Inner();
3. 当内部类的属性与外部类同名时,会覆盖外部类的同名属性。
4. 如果要生成外部类对象的引用,可以使用 OuterClassName.this ,这样就可以产生一个正确的外部类引用了。
5. 内部类是一个编译时概念,一旦编译成功,它就与外围类属于两个完全不同的类(联系:内部类含有外部类对象的引用)。
6. 成员内部类可以无限制的访问外部类的属性和方法(包括 private),但是外部类要访问内部类的成员属性和方法,则需要通过内部类实例来访问。
7. 成员内部类的两个注意点:
? ? ? ? 1) 成员内部类不能存在任何 static 类型的变量和方法。
? ? ? ? 2) 成员内部类是依附与外围类的,只有先创建了外部类,才能够创建内部类。
public class OutClass {
private String name;
private int age;
class Inner { // 内部类可以访问外部类所有属性和方法
public void printName() {
System.out.println(name);
}
public void setName(String str) {
OutClass.this.name = str;
System.out.println(OutClass.this.name);
}
private String name = "inner name";
public void print(){
System.out.println(name);
System.out.println(OutClass.this.name);
}
}
// 外部类调用内部类的方法
public void outInvokeInner(){
Inner in = new Inner();
System.out.println("outer invoke inner");
in.print();
}
public static void main(String[] args) {
OutClass out = new OutClass();
OutClass.Inner in = out.new Inner();
in.printName();
in.setName("Hello");
in.print();
out.outInvokeInner(); // 外部类调用内部类方法
}
}
/**
* 输出:
* inner name
* Hello
* inner name
* Hello
* Outer invoke inner
* inner name
* Hello
*/
?