zoukankan      html  css  js  c++  java
  • 初学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
        
  • 相关阅读:
    项目中常用的图片处理方案小结
    Unity2D实现人物三连击
    使用mescroll实现上拉加载与下拉刷新
    iOS中文输入法多次触发的问题及解决方案
    使用WebStorm将项目部署到IIS
    在Less中使用条件判断
    Vue+原生App混合开发手记#1
    在Vue中使用layer.js弹出层插件
    局域网简单的SVN服务器的搭建
    在iOS中实现sticky header
  • 原文地址:https://www.cnblogs.com/valjeanshaw/p/12441928.html
Copyright © 2011-2022 走看看