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,一经查实,立即删除!

相关文章

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课程设计-彩票购买抽奖程序

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

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

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

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

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

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

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

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

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

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

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

php模板意思,php中的 是什么意思

php调用类的内部静态成员,或者是类之间调用就要用两个冒号(::)。说明:“::”符号可以认为是与C语言中的“.”相似的,而它更像C中(Perl)的::类范围操作符。示例:{$0;(){//}(){();$;}};/*C语言中的*/a::b::c();//C中的函数$a::b::c;…

程序员为什么老得快_这段 Python 代码让程序员赚 300W,公司已确认!网友:神操作!...

点击上方“Python大本营”,选择“置顶公众号”python大本营 IT人的职业提升平台Python到底还能给人多少惊喜?笔者最近看到了这两天关于Python最热门的话题,关于《地产大佬潘石屹学Python的原因》,结果被这个回答惊到了&#xff1…

Mercedes-Benz won’t start| Step by Step Troubleshooting Guide

Mercedes won’t start or turn over? Are you experiencing Mercedes-Benz no start problems? Key won’t turn at all? Engine turning over but the car will not start? Maybe it finally starts, runs for a few seconds and then dies. These are common Mercedes-…

php如何设置页面布局,excel页面布局怎么调整

excel页面布局调整的方法:首先点击菜单的页面布局,选择纸张大小;然后点击“纸张方向”,单击以选择横向或者纵向;最后点击“页边距”即可。点击菜单——页面布局,工具栏将出现页面布局的许多项目&#xff0c…

无法获取未定义或 null 引用的属性“value”_SpringBoot之Spring@Value属性注入使用详解

在使用Spring框架的项目中,Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性。在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下Value的使用方法。Value注入支持形式Value属性注入功…

0x11 栈

【例题】Push,Pop,GetMin 手写一个栈 1 #include <iostream>2 #include <cstdio>3 #include <cmath>4 #include <cstring>5 #include <algorithm>6 #include <queue>7 using namespace std;8 const int maxn1000000;9 int stack[maxn], m[…

java 同类型转换失败,你们见过java类型转换,自己转自己失败的情况吗?很神奇的操作...

问题就是上面这个问题。List slaughterProducts slaughterForm.getSlaughterProductModelForm();for (SlaughterProductModelForm e : slaughterProducts) {....}居然运行到for的时候出现上面这个错误。很神奇吧&#xff0c;工作这么多年了第一次发现 JAVA自己转自己转不成功。…

用户管理与文件权限

一&#xff1a;用户管理 现代操作系统一般属于多用户的操作系统&#xff0c;也就是说&#xff0c;同一台机器可以为多个用户建立账户&#xff0c;一般这些用户都是为普通用户&#xff0c;这些普通用户能同时登录这台计算机&#xff0c;计算机对这些用户分配一定的资源。 普通用…

php中划线,html中下划线、删除线、上划线的样式与用法实例

这篇文章主要介绍了下划线、删除线、上划线等常用的实例&#xff0c;划线是非常常见的一种样式&#xff0c;为了网页中的视觉效果以及对文字的说明&#xff0c;我们经常对文体进行一些划线操作。下面文章就是对各种划线的详细介绍。一. 下划线的详细介绍在我们日常的Web的开发中…

php获取页面中的指定内容,php 获取页面中指定内容的实现类

[email protected]image&#xff1a;Grep.class.php/** grep class* Date: 2013-06-15* Author: fdipzone* Ver: 1.0** Func:** set: 设置内容* get: 返回指定的内容* replace: 返回替换后的内容* get_pattern 根据type返回pattern*/class Grep{ // class startprivate $_patte…

数据增量更新定义_TiDB 在 OPPO 准实时数据仓库中的实践

作者介绍OPPO 数据分析与解决方案团队主要负责 OPPO 全集团的大数据分析和解决方案提供&#xff0c;团队成员多来自一线互联网公司及著名高校&#xff0c;在 OPPO 众多场景的大数据应用方面有很深经验&#xff0c;极大的支撑了业务迅速发展。文章具体作者&#xff1a;羊欢&…

selenium--单选下拉列表

下拉选择 from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("https://www.xxxxx.com/") sleep(2) driver.find_elements_by_tag_name(option)[2].click() # 通过标签名定位到 option 标签&#xff0c;选择第三个&#x…