仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 441|回复: 9
打印 上一主题 下一主题

[学习教程] JAVA网站制作之J2SE5.0 实例---泛型

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
唉!都是钱闹的1.Swing和.net开发比较------从市场份额看.net开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具j2se泛型简介


泛型实在并非一种新的言语元素,C++中早就就有,可是在C++以后的java却没有吸取这个特征,如今Java也有了泛型的特征,也许也和.Net的合作有干系吧。

起首看泛型的一个使用。

在已往,我们大概常常要写一些相似如许的代码:

ListstringList=newLinkedList();

stringList.add("firstString");

stringList.add("secondString");

Stringstr=(String)stringList.iterator().next();



实践上第三行对String的范例转换意义其实不年夜,由于一般我们假如在操纵一个List,都是晓得这个List内里放的是甚么范例对象的,可是我们假如不如许写又通不外语法反省。

使用java的泛型机制,我们能够这么写:

List<String>stringList=newLinkedList<String>();

stringList.add("firstString");

stringList.add("secondString");

Stringstr=stringList.iterator().next();

如许做的优点是在界说容器的时分就指了然容器中的范例,一方面我们不再必要取一个元素时分做强迫范例转换,别的一方面假如在这个容器中放进的对象范例不切合请求,那末会在编译时分发生一个毛病,而不是在运转时分才抛出一个非常。

别的如许也进步了程序的可读性。
泛型范例的界说
上面是一个复杂的利用泛型类的界说:

publicclassMyGenericClass<T>{

privateTvalue;





publicTgetValue(){

returnvalue;

}



publicvoidsetValue(Tvalue){

this.value=value;

}

}

值得注重的一点是,静态变量不克不及够利用泛型界说,也就是说相似上面的语句长短法的:



publicclassMyGenericClass<T>{

publicstaticTvalue;//毛病的界说

}

别的,泛型的界说不会被承继,举个例子来讲,假如A是B的子类,而C是一个声了然泛型界说的范例的话,C<A>不是C<B>的子类。为了更好的申明,能够看上面的代码,这段代码是毛病的。

List<String>strList=newArrayList<String>();

List<Object>objList=strList;//毛病的赋值



不外如许一段代码是准确的:

List<Object>strList=newArrayList<Object>();

strList.add("jsdkfjsdl");
统配范例
假定我们必要如许一个函数,利用它能够把一个汇合中一切的元素打印出来,在之前我们大概如许界说:

voidprintCollection(Collectionc){

Iteratori=c.iterator();

for(k=0;k<c.size();k++)

{

System.out.println(i.next());

}

}

利用新的泛型特征我们大概会如许写:

voidprintCollection(Collection<Object>c)

{

for(Objecte:c)

{

System.out.println(e);

}

}

可是如许有一个成绩,假设我们如今有个对象范例是Collection<String>,那末我们不克不及够将它作为参数传给printCollection,由于Collection<String>并非Collection<Object>的子类。

为懂得决这个成绩,我们可使用统配范例?,也就是界说成上面这个模样:

voidprintCollection(Collection<?>c)

{

for(Objecte:c)

{

System.out.println(e);

}

}

能够说Collection<?>是一切Collection的父类。

再来看一段上面的代码

privatevoidclearAllMaps(Collection<Map>c)

{

for(Mapm:c)

{

m.clear();

}

}

毫无疑问,它也存在下面我们所说的成绩,也就是对HashMap之类Map的子类没法举行操纵,可是假如我们将参数改成Collection<?>又不年夜公道,由于我们只但愿对父类为Map的子类举行操纵,那末我们能够如许改写:

privatevoidclearAllMaps(Collection<?extendsMap>c)

{

for(Mapm:c)

{

m.clear();

}

}

相似于?extendsMap之类的统配符称为限制统配范例。

假定一个对象h范例为Collection<HashMap>,那末我们将h作为参数传给clearAllMaps,以下面一段代码所示:

List<HashMap<String,String>>h=newArrayList<HashMap<String,String>>();

HashMap<String,String>m=newHashMap<String,String>();

m.put("key","value");

h.add(m);

clearAllMaps(h);

关于在相似于下面所说,利用了?extendXXX的办法,值得注重的一点是不克不及够在办法体内用XXX的子类对象作为取代。以下面一段代码是毛病的:

publicvoidaddRectangle(List<?extendsShape>shapes)

{

shapes.add(0,newRectangle());//毛病用法!

}

这里我们假定Rectangle是Shape的一个子类。

不同意如许写的缘故原由对照复杂,由于挪用该办法时分参数范例多是Shape的别的一个子类。假设说Shape除Rectangle这个子类之外另有别的一个子类Circle,那末我们能够把一个List<Circle>范例的对象作为参数传给这个办法(注重如许是正当的),而在办法体内却把一个Rectangle对象放到了shapes内里,这明显是分歧理的。

除extends,在泛型参数范例中还可使用super关头字,参照上面一段程序:

privatevoidaddString(Collection<?superString>c)

{

c.add("aString");

}


泛型函数
我们在后面提到了统配范例,如今让我们来假想一个函数,它完成如许的功效,将一个数组中的元素增加到一个Collection中,为了包管程序的通用性,我们大概会写出别的一段毛病的代码:

privatevoidfromArrayToCollection(Object[]a,Collection<?>c)

{

for(Objecto:a)

{

c.add(o);//毛病的代码

}

}

那末这个函数应当怎样写呢?我们能够经由过程对函数增加泛型参数的办法完成,以下面所示:

private<T>voidexfromArrayToCollection(T[]a,Collection<T>c)

{

for(To:a)

{

c.add(o);//如许是准确的

}

}





那末,在甚么时分我们应当利用统配范例,甚么时分我们应当利用泛型函数呢?谜底是取决于函数参数之间,函数参数和前往值之间的范例依附性。

假如一个函数的参数范例与函数前往的参数没有一定联系关系,同时关于该函数其他的参数的范例也没有依附干系,那末我们就应当利用统配符,不然就应当利用泛型函数。

为了更分明地申明这一点,我们能够看一下java.util包中Collections范例几个办法的界说:

classCollections{

staticvoidswap(List<?>list,inti,intj){...}

static<T>voidcopy(List<?superT>dest,List<?extendsT>src){...}

}

个中swap函数实践上也能够如许界说:

static<T>voidswap(List<T>list,inti,intj){...}

可是注重到这里泛型范例参数T只在参数顶用到了一次,也就是说它和函数其他部分没有依附性,这能够看做是我们应当利用?的一个标记。

copy办法中,拷贝源src中的元素必需是dest所可以承受的,src中的元素必需是T的一个子类,可是详细它是哪一种子类我们又不用体贴,以是办法中利用了泛型作为一个范例参数,同时也用了统配范例作为第二范例参数

你希望java的IDE整合。这个是没有必要的,重要的是你理解java有多深以及怎么组织你的代码,即使没有IDE,代码照样能够编译运行的。
简单生活 该用户已被删除
沙发
发表于 2015-1-20 22:07:19 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.ckuyun.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
蒙在股里 该用户已被删除
板凳
发表于 2015-1-30 06:39:42 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
小女巫 该用户已被删除
地板
发表于 2015-2-6 07:45:49 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
分手快乐 该用户已被删除
5#
发表于 2015-2-6 16:21:12 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
活着的死人 该用户已被删除
6#
发表于 2015-2-17 04:09:33 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
谁可相欹 该用户已被删除
7#
发表于 2015-2-23 07:54:53 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
小妖女 该用户已被删除
8#
发表于 2015-3-7 05:53:05 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
爱飞 该用户已被删除
9#
发表于 2015-3-14 11:52:12 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
第二个灵魂 该用户已被删除
10#
发表于 2015-3-21 05:20:23 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 15:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表