`
kulinglei
  • 浏览: 101848 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 和Groovy的区别

阅读更多
转自
http://tech.it168.com/j/2008-01-22/200801222315988.shtml


【IT168 技术文档】在前几篇文章中,我已经向大家介绍了Groovy是什么,学习Groovy的重要性等内容,还不了解Groovy的朋友不妨去看看我Blog中的 Groovy分类 。下面我将通过Groovy与Java的比较,解开Groovy的神秘面纱。Ready? Start!

  注意:本教程是针对Groovy最新版本编写的

  Groovy和Java的相同点有:

  3+, 4+, 6+, 8+, 10+, 12+, 13, 14, 15, 18+, 20+, 21, 22, 23, 28+, 29+, 30+, 31+, 32+

  +表示Groovy不但涵盖了Java的语法,而且还有增强部分

  Groovy和Java的不 同 点有:

  0, 1, 2, 5, 7, 9, 11, 16, 17, 19, 24, 25, 26, 27

  下面所列序号不分先后顺序:

  0. 在Groovy可以用def定义无类型的变量(定义变量方面def与JavaScript中的var相似),和返回值为无类型的方法,而在Java中没有def

  Groovy:

  class Man {
  def name = "山风小子"
  def introduce() {
  return "I'm $name" // return可以省略

  }
  }

  1. Java中的equals方法对应Groovy中的== , 而Java中的==(判断是否引用同一对象)对应Groovy中的is方法

  eg.

  Test1.java :

  public class Test {
  public static void main(String[] args) {
  String name1 = "山风小子";
  String name2 = new String("山风小子");
  // Groovy中写为 name1 == name2

  if (name1.equals(name2)) {
  System.out.println("equal");
  } else {
  System.out.println("not equal");
  }
  // Groovy中写为 name1.is(name2)

  if (name1 == name2) {
  System.out.println("identical");
  } else {
  System.out.println("not identical");
  }
  }

  与Test1.java相对应的

  Test1.groovy :

  String name1 = "山风小子" // 你也可以这样写: def name1 = "山风小子" 其中的def可以理解为JavaScript中定义变量的var

  String name2 = new String("山风小子") //请注意Groovy的句尾的分号时可选的,即可要可不要,前提是一行代码一条语句
  // Java中写为 name1.equals(name2)

  if (name1 == name2) {
  System.out.println("equal");
  } else {
  System.out.println("not equal");
  }
  // Java中写为 name1 == name2

  if (name1.is(name2)) {
  System.out.println("identical");
  } else {
  System.out.println("not identical");
  }

  2. Java中的数组定义int[] a = {1, 2, 3}; 在Groovy写成int[] a = [1, 2, 3]

  3. Java中的for循环for (int i = 0; i < len; i++) {...} 在Groovy中还可以写成for (i in 0..len-1) {...} 或者 for (i in 0..

  Java:

  for (int i =0; i < len; i++) {
  // do something

  }
  Groovy:
  for (int i =0; i < len; i++) {
  // do something

  }
  // 或者

  for (i in 0..len-1) {
  // do something

  }
  // 或者

  for (i in 0..
  // do something

  }

  4. Java中的方法返回写为return; 或者return obj; 在Groovy的方法中return是可选的

  Java:

  public String sayHello() {
  return "Hello, 山风小子";
  }

  Groovy:

  public String sayHello() {
  return "Hello, 山风小子"
  }
  //或者

  public String sayHello() {
  "Hello, 山风小子"
  }
  //或者

  String sayHello() {
  "Hello, 山风小子"
  }
  //或者

  public sayHello() {
  "Hello, 山风小子"
  }
  // 或者

  def sayHello() {
  "Hello, 山风小子"
  }

  5. Java中的inner class即内部类,在Groovy中用Closure实现(Closure是Java7正在考虑的一个特性,比inner class在语义方面更完善)

  6. Groovy中的注释比Java多了首行注释#!,其他与Java相同比如单行注释:// 多行注释:/* */ 或者是 支持javadoc的/** */

  Java:

  /*
  * 多行注释
  */
  /**
  * javadoc 注释
  */
  // 单行注释

  Groovy:
  #! 首行注释,使Unix shell能够定位Groovy启动程序以运行Groovy代码,例如
  #!/usr/bin/groovy
  /*
  * 多行注释
  */
  /**
  * javadoc 注释
  */
  // 单行注释



  7. Java5中的for-each:for (Type t : iteratable) {...} 在Groovy中,for (t in iteratable) {...}
  Java:

  for (Type t : iterable) {
  // do something

  }
  Groovy:
  for (t in iterable) {
  // do something

  }


  8. Groovy中switch语句与Java中相同,不过支持更多类型了,比如String

  9. Groovy的while语句跟Java相同,但废弃了do-while (考虑到语义方面的问题,而且do-while可以用其他形式的循环语句代替,使用频率低)

  10. Java中的String常量表示为"Hello, 山风小子",在Groovy中可如下表示

  // 双引号

  "Hello, 山风小子"
  // 单引号也可以

  'Hello, 山风小子'
  //多行字符串

  """Hello,

  山风小子"""

  //或者

  '''Hello,

  山风小子
  '''

  // 替代字符串

  def name = "山风小子"
  "Hello, ${name}"
  //或者

  "Hello, $name"

  11.在Groovy中定义类,定义方法与Java中定义类相同,唯一区别在于Groovy中类,属性以及方法默认都是public的,而在Java中默认是package的,另外,在Groovy中可以用def来定义方法,请看注释。

  Java:

  public class Hello {
  private String name = "山风小子";
  public void sayHello() {
  System.out.println("Hello, " + name);
  }
  }

  Groovy:

  class Hello {
  private String name = "山风小子"
  public void sayHello() {
  //println与Java中System.out.println()相同

  println "Hello, $name"
  }
  /* sayHello也可以这样定义
  def sayHello() {
  println "Hello, $name"
  }
  */
  }

  12.对象创建在Java写为Thought t = new Thought(); 在Groovy也可以这样写,不过还多了种写法:def t = new Thought();

  13.静态方法调用在Java和Groovy中相同,即ClassName.staticMethodName();

  14.实现接口和继承父类方面Groovy也与Java完全相同,即实现接口class ClassName implements InterfaceName {...}

  继承父类:class ClassName extends SuperClass {...}

  15.定义接口方面Groovy与Java完全相同,即interface InterfaceName {...} //在Groovy中默认为public的

  16.正则表达式常量在Java中没有,在Groovy中表示为 /pattern/

  17.Hash常量(类型为java.util.HashMap)在Java没有,在Groovy中表示为 def frequence = ["the": 5, "hello": 2, "world": 2]

  18.类变量即static变量,Groovy与Java相同,static String name = "山风小子",在Groovy也可写为static name = "山风小子"

  19.在varargs方法方面,Groovy与Java稍有区别,如下所示:

  Java:

  // Java:

  public void varargsMethod(Type args) {
  //do something

  }

  Groovy:

  def varargsMethod(Type[] args) {
  //do something

  }

  20.引用当前对象,Groovy和Java相同,在Java中用this表示,在Groovy中也用this表示,而且在Groovy中,this可以出现在static范围中,指向所在类的类对象,本例中,this等同于ThisInStaticScope.class(Java写法)或ThisInStaticScope(Groovy写法)

  class ThisInStaticScope {
  static {
  println this
  }
  // 请不要诧异,参数类型可以省略。如果方法声明中有修饰关键字比如public,synchronized,static等,则返回值类型可以省略。

  static main(args) {
  println this
  }
  }

  21.子类中调用父类方法,Groovy和Java也相同,在Java中 super.methodName() ,在Groovy中 super.methodName()

  22.命名空间的定义,Groovy和Java相同,在Java中 package edu.ecust.bluesun; 在Groovy中 package edu.ecust.bluesun (分号可省略)

  23.在导入类方面,Groovy和Java相同,在Java中 import edu.ecust.bluesun.GroovyTest; 在Groovy中 import edu.ecust.bluesun.GroovyTest

  24.List常量(类型为java.util.ArrayList)在Java中没有, 在Groovy中表示为 def list = [3, 11, "Hello", "山风小子", "!"]

  25.在异常处理方面,Groovy与Java相同,除了不强制程序员捕获检查异常(checked exception)外 (这跟C#很像,如果我没记错的话

  并且在方法声明时,也可以不写throws语句。

  26.方法的默认参数,Java中没有,Groovy中表示如下:

  class Hello {
  //如果没有参数传入,默认打印出 Hello, 山风小子

  def greet(name="山风小子") {
  println("Hello, $name") //也可省略括号()

  }
  }

  27.在Groovy中,语句如果单独占一行的话,句尾的分号(;)可以省略,而在Java中每条语句后面必须跟有分号(;)

  28.在Groovy中,如果不是Boolean或boolean类型,非null或非空(空字符串,[],[:])为true,null为false,而Java中对象不可以表示true或false;如果是Boolean或boolean类型,与Java中的一样。

  29.在Groovy中,万事万物都是对象!而Java中不是这样,基本类型(primitive type)就不是对象。

  30.在Java中,Class对象表示为ClassName.class,而在Groovy中,可以直接用ClassName表示Class对象

  31.Groovy会自动导入java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, java.math.BigDecimal, groovy.lang.*, groovy.util.*,而Java则只自动导入java.lang.*

  32.Groovy不仅有? :三元操作符,还有?:两元操作符,但Java只有? :三元操作符。

  Groovy:

  def a = null;
  // 如果a为“空”(null,空串"",[],[:]),那么结果为?:之后的那个值; 如果不为“空”,那么结果就是a

  def result = a ?: "default result"
  println result
  a = "山风小子"
  result = a ?: "default result"
  println result

  由上可知,Groovy几乎完全兼容Java的语法,难怪‘江南白衣’称Groovy是Java的‘私生子’;但由于Groovy不仅借鉴了Java 95%以上的特性,而且还借鉴了许多卓越的动态语言,比如Python, Ruby等,使Groovy成为极其高效敏捷的编程语言,而不仅仅是Java的副本。所以其实Java++可以作为Groovy的别名,即具有动态特性的Java。

  最后,我想补充一句:Groovy的特性远不至所列的这些,比如还有Mixins,builder系列:MarkupBuilder,SwingBuilder等,很多都是Groovy中有而Java中没有,因此就不一一列举了,想继续深入学习Groovy,可访问Groovy官方网站:http://groovy.codehaus.org ,里面有很多例子和教程供大家参阅,也可以参考在下的Groovy高效编程系列(其中一些是在下的笔记)。网上也有《Groovy In Action》电子书下载,大家不妨搜一下。

1
分享到:
评论

相关推荐

    Java调用Groovy,实时动态加载数据库groovy脚本

    本文将详细讲解如何在Java应用程序中调用Groovy脚本,实现从MongoDB数据库中读取并实时运行Groovy脚本,以及其背后的原理和优势。 首先,Groovy是一种与Java高度兼容的脚本语言,它可以无缝地与Java代码集成,共享...

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    SpringBoot-Gradle-Maven-Java-Groovy

    SpringBoot、Gradle、Maven、Java和Groovy是Java生态系统中的重要组成部分,它们在现代软件开发中扮演着至关重要的角色。这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是...

    Java中使用Groovy的三种方式

    本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...

    [Groovy] Making Java Groovy 英文版

    Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...

    Java调用Groovy

    这篇博客文章“Java调用Groovy”可能会探讨如何在Java代码中执行Groovy脚本,以及这样做的优势和实践方法。 首先,Java可以通过`GroovyShell`或`GroovyScriptEngine`来执行Groovy脚本。`GroovyShell`是Groovy提供的...

    Java整合Groovy脚本笔记

    Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合...

    java与groovy互相调用1

    在Java和Groovy这两种语言中,互相调用代码是相当便捷的,因为它们可以无缝集成。Groovy是一种基于Java平台的脚本语言,它与Java有很高的互操作性,这使得开发者可以在同一个项目中混合使用Java和Groovy,充分利用...

    java、groovy、C#、Javascript性能比较

    java、groovy、C#、Javascript的运行效率到底如何? 通过实验比较,Javascript的运行效率解决java,看来基于javascript的html5前途远大。 C#的Release版的运行性能也相当高,和C++相差不大,值得推荐。 文件内部...

    hugo110-java_run_groovy-master_java_

    综上所述,这个项目可能是为了帮助开发者理解和实践如何在Java项目中集成和运行Groovy,以便更好地利用Groovy的动态性和简洁性,同时为实现定时任务和动态代码执行场景做准备。通过学习和实践这个项目,你可以掌握...

    Java Groovy

    - **代码互操作性**:Groovy和Java之间可以直接相互调用方法和构造器,这种无缝的互操作性为项目带来了极大的灵活性。 - **迁移路径**:对于希望逐步迁移到Groovy的项目,可以从引入简单的Groovy脚本开始,逐渐扩大...

    java 动态脚本语言 精通 Groovy

    5. **GDK (Groovy Development Kit)**:Groovy为Java集合、字符串和其他基本类型提供了丰富的扩展方法,称为Groovy Development Kit。这些方法使得操作数据更加便捷,例如: ```groovy def list = [1, 2, 3] list...

    Making Java Groovy源码

    Making Java Groovy Kenneth A. Kousen 1.Easier Java 2.Closures, builders, and metaprogramming 3.Gradle for builds, Spock for testing 4.Groovy frameworks like Grails and Griffon 源码

    Groovy+Java混合使用例子

    Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx

    干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc

    Jenkins Pipeline 调用 shell、python、java、groovy 脚本的正确使用姿势 Jenkins Pipeline 是一个强大的自动化工具,可以帮助开发者自动化构建、测试和部署流程。在设计 Pipeline 脚本的过程中,经常会遇到调用...

    java_groovy_python集合

    在IT行业中,掌握多种编程语言是非常重要的,尤其是像Java、Groovy和Python这样的流行语言。这些语言各有特点,广泛应用于不同的领域。以下是对标题、描述和标签所提及的知识点的详细解析: 标题“java_groovy_...

    Making Java Groovy--Kenneth.A.Kousen

    Making Java Groovy--Kenneth.A.Kousen. Java Groovy 很不错的学习资料

    JGSK, Java,Groovy,Scala,Kotlin 四种语言的特点对比.zip

    Java、Groovy、Scala和Kotlin是四种在Java平台上广泛使用的编程语言,它们各自具有独特的特点和优势。这里我们将深入探讨这四种语言的核心特性,并对比它们在实际开发中的应用。 首先,Java作为最古老的成员,自...

    Spock是适合Java和Groovy应用程序的一个测试框架

    Spock 是一个强大的测试框架,尤其适用于Java和Groovy开发者,它为这两种语言的应用程序提供了高效、简洁且富有表达力的测试解决方案。Spock的核心设计理念是通过声明式的方式来编写测试,使得测试代码更加易读、...

    groovy programming(2006.12).pdf

    《Groovy编程:Java开发者的入门指南》是Kenneth Barclay和John Savage为Java开发者编写的关于Groovy语言的详细介绍。此书首次出版于2006年,由Morgan Kaufmann Publishers出版,该出版社隶属于Elsevier集团。本书...

Global site tag (gtag.js) - Google Analytics