第一部分 内部类形式
1、基本形式
a.以类形式存在:
class Outer{
......
class Inner{
......
}
}
b.以字段形式存在:
在内部类前加上修饰词private等,当作类的字段使用
2、在方法和任意作用域中定义内部类
a.快速创建被实现的接口的接口引用
interface InClass{....}
class Outer{
public InClass getInClass(){
class Inner implements InClass{
//实现接口中定义的方法
......
}
return new Inner( );
}
}
b.java允许在任意作用域内创建一个类来解决当前问题
3、匿名内部类
a.默认构造器生成匿名内部类对象
//匿名内部类的基本实现
class Outer{
public Inner inner(){
return new Inner(){ //创建匿名内部类对象
//匿名内部类方法以及字段
......
}; //匿名内部类特有的分号并不是用来表示内部类的结束,事实上是表示一个表达式的结束,而该表达式正好包含了匿名内部类
}
}
//在接口上使用匿名内部类
interface Inner{void f();}
class Outer{
public Inner inner(){
return new Inner(){
public void f(){......}
};
}
}
b.基类带参构造器生成匿名内部类对象
//匿名类内部不使用参数
class Base{
private String s;
public Base(String x){ s = x;}
public String sign(){ return s;}
}
class Outer{
public Base base(String y){
return new Base(y){ //参数y将不被使用在匿名类内部,而是传递给匿名类的基类(Base)构造器
public String sign(){return super.sign()+"in Outer_Base" ;}
};
}
}
//匿名类使用参数
interface Inner{String readlable();}
class Outer{
public Inner inner(final String dest){ //参数被使用在匿名内部类中,要求参数引用是final,而在java 8中则取消了这种限制
return new Inner(){
private String lable = dest;
public String readLable(){return lable;}
};
}
}
第二部分 内部类对象的创建
- 非静态内部类
class Outer{
//外部类自定义字段和方法
......
class Inner{
//内部类字段和方法
......
}
public static void main(String[] args){
Outer.Inner in = new Outer().new Inner();
}
}
2、静态内部类
class Outer{
//外部类自定义字段和方法
......
static class Inner{
//内部类字段和方法
......
}
public static void main(String[] args){
Outer.Inner in = new Outer.Inner();
}
}
3、使用.this创建正确类型的外部类对象引用
public class OuterThis {
public String f(){
return "OuterThis.f()";
public Inner inner(){
return new Inner();
}
class Inner{
public OuterThis getOuterThis(){
return OuterThis.this;
}
}
public static void main(String[] args){
OuterThis ot = new OuterThis();
OuterThis in = ot.inner().getOuterThis();
if(ot.f().equals(in.f()))
System.out.println("it's ok");
}
}