scala与java的区别_Scala学习笔记及与Java不同之处总结

Scala与Java具有许多相似之处,但又有许多不同。这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变。这里只是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方。下面列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码示例及详细阐述见下文。

Scala中可直接调用Java代码,与Java无缝连接;

语句可以不用“;”结束,且推荐不适用“;”;

变量声明时以var或val开头,可不必指定变量类型,编译器可推断变量类型;

函数可以不定义返回值类型(特殊情况除外);

函数返回值可不用return返回;

无参函数定义及调用时,函数名后可不跟括号;

数组访问下标使用括号,而不用中括号;

元组使用“._n”的方式访问元素,n从1开始;

……。

指定Main函数

在Java中运行程序,只要指定入口的Main函数即可。一个工程中可以有多个Main函数,每个类内都可以定义Main函数。但是与Java不同的是,Scala工程中,只有定义在object中的Main函数才能作为程序入口,下图中定义在class中的Main函数是无法作为程序入口的。

81713721_1

要想程序能够执行,需要如下图所示,将Main函数定义在object中。在Scala中,class同Java中的类一样,但是Scala中没有static类型的类,与此同时,Scala中提供了一种object的定义方式,通过这种方式定义的“类”类似于Java中的static类,使用时不需要new相应的对象,直接使用外面能访问的变量和函数。object中定义的方法也类似于static方法,直接通过object名访问。

81713721_2

变量和字段声明

与Java中定义变量不同,在Scala中变量是通过“var|val 变量名 [: 类型] = 值”这种方式声明和定义的。在声明字段的时候,可以使用编译器自动推断类型,即不用写“ : 类型”,比如

var i : Int = 2;

或直接

var i = 2;1

2

3

var和val的区别是:var声明的变量的值之后还可以改变,而val声明的变量只能在声明时赋值,之后不能改变该变量的值(类似只读变量,但不是常量)。Scala的函数式编程更推荐使用val。

类的定义及不同

如下图所示,在Scala中也是通过class关键字定义类,看起来与Java中类似。在Scala类中默认的访问符是public,如果不明确的写明private或其他访问符,则类里的成员默认都是可以公开访问的。

81713721_3

但是Scala在构造函数方面与Java存在许多不同,Scala类中包括主构造器和附属构造器。Scala中类的主构造器:主构造器直接跟在类名后面,主构造器中的参数会被编译成类的字段;主构造器执行的时候会执行类中的所有不包含在方法体中的语句;如果在主构造器函数的参数中没有用val或者var去声明变量,那此时的变量是private[this]级别的,只能够被类内部访问。Person类的主构造器如下图所示,主构造器中的参数name和age会被作为Person类的两个成员变量,未被包含在任何方法内部的打印语句会作为主构造器中的语句被执行。

81713721_4

由于上图中定义的age没有使用val或var修饰,所以会被作为private类型的成员变量使用,这类变量只能在类内部访问。因此如下图所示,name能在类外部访问,而age不能被外部访问。

81713721_5

以上是主构造器的情况,Scala中还包括一类附属构造器,即除主构造器外的其他构造函数,附属构造器有以下特点:附属构造器是用this来声明的;附属构造器中必须调用主构造或者其它附属构造器。如下图所示为附属构造器的例子。

81713721_6

特别的函数定义

Scala中的函数定义与Java中有所区别,总体来说如下这种方式,返回值类型在参数列表后面通过“: 类型”这种方式指定,然后通过“=”承接函数体。对于无返回值类型的,类型可以写“Unit”(类似Java中的void),对于函数体简单的,“=”后面可直接接语句,不用“{}”。

81713721_7

与Java不同的是,语句块或函数返回值可以不用显示的通过“return”语句返回,一般块的最后一个表达式的值就是函数的返回值。因此上述函数可修改为下面的形式。

81713721_8

同变量声明不需要显示指定类型相同(变量可以推断变量类型),所以函数也可以推断返回类型,因此可以简写成如下所示:

81713721_9

然而,需要注意的是:如果函数使用return返回,那么必须明确指定函数的返回类型;此外如果是递归函数,也需要指定返回类型。下图所示为通过“return”返回的函数,函数定义时没有指定返回类型,编译器报错。

81713721_10

对于函数参数列表为空的,定义时函数名后可以不跟“()”,使用时也可以不跟“()”,如下图所示:

81713721_11

数组及元组的使用

两种数组定义如下图所示,与Java不同的是需要用到Array关键字。同Java中一样,数组长度不可变,数组元素可变。

81713721_12

Scala中数组通过下标对元素访问的方式如下图所示,主要通过2种方式,第一种是通过“arr(i)”这种方式,与Java中不同,Java中主要通过“arr[i]”这种方式访问。这是因为在Scala中,任何操作符都是函数调用的方式进行的。此外还提供了“arr.apply(i)”这种访问方式。

81713721_13

数组赋值和修改可通过下面两种方式进行,第一种适合代码显示赋值和修改,第二种适合程序运行阶段根据条件对特定元素赋值和修改。

81713721_14

对于数组的遍历可通过以下2种方式。其中第一种注意for循环的to也会取到;第二种遍历方式是通过foreach的方式传递匿名函数,如果数组元素需要指定类型,需要用“(item : String)”括号括起来,如果处理代码较复杂,可用“{}”语句块表示。

81713721_15

Scala中元组的定义和元素访问如下所示,定义时直接使用“()”将不同的类型的若干变量或字面值包围起来即可。值得注意的是,对于元组元素通过“._n”的方式进行访问,且n从1开始计数。

81713721_16

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu mysql medium_ubuntu mysql远程连接+phpmyadmin安装

文章目录[隐藏]一、如何让ubuntu上的mysql允许远程连接二、ubuntu如何安装phpmyadmin一、如何让ubuntu上的mysql允许远程连接进入MySQL,执行如下命令:use mysql; GRANT ALL PRIVILEGES ON *.* TO username% IDENTIFIED BY password WITH GRANT OPTION; flush privil…

centos6.5搭建mysql主从_mysql 主从配置,主-》windows,从-》centos6.5

1.虚拟机配置的主从关系。win7 ip地址192.168.52.102,虚拟机ip 192.168.184.128。docs进入主服务器(master)mysql目录下,添加用户,然后执行mysql>create user dba192.168.184.128 identified by 123456 ,然后grant replication…

java 定时关机_「window定时关机命令」电脑定时关机命令,这个方法适用于win7及以下系统 - seo实验室...

window定时关机命令上班族朋友们有没有碰到一种情况:临时需要外出,又不确定是否还要回来,因此办公室的电脑关与不关,小小的纠结了一下。以下方法或者可以帮你化解这个小纠结。定时关机且可以回来时取消(本法适用于 win7及以下系统…

java白色_java-将精灵颜色更改为白色

如果要将精灵中所有形状的颜色更改为白色,则唯一的方法是使用像素着色器并将所有非黑色的片段设置为黑色(我假设黑色在您的游戏中呈现为透明) )到白色.像这样:varying vec4 v_color;varying vec2 v_texCoords;uniform sampler2D u_texture;void main() {vec4 colorv…

彩票模拟选号程序java_java课程设计-彩票购买抽奖程序

彩票抽奖程序[TOC]###可实现功能:允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性。允许注册用户购买彩票:手动选号、随机选号,并允许设置投注数。抽奖功能:要…

java生成word文件带上页码,使用apache poi api创建Word文档时,如何以Y的X格式添加页码?...

Is there any method specified in POI API to get the total number of pages, I am able to add page number in the footer of the document but i am not able to add the total number of pages value.解决方案Page count in Word is dependent of much things like font …

java给你的初步印象_Java之初印象

Java语言的跨平台性:Java语言的编程过程:只要实现了特定平台下的解释器程序(JVM),Java字节码就能通过解释器程序在该平台下运行,这是java跨平台的根本,当前并不是在所有平台下都有相应的Java解释器程序,这也是Java并不是在所有平台下都能运行的原因,它只能在实现了Java解释器程…

java 字符串实例_Java字符串实例

需求1:自己实现trim的方法。需求2: 获取上传文件名 "D:\\20120512\\day12\\Demo1.java"。需求3:将字符串对象中存储的字符反序。 新中国好 -----> 好国中新需求4: 求一个子串在整串中出现的次数 。public cl…

java过滤器场景_java servlet过滤器应用场景

1、统一POST请求中文字符编码的过滤器如何 实现:将每个Servlet共有的代码提取出来。2、禁止浏览器缓存所有动态页面的过滤器如何 实现:response.setDateHeader("Expires",-1);response.setHeader("Cache-Control","no-cache&qu…

java appender_log4j的Appenders配置方法

因为是刚开始使用log4j,很多配置方面的东西都不懂,记录下。下面是我用sts(spring tool suite)新建spring mvc项目的时候,帮我自动生成的一个log4j.xml配置文件。我要说的就是appenders中的配置内容输出方式:org.apache.log4j.cons…

php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解

这次给大家带来Jquery实现跨域异步上传文件步骤详解,Jquery实现跨域异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下。先说明白这个跨域异步上传功能我们借助了Jquery.form插件,它在异步表单方面很有成效&#xff0c…

查看php计划任务,php如何实现定时执行计划任务?

我们在之前的文章中给大家介绍了php计划任务的实现原理,相信对此小伙伴们都理解了php计划任务的原理,那么我们今天继续给大家介绍一下php如何实现定时执行计划任务!一、windows计划任务1、写一个PHP程序,命名为test.php&#xff0…

微信小程序实现登录功能php后台,微信小程序实现登录功能的逻辑整理

为了让大家更好的开发微信小程序,本文主要和大家分享微信小程序登录逻辑整理,希望能帮助到大家。注册/登录小程序端" style"margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; line-height: 1.3em; font-size: 2.1…

php js offset,获取元素的偏移量offset实例详解

问题:如果获取元素距离文档顶部的距离?[javascript] view plain copyvar rect$(#elem)[0].getBoundingClientRect();//获取元素距离文档顶部的距离var toprect.top(window.pageYOffset||document.documentElement.scrollTop)-(document.documentElement.clientTop|…

python文件下载速度 装饰器_python学习笔记之---装饰器

# -*- coding:utf-8 -*-示例1: 最简单的函数,表示调用了两次def myfunc():print ("myfunc() called.")myfunc()myfunc()E:\>py -3 a.pymyfunc() called.myfunc() called.第二步:使用装饰函数在函数执行前和执行后分别附加额外功能示例2: 替换函数(装饰…

php 日期 间隔,PHP实现计算日期间隔天数的方法

这篇文章主要介绍了PHP编程计算日期间隔天数的方法,涉及php日期与时间的转换与运算相关操作技巧,需要的朋友可以参考下刚开始在没有查PHP手册的情况下,用比较老套方法也折腾出来了,代码是这样子实现的:$date_1 date(Y-m-d);$date_2 2012-07-…

Vue02 -- 生命周期

<!DOCTYPE html> <html> <head><title>Vue --- 生命周期</title></head><body><div id"app"><input type"text" name"" v-model"a" placeholder"你的名字"><h1&g…

php 删除上传文件,php实现文件上传、下载和删除的方法

这篇文章主要为大家详细介绍了php文件上传、下载和删除示例,具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下php文件上传、下载和删除示例大体思路如下&#xff0c;具体内容如下一.文件上传1.把上传文件的区域做出来p12.把显示文件的区域做出来p23.提交表单&#…

软件工程详细设计说明书_软件工程导论知识点梳理之简答题

1. 软件危机的表现形式对软件开发成本和进度估计不准确已完成的软件不符合用户需求软件产品质量差&#xff0c;可靠性得不到保证软件产品可维护性差软件成本在计算机总成本中的比例逐渐变大软件开发生产率提高速度比不上计算机应用速度2. 产生软件危机的原因(1)软件是计算机系统…

css中absolute设置问题和如何让div居中

今天设置多个div到页面正中间的时候&#xff0c;在第一层<div class"map">中设置如下&#xff1a; .map{ position&#xff1a;absolute&#xff1b; top:50%; left:50% transform: translate(-50%, -50%); } 该div就移到页面的正中间&#xff0c;达到预定效果…