不给s赋值就会输出“do”,这是因为你在方法里不是new在这个局部内部类了么,最后的return new innerClass2("do"),初始化给s的值就是do,当然会输出"do"。至于为什么要引用接口,首先你的局部方法,返回值就是这个接口对象,如果你的局部内部类不去引用接口,那返回这个局部内部类对象,肯定会报错的。事实上,这里局部内部类的作用就是返回一个接口的对象。