第一部分 內部類形式
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");
}
}