初學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
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM