匿名内部类:匿名内部类与正规继承相比受到一些限制。 匿名内部类可以扩展类,也可以实现接口,但这两者并不是兼而有之的,因为实现接口只能实现一个接口
一. contents ()方法将返回值的生成与表示返回值的类的定义组合在一起! 另外,这个类是匿名的,没有名字。 更糟的是,它看起来像是要创建一个Contents对象,但它说:“在到达语句的最后一个分号之前,例如: '。 我想在这里插入类的定义。' 以下代码在缺省构造函数中实现了接口Contents
//:接口匿名类
//: inner classes/contents.Java
打包对象; publicinterfacecontents { intvalue (;
//://3360 inner classes/parcel7. Java//returninganinstanceofananonymousinnnerclass。
打包对象; public class parcel7{ publiccontentscontents (} { return new contents ) { //Insert a class definition //在此为默认构造函数
私密int I=11; 公共int value () { returni; }
(; //Semicolon required in this case
} publicstaticvoidmain (字符串[ ] args ) )
Parcel7 p=newParcel7(;
Contents c=p.contents (;
}
}///:~
//上面的Parcel7类是下面的Parcel7类的简化
//: inner classes/parcel 7b.Java
//expandedversionofparcel7. Java
打包对象;
公共类面板7b {
classmycontentsimplementscontents {
私密int I=11;
公共int value () { return i; }
}
公共内容内容() { return new MyContents; }
publicstaticvoidmain (字符串[ ] args ) {
Parcel7b p=new Parcel7b (;
Contents c=p.contents (;
}
} ///:~
2 .如果需要具有参数的构造函数,该怎么办? 只需要将适当的参数传递给基类构造函数。 以下,用带参数的构造函数实现了具有具体安装的一般类。 在这里,将x传递给了newWrapping(x )。 wrapping作为公共“接口”被其导出类使用,尽管它是具有具体实现的一般类。
//: inner classes/wrapping.Java
打包对象; 公共类扭曲{私有Inti; 公共扭曲(intx ) I=x; }public int value () { returni; }
//://3360 inner classes/parcel8. Java//callingthebase-class constructor。
打包对象; public class parcel8{ publicwrappingwrapping (intx ) )/baseconstructorcall:}
returnnewwrapping(x ) { //Pass constructor argument. \x值传递给wrapping (intx )构造函数
公共intvalue ((return super.value ) ) * 47; //(这里是Wrapping类中的value ) )方法
}
(; //Semicolon required //这里的分号不是用来标记内部类的结尾,实际上是标记表达式的结尾
} publicstaticvoidmain (字符串[ ] args ) )
Parcel8 p=newParcel8(;
wrappingw=p.wrapping(10;
}
}///:~
在匿名类中定义字段后,也可以将其初始化。 如果定义匿名内部类并使用该外部定义的对象,编译器将在引用该参数时请求final的(jdk1.8中可以不使用final )。
//: inner classes/destination.Java
打包对象; 公共接口目标{
字符串读取标签(;
//://: inner classes/parce L9.Java//ananonymousinnerclassthatperforms//initial ization.abrieferversion
打包对象; 公共类parcel9//argumentmustbefinaltouseinside//anonymous inner类3360
publicdestinationdestination (finalstringdest ) /这里的书写的是final,但是从jdk1.8开始可以不用final。 return newDestination ) )私有发布命令readlabel ((return label; }
(;
} publicstaticvoidmain (字符串[ ] args ) )
Parcel9 p=newParcel9(;
目的地d=p .目的地(' Tasmania ';
}
}///:~
匿名类中不是有构造函数(因为没有名字! 但是,实例初始化提供了为匿名内部类创建构造函数的效果
//: inner classes/anonymous constructor.Java//creatingaconstructorforananonymousinnnerclass。
打包对象; importstaticnet.mindview.util.print.*; 基于abstract class base {公共基(inti ) }
print('baseconstructor,i=' i );
}公共基础语音(;
} publicclassanonymousconstructor { publicstaticbasegetbase (inti ) returnnewbase )//其中基类(abstract ) base的构造函数
{ print (insideinstanceinitializer ); 公共语音() {
打印(inanonymousf ) ) ) );
}
(;
} publicstaticvoidmain (字符串[ ] args ) )
基本=get base (47;
base.f (;
}
(}/*Output:
基本构造器,i=47
Inside实例初始化器
inanonymousf((*///:~
以下是带实例初始化的“parcel”格式
//: inner classes/destination.Java
打包对象; 公共接口目标{
字符串读取标签(;
//:~~//: inner classes/parcel 10.Java//using ' instanceinitialization ' to perform///constructionononanananation
打包对象; 公共类parcel 10 {公共目标}
destination(finalstringdest,final floatprice ) {return newDestination ) ) {private intcost; //instanceinitializationforeachobject :
{
cost=math.round(price; If (成本100 ) )。
system.out.println('overbudget!' );
}private String label=dest; publicstringreadlabel ((返回标签; }
(;
} publicstaticvoidmain (字符串[ ] args ) )
Parcel10 p=newParcel10 (;
目的地d=p .目的地(' Tasmania ',101.395F );
}
(}/*Output:
Over budget! *///:~