语言特点指的是什么上有什么特点

Posts - 610, Comments - 29767
每次提到语言的时候我总是忍不住骂Java是一门生产力低下,固步自封的语言——这估计要一直等到Java语言被JVM上的其他语言取代之后吧。JVM上目前已经有许多语言了:JRuby,J还有一些特定于JVM平台的语言,如Scala和Groovy等等。但是,为什么JVM上没有C#语言呢?按理说,这门和Java十分相似,却又强大许多的语言更容易被Java程序员接受才对。您可能会说,Sun和微软是对头,怎么可能将C#移植到JVM平台上呢?嗯,有道理,但是为什么社区里也没有人这么做呢(要知道JVM上其他语言都是由社区发起的)?其实在我看来,这还是受到了技术方面的限制。
泛型是Java和C#语言的重要特性,它使得程序员可以方便地进行类型安全的编程,而不需要像以前那样不断进行类型转换。例如,我们要在Java中写一个泛型字典的封装便可以这么做:
public class DictWrapper {
private HashMap&K, V& m_container = new HashMap&K, V&();
public V get(K key) {
return this.m_container.get(key);
public void put(K key, V value) {
this.m_container.put(key, value);
看上去和C#并没有什么区别,不是吗?不过,如果我们观察编译后生成的bytecode(类似于.NET平台上的IL),便会发现一丝奇妙之处。使用javap -c DictWrapper得到的结果是:
Compiled from &DictWrapper.java&
public class jeffz.practices.DictWrapper extends java.lang.Object{
public jeffz.practices.DictWrapper();
0: aload_0
1: invokespecial #1; //Method java/lang/Object.&&init&&:()V
4: aload_0
5: new #2; //class java/util/HashMap
9: invokespecial #3; //Method java/util/HashMap.&&init&&:()V
12: putfield #4; //Field m_container:Ljava/util/HashM
15: return
public java.lang.Object get(java.lang.Object);
0: aload_0
1: getfield #4; //Field m_container:Ljava/util/HashM
4: aload_1
5: invokevirtual #5; //Method java/util/HashMap.get:(Ljava/lang/O)Ljava/lang/O
8: areturn
public void put(java.lang.Object, java.lang.Object);
0: aload_0
1: getfield #4; //Field m_container:Ljava/util/HashM
4: aload_1
5: aload_2
6: invokevirtual #6; //Method java/util/HashMap.put:(Ljava/lang/OLjava/lang/O)Ljava/lang/O
10: return
从bytecode中可以看出,其中并没有包含任何与K,V有关的信息。get/put方法的参数和返回值都是Object类型,甚至内置的HashMap也是如此。那么调用DictWrapper的代码是如何做到“强类型”的呢?例如:
public static void main(String[] args) {
DictWrapper&String, String& dict = new DictWrapper&String, String&();
dict.put(&Hello&, &World&);
String world = dict.get(&Hello&);
它的bytecode便是:
public static void main(java.lang.String[]);
0: new #2; //class jeffz/practices/DictWrapper
4: invokespecial #3; //Method jeffz/practices/DictWrapper.&&init&&:()V
7: astore_1
8: aload_1
9: ldc #4; //String Hello
11: ldc #5; //String World
13: invokevirtual #6; //Method jeffz/practices/DictWrapper.put:(Ljava/lang/OLjava/lang/O)V
16: aload_1
17: ldc #4; //String Hello
19: invokevirtual #7; //Method jeffz/practices/DictWrapper.get:(Ljava/lang/O)Ljava/lang/O
22: checkcast #8; //class java/lang/String
25: astore_2
26: return
看到标号为22的那行代码没有?这条checkcast指令便是将上一句invokevirtual的结果转化为String类型——DictWrapper.get所返回的是个最普通不过的Object。
这便是Java语言的泛型实现——请注意我这里说的是Java语言,而不是JVM。因为JVM本身并没有“泛型”的概念,Java语言的泛型则完全是编译器的魔法。我们写出的泛型代码,事实上都是和Object对象在打交道,是编译器在帮我们省去了冗余的类型转换代码,以此保证了代码层面的类型安全。由于在运行时去除所有泛型的类型信息,因此这种泛型实现方式叫做。
在.NET中则完全不同,“泛型”是真真切切落实在CLR层面上的功能。例如DictWrapper.Get方法在.NET上的IL代码便是:
.method public hidebysig instance !TValue Get(!TKey key) cil managed
.maxstack 2
.locals init (
[0] !TValue CS$1$0000)
L_0000: nop
L_0001: ldarg.0
L_0002: ldfld class [mscorlib]...Dictionary`2文章语言上有什么特点 该怎么回答
痛心の回忆550
生动,简练,明快,朗朗上口,幽默,字字珠玑,朴实,华丽,等用来说明用词方面的特色;再从整体上说给人的感觉.如:给人一气呵成之感,字里行间充斥着.还可说作者在哪方面活用了什么(典故,词语,诗词等)表达了作者怎样的感情之类的话
为您推荐:
其他类似问题
扫描下载二维码【考点】.【分析】题通过材料考学生的分析、整合写作、表能力.内容定要符合题目的显性和隐要求,使用比喻和的修辞手,形象生动描写民的情景,表现出其不同色.注意语言达要通顺、具体.【解答】考案:我最喜的传统节日是春节每到大年三十,场里来人往,大家都忙着买货.但你知道?年还一美妙神话故事,讲你听吧!,我们过年,吃完饭,就兴采烈地跑爆竹店里多礼花.到晚上,我便迫不及待的拿出花撕开包袋,取出礼花,打机小心翼翼点燃后向天空发射,只听一“啪”,一束美丽的烟花在天空上五彩缤纷好看极.放完礼花后,我依舍的回家了和家人看.【点评】如何好微写作:、巧妙切入,小见大;生动展现,关注细节.声明:本试题解析著作权属菁优网所有,未经书面同意,不得复制发布。答题:马江山老师 难度:0.60真题:1组卷:0
解析质量好中差
&&&&,V2.21591

我要回帖

更多关于 语言的特点有哪些 的文章

 

随机推荐