Java学习资料Word文档下载推荐.docx

上传人:b****5 文档编号:20353377 上传时间:2023-01-22 格式:DOCX 页数:13 大小:19.46KB
下载 相关 举报
Java学习资料Word文档下载推荐.docx_第1页
第1页 / 共13页
Java学习资料Word文档下载推荐.docx_第2页
第2页 / 共13页
Java学习资料Word文档下载推荐.docx_第3页
第3页 / 共13页
Java学习资料Word文档下载推荐.docx_第4页
第4页 / 共13页
Java学习资料Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Java学习资料Word文档下载推荐.docx

《Java学习资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Java学习资料Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

Java学习资料Word文档下载推荐.docx

privateObjectx;

publicObjectFoo(Objectx){

publicObjectgetX(){

publicvoidsetX(Objectx){

写出Demo方法如下:

publicclassObjectFooDemo{

publicstaticvoidmain(Stringargs[]){

ObjectFoostrFoo=newObjectFoo("

HelloGenerics!

"

);

ObjectFoodouFoo=newObjectFoo(newDouble("

33"

));

ObjectFooobjFoo=newObjectFoo(newObject());

System.out.println("

strFoo.getX="

+(String)strFoo.getX());

douFoo.getX="

+(Double)douFoo.getX());

objFoo.getX="

+(Object)objFoo.getX());

运行结果如下:

strFoo.getX=HelloGenerics!

douFoo.getX=33.0

objFoo.getX=java.lang.Object@19821f

解说:

在Java5之前,为了让类有通用性,往往将参数类型、返回类型设置为Object类型,当获取这些返回类型来使用时候,必须将其“强制”转换为原有的类型或者接口,然后才可以调用对象上的方法。

3、Java5泛型来实现

强制类型转换很麻烦,我还要事先知道各个Object具体类型是什么,才能做出正确转换。

否则,要是转换的类型不对,比如将“HelloGenerics!

”字符串强制转换为Double,那么编译的时候不会报错,可是运行的时候就挂了。

那有没有不强制转换的办法----有,改用Java5泛型来实现。

publicclassGenericsFoo<

T>

{

privateTx;

publicGenericsFoo(Tx){

publicTgetX(){

publicvoidsetX(Tx){

publicclassGenericsFooDemo{

publicstaticvoidmain(Stringargs[]){

GenericsFoo<

String>

strFoo=newGenericsFoo<

("

Double>

douFoo=newGenericsFoo<

(newDouble("

Object>

objFoo=newGenericsFoo<

(newObject());

+strFoo.getX());

+douFoo.getX());

+objFoo.getX());

运行结果:

和使用“Object泛型”方式实现结果的完全一样,但是这个Demo简单多了,里面没有强制类型转换信息。

下面解释一下上面泛型类的语法:

使用<

来声明一个类型持有者名称,然后就可以把T当作一个类型代表来声明成员、参数和返回值类型。

当然T仅仅是个名字,这个名字可以自行定义。

classGenericsFoo<

声明了一个泛型类,这个T没有任何限制,实际上相当于Object类型,实际上相当于classGenericsFoo<

TextendsObject>

与Object泛型类相比,使用泛型所定义的类在声明和构造实例的时候,可以使用“<

实际类型>

”来一并指定泛型类型持有者的真实类型。

类如

GenericsFoo<

当然,也可以在构造对象的时候不使用尖括号指定泛型类型的真实类型,但是你在使用该对象的时候,就需要强制转换了。

比如:

GenericsFoodouFoo=newGenericsFoo(newDouble("

实际上,当构造对象时不指定类型信息的时候,默认会使用Object类型,这也是要强制转换的原因。

二、泛型的高级应用

1、限制泛型的可用类型

在上面的例子中,由于没有限制classGenericsFoo<

类型持有者T的范围,实际上这里的限定类型相当于Object,这和“Object泛型”实质是一样的。

限制比如我们要限制T为集合接口类型。

只需要这么做:

TextendsCollection>

,这样类中的泛型T只能是Collection接口的实现类,传入非Collection接口编译会出错。

注意:

<

这里的限定使用关键字extends,后面可以是类也可以是接口。

但这里的extends已经不是继承的含义了,应该理解为T类型是实现Collection接口的类型,或者T是继承了XX类的类型。

下面继续对上面的例子改进,我只要实现了集合接口的类型:

publicclassCollectionGenFoo<

publicCollectionGenFoo(Tx){

实例化的时候可以这么写:

publicclassCollectionGenFooDemo{

CollectionGenFoo<

ArrayList>

listFoo=null;

listFoo=newCollectionGenFoo<

(newArrayList());

//出错了,不让这么干。

// 

Collection>

listFoo=newCollectionGenFoo<

实例化成功!

当前看到的这个写法是可以编译通过,并运行成功。

可是注释掉的两行加上就出错了,因为<

这么定义类型的时候,就限定了构造此类实例的时候T是确定的一个类型,这个类型实现了Collection接口,但是实现Collection接口的类很多很多,如果针对每一种都要写出具体的子类类型,那也太麻烦了,我干脆还不如用Object通用一下。

别急,泛型针对这种情况还有更好的解决方案,那就是“通配符泛型”。

2、通配符泛型

为了解决类型被限制死了不能动态根据实例来确定的缺点,引入了“通配符泛型”,针对上面的例子,使用通配泛型格式为<

?

extendsCollection>

,“?

”代表未知类型,这个类型是实现Collection接口。

那么上面实现的方式可以写为:

//现在不会出错了

listFoo1=null;

1、如果只指定了<

>

,而没有extends,则默认是允许Object及其下的任何Java类了。

也就是任意类。

2、通配符泛型不单可以向下限制,如<

,还可以向上限制,如<

superDouble>

,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。

3、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。

这些都泛型类中泛型的使用规则类似。

三、泛型的综合运用实例(代码参考java参考大全,有改动)

publicclassAvgGen<

TextendsNumber>

publicAvgGen(){

publicdoublegetAvg(T[]arr){

doublesum=0.0;

for(inti=0;

i<

arr.length;

i++){

sum=sum+arr[i].doubleValue();

returnsum/arr.length;

publicstaticvoidmain(String[]args){

//整形数组求均值

整形数组{1,3}求均值:

Integer[]intArr={1,3};

AvgGen<

Integer>

intObj=newAvgGen<

();

doubleintavg=intObj.getAvg(intArr);

System.out.println(intavg);

System.out.println();

//浮点型数组求均值

浮点型数组{1.1f,2.9f}求均值:

Float[] 

fArr={1.1f,2.9f};

Float>

fObj=newAvgGen<

doublefavg=fObj.getAvg(fArr);

System.out.println(favg);

/**

*CreatedbyIntelliJIDEA.

*User:

leizhimin

*Date:

2007-9-18

*Time:

11:

08:

14

*使用通配符泛型参数:

泛型参数是可变的,可在运行时来确定。

*/

publicclassAvgCompGen<

privateT[]arr;

/**

*构造函数

*@paramarr

*/

publicAvgCompGen(T[]arr){

this.arr=arr;

*求数组均值

*@return数组均值

publicdoublegetAvg(){

sum+=arr[i].doubleValue();

*比较数组均值是否相等(使用通配符泛型参数)

*AvgCompGen<

表示可以匹配任意的AvgCompGen对象,有点类似Object

*

*@paramx目标对象

*@return均值是否相等

publicbooleansameAvg(AvgCompGen<

x){

if(getAvg()==x.getAvg())returntrue;

returnfalse;

*主函数:

用来测试

*@paramargs

//创建参数为Integer类型泛型对象

AvgCompGen<

intObj=newAvgCompGen<

(intArr);

intObj的平均值="

+intObj.getAvg());

//创建参数为Double类型泛型对象

Double[]douArr={1.0,3.0};

douObj=newAvgCompGen<

(douArr);

douObj的平均值="

+douObj.getAvg());

//创建参数为Float类型泛型对象

Float[]fltArr={0.8f,3.2f};

fltObj=newAvgCompGen<

(fltArr);

fltObj的平均值="

+fltObj.getAvg());

//两两比较对象的均值是否相等

if(intObj.sameAvg(douObj))

intArr与douArr的值相等,结果为:

+"

intObj的均值="

+intObj.getAvg()+

"

douObj的均值="

+douObj.getAvg());

else

intArr与douArr的值不相等,结果为:

if(intObj.sameAvg(fltObj))

intArr与fltObj的值相等,结果为:

fltObj的均值="

+fltObj.getAvg());

intArr与fltObj的值不相等,结果为:

if(douObj.sameAvg(fltObj))

douObj与fltObj的值相等,结果为:

douObj与fltObj的值不相等,结果为:

16:

09:

37

*三种坐标,用泛型实现坐标打印

publicclassTwoD{

intx,y;

publicTwoD(intx,inty){

this.y=y;

classThreeDextendsTwoD{

intz;

publicThreeD(intx,inty,intz){

super(x,y);

this.z=z;

classFourDextendsThreeD{

intt;

publicFourD(intx,inty,intz,intt){

super(x,y,z);

this.t=t;

*存放泛型坐标的(数据结构)类

classCoords<

TextendsTwoD>

T[]coords;

publicCoords(T[]coords){

this.coords=coords;

*工具类--打印泛型数据

*并给出一个测试方法

classBoundeWildcard{

staticvoidshowXY(Coords<

c){

XYCoordinates:

c.coords.length;

System.out.println(c.coords[i].x+"

+c.coords[i].y);

staticvoidshowXYZ(Coords<

extendsThreeD>

XYZCoord

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 中国风

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1