public class Outer {
public class Inner {
public void say(String str) {
System.out.println(str);
}
}
//个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时
public Inner getInner() {
return new Inner();
}
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
inner.say("hello world!");
Inner inner2 = outer.getInner();
inner2.say("你好,世界!");
}
}
局部内部类,是指内部类定义在方法和作用域内。请看如下两个例子:
定义在方法内:
public class Outer {
interface Spider {
void fly();
}
public Spider getSpiderman() {
//定义局部内部类
class Spiderman implements Spider {
@Override
public void fly() {
System.out.println("我是超人我会飞!");
}
}
//使用局部内部类
return new Spiderman();
}
public static void main(String[] args) {
Spider spider = new Outer().getSpiderman();
spider.fly();
}
}
定义在作用于内:
public class Outer {
private static final String NOTICE = "我是超人我会飞!";
private void spidermanSayHello(boolean flag) {
if (flag) {
//定义局部内部类
class Spiderman {
public void fly() {
System.out.println(NOTICE);
}
}
//使用局部内部类
new Spiderman().fly();
}
}
public void spidermanSayHello() {
spidermanSayHello(true);
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.spidermanSayHello();
}
}
局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。
public class Outer {
public static String STR = "I am in outer";
public static void say() {
System.out.println("outer: " + STR);
}
static class Inner {
public static String STR = "I am in inner";
public static void say() {
System.out.println(STR);
Outer.say();
}
}
public static void main(String[] args) {
String ss = Outer.Inner.STR;
System.out.println(ss); //I am in inner
Outer.Inner.say(); //I am in inner //outer: I am in outer
}
}
/**
* 被内部类使用到的外部类的方法的形参(注意city没有被内部类使用到),必须为final。
* 为什么要定义为final呢?
* 简单理解就是,在拷贝引用时,为了避免引用值发生改变,例如被外部类的方法修改,而导致内部类得到的值不一致,于是用final来让该引用不可改变。
*/
public class Outer {
//
interface Spider {
String getName();
}
//
public Spider getSpiderman(final String name, String city) {
System.out.println("city: " + city);
return new Spider() {
private String nameStr = name;
@Override
public String getName() {
return nameStr;
}
};
}
public static void main(String[] args) {
Outer outer = new Outer();
Spider spiderman = outer.getSpiderman("Parker", "New York");
System.out.println(spiderman.getName()); //Parker
}
}
内部类的继承,是指内部类被继承,普通类 extents 内部类。而这时候代码上要有点特别处理,具体看以下例子:
public class A extends Outer.Inner {
//无参构造函数A()是不能通过编译的,一定要加上形参
A(Outer outer) {
outer.super();
}
public static void main(String[] args) {
Outer outer = new Outer();
A a = new A(outer);
a.say("hello!");
}
}
class Outer {
class Inner {
public void say(String str) {
System.out.println(str);
}
}
}