初学Scala和 Java的一些区别

初学scala,和java存在很多不一致,有很多奇葩的语法,在日常使用中,可能自己不会这么写,但是很多存在于源码中,看源码的时候,经常看的一脸懵逼,因此在此总结部门差异点,部分。

文件名

  1. java要求文件名和公共类名必须要求一致,scala不要求。

java: test.java -> public class test{}
scala: test.scala -> class xxx(任意){}

关键字

  1. scala 中没有public关键字,默认访问权限就是public
  2. scala中没有void关键字,因为scala是完全面向对象的语言,所以采用特殊的对象来模拟:Unit
def main(args:Array[String]):Unit ={
}

方法和函数

scala中对函数和方法的联系和区别:

Scala 有函数和方法,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。

我们可以在任何地方定义函数,甚至可以在函数内定义函数(内嵌函数)。更重要的一点是 Scala 函数名可以有以下特殊字符:+, ++, ~, &,-, – , , /, : 等

  1. 方法定义的参数顺序不同,scala把参数类型放在之后

java中定义方法规则

public String test(String param){

}

? scala中定义方法规则

def test(param:String):String = {

}
  1. scala的方法里面也可以声明方法
object test{
  def main(args:Array[String]):Unit = {
    def test(): Unit={

    }
  }
}
  1. java中包含方法重载,scala中同一作用域不能有同名函数,即使函数参数不一致
object Test {
  def main(arg: Array[String]): Unit = {

    def test():Unit={
    }

    // 会报错,不允许通过
    def test(s:String):Unit={
    }
  }

4.传递多参数的时候,java用 ... scala使用*

public test(String args...){

}
def test(args:String*):Unit={

}

5.scala 在函数定义时,可以给定默认参数。

def test(param1:String = "morenzhi"):Unit={

} 

但是默认参数推荐放参数列表后面,否则需要确保后面的无默认值参数从左到右能匹配到,

另外可以使用带名参数传递参数

//声明  默认值在前
def test1(param1:String = "t1",param2:String):Unit={

}
//调用   带名参数
test1(param2="t2")
//从左到右都给了参数
test1("t1","t2")

异常

java的异常和scala的异常大体相同,catch的实现有些小区别

java异常:

try{

}catch(RuntimeException e){

}catch(Exception e){

}finally{

}

scala的异常:

try{

}catch{
  case e:RuntimeException
  case e:Exception =>
}

类和对象

  1. scala类的定义和java一致,在属性初始化的时候有些区别

    java的属性初始化时,若不指定初始值,jvm会补充上

    scala初始化用 _ 代替,注意是var变量

    var str:String = _
    var num:Int = _
  2. scala和java的包声明方式默认方式一致,但是有其他使用方式
    • 在同一个源码文件中,可以多次声明。声明的类在最后的那个包中

      java:

      package com.lucky.test
      package test  //会出问题

    ? scala: 即源码中的类所在位置不需要和包路径相同

    package com.lucky
    package test
    class Emp{
    }
    //最终会组合,其中的Emp会在   com.lucky.test  中
    • scala中的所有语法都可以进行嵌套,package也可以嵌套.

      如果有{} ,那么{}中声明的类在这个包中,之外的不在这个包中

      package test1{
        package test2{
      
        }
      }
    • scala中可以声明父包和子包,父包中的类,子类可以直接访问,不需要引入,和作用域一致
      package test1{
        class Emp{
      
        }
        package test2{
          object User{
            def main(arg: Array[String]): Unit = {
              //可以访问
                 val emp = new Emp
            }
          }
        }
      }
    • package中可以声明类,但是不能声明变量和函数(方法)

      但是scala为了弥补包的不足,加入了包对象概念

      package test1{
        package object Emp{
          val username = "object"
        }
        package test2{
          object User{
            def main(arg: Array[String]): Unit = {
              //可以访问
                 println(Emp.username)
            }
          }
        }
      }
  3. import

    scala也使用import导入类,但也有些区别,在scala中

    • import可以在任意地方使用
    • 导入一个包中所有的类,采用下划线
      //java
      import java.lang.*
      //scala
      import java.lang._
    • 导入同一个包中部分类,用{}和, 组合
      //java
      import java.util.ArrayList
      import java.util.HashMap
      //scala
      import java.util.{ArrayList,HashMap}
    • import隐藏指定的类
      //隐藏方式  {类名=>_}
      import java.util.{Date=>_}
    • import 可以导
      import java.util

原文地址:https://www.cnblogs.com/valjeanshaw/p/12441928.html

时间: 2024-08-09 18:28:11

初学Scala和 Java的一些区别的相关文章

scala与java的区别

(1)scala与java都有7中数值类型:int.short.long.byte.float.double.boolean这7种,但是scala中这7种值类型是类,在java中属于基本类型,java中,数据类型分成基本类型和引用类型,scala中不区分.(2)scala中的变量或函数的类型总是写在变量或者函数名的后面(3)scala中的操作符与java中的操作符没有什么不同,但是在scala中,操作符是方法,在java中操作符不是方法,且在scala中,除了字母数字之外的其他特殊字符也可以作为

scala与java之间的那些事

scala与java之间的关系,我认为可以用一句话来开头:scala来源于java,但又高于java. scala的设计者Martin Odersky就是一个JAVA控,这位牛人设计了javac和编写了jdk中的通用代码.可以说java语言本身就是Martin Odersky一步一步看着长大的.所以scala可以说打根起就和JAVA有着远远悠长的血缘关系. Martin Odersky还在写java那会,就立志开发达成一个目标:让写程序这样一个基础工作变得高效.简单.且令人愉悦!因此可以说sca

java 堆栈的区别

java有两种内存管理:堆 和 栈. 栈中保存的是基本数据类型(如:int.short.char.long等)与对象句柄. 栈中保存的内存在变量超出作用域后会被自动释放. 栈的存取速度比堆快,数据可以共享,但是不灵活. 举个例子: int i = 5: int j = 5; String s1 = "abc"; String s2 = "abc"; 其中 i 和 j ,s1 和 s2在栈中保存的数据是共享的.也就是说改变过其中一个变量的值,另外一个变量的值也会被相应

Spark:用Scala和Java实现WordCount

为了在IDEA中编写scala,今天安装配置学习了IDEA集成开发环境.IDEA确实很优秀,学会之后,用起来很顺手.关于如何搭建scala和IDEA开发环境,请看文末的参考资料. 用Scala和Java实现WordCount,其中Java实现的JavaWordCount是spark自带的例子($SPARK_HOME/examples/src/main/java/org/apache/spark/examples/JavaWordCount.java) 1.环境 OS:Red Hat Enterp

Scala入门到精通——第二十八节 Scala与JAVA互操作

本节主要内容 JAVA中调用Scala类 Scala中调用JAVA类 Scala类型参数与JAVA泛型互操作 Scala与Java间的异常处理互操作 1. JAVA中调用Scala类 Java可以直接操作纵Scala类,如同Scala直接使用Java中的类一样,例如: //在Person.scala文件中定义Scala语法的Person类 package cn.scala.xtwy.scalaToJava class Person(val name:String,val age:Int) //伴

Android Dalvik虚拟机简述(与Java虚拟机的区别和简要的执行原理)

先一睹Dalvik虚拟机在Android系统框架图中位置: 文章目录: 一.虚拟机简述二.Java虚拟机简述三.Dalvik虚拟机简述四.Dalvik虚拟机与Java虚拟机的区别五.Dalvik虚拟机执行原理简述 此文章原始是PPT格式已转换为PDF,请直接下载文档阅读: AndroidDalvikVMOverview

[C++/Java] C++ 和 Java多态的区别

C++ 和 Java多态的区别 一.覆盖base当中的基类的virtual方法,编译时确定 二.维护一张类的继承体系表,运行时动态查找 [1] http://blog.csdn.net/chosen0ne/article/details/10350305

Scala与Java交互

Scala的一个强项在于可以很简单的于已有的Java代码交互,所有java.lang中的类都已经被自动导入了,而其他的类需要显式声明导入.来看看演示代码吧.我们希望对日期进行格式化处理,比如说用法国的格式.Java类库定义了一系列很有用的类,比如Date和DateFormat.由于Scala于Java能够进行很好的交互,我们不需要在Scala类库中实现等效的代码,而只需直接吧Java的相关类导入就可以了:import java.util.{Date, Locale}import java.tex

编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]

编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本] 1. 开发环境 Jdk 1.7.0_72 Maven 3.2.1 Scala 2.10.6 Spark 1.6.2 Hadoop 2.6.4 IntelliJ IDEA 2016.1.1 2. 创建项目1) 新建Maven项目 2) 在pom文件中导入依赖pom.xml文件内容如下: <?xml version="1.0" encoding="UTF-8"?> &l