Scala 学习笔记(2)之类和对象
Scala 的类大抵和 Java 是类似的,简单的例子如下:
class MyClass {
var myField : Int = 0; def this(value : Int) = {
this();
this.myField = value;
} def getMyField() : Int = {
return this.myField;
} def addToMyField(value : Int) {
this.myField += value;
}
}
如果好奇,可以把编译后的代码反编译成Java代码看看:
import scala.reflect.ScalaSignature; @ScalaSignature(bytes="\006\00112A!\001\002\001\013\t9Q*_\"mCN\034(\"A\002\002\017q*W\016\035;z}\r\0011C\001\001\007!\t9!\"D\001\t\025\005I\021!B:dC2\f\027BA\006\t\005\031\te.\037*fM\")Q\002\001C\001\035\0051A(\0338jiz\"\022a\004\t\003!\001i\021A\001\005\b%\001\001\r\021\"\001\024\003\035i\027PR5fY\022,\022\001\006\t\003\017UI!A\006\005\003\007%sG\017C\004\031\001\001\007I\021A\r\002\0275Lh)[3mI~#S-\035\013\0035u\001\"aB\016\n\005qA!\001B+oSRDqAH\f\002\002\003\007A#A\002yIEBa\001\t\001!B\023!\022\001C7z\r&,G\016\032\021\t\0135\001A\021\001\022\025\005=\031\003\"\002\023\"\001\004!\022!\002<bYV,\007\"\002\024\001\t\0039\023AC4fi6Kh)[3mIR\tA\003C\003*\001\021\005!&\001\007bI\022$v.T=GS\026dG\r\006\002\033W!)A\005\013a\001)\001")
public class MyClass
{
private int myField = 0; public int myField() { return this.myField; }
public void myField_$eq(int x$1) { this.myField = x$1; } public int getMyField()
{
return myField();
} public void addToMyField(int value) {
myField_$eq(myField() + value);
} public MyClass()
{
} public MyClass(int value)
{
this();
myField_$eq(value);
}
}
除了ScalaSignature,其他部分再熟悉不过了。只是Scala在语法上稍作了改变,在学习了golang和swift之后,也应该习以为常了吧。
类部分虽然没有太多可说的地方,但是在对象上就有些许不同。Scala 中 object 用于构建 singleton 类型。
object Main {
def sayHi() {
println("Hi!");
}
}
在 Java 进行调用的话,就是
Main.sayHi();
之前在Java中写过Singleton代码的话,很容易猜出来具体的实现。反编译的代码:
import scala.reflect.ScalaSignature; @ScalaSignature(bytes="\006\001e9Q!\001\002\t\002\025\tA!T1j]*\t1!A\004=K6\004H/\037 \004\001A\021aaB\007\002\005\031)\001B\001E\001\023\t!Q*Y5o'\t9!\002\005\002\f\0355\tABC\001\016\003\025\0318-\0317b\023\tyAB\001\004B]f\024VM\032\005\006#\035!\tAE\001\007y%t\027\016\036 \025\003\025AQ\001F\004\005\002U\tQa]1z\021&$\022A\006\t\003\027]I!\001\007\007\003\tUs\027\016\036")
public final class Main
{
public static void sayHi()
{
Main..MODULE$.sayHi();
}
}
实现上来讲,只是多了一个 Main$ 类来实现具体的代码。
有了静态成员,如何添加非静态成员?Scala给出的答案是 Companion Objects,也就是定义同名 class。
object Main {
def sayHi() {
println("Hi!");
}
} class Main {
def sayHelloWorld() {
println("Hello World");
}
}
这样一来,Main既支持静态方式调用,也支持实例化。其实在 Java 中只是一个类,包含了静态成员和非静态成员而已。
public class Main
{
public static void sayHi()
{
Main..MODULE$.sayHi();
} public void sayHelloWorld()
{
Predef..MODULE$.println("Hello World");
}
}
可以考虑一种情况,object 和 class 中都定义了相同名称的成员,结果会如何呢?
object Main {
def sayHi() {
println("Hi!");
}
} class Main {
def sayHelloWorld() {
println("Hello World");
} def sayHi() {
println("non-static hi!")
}
}
编译没有报错,结果是静态成员无法访问了。
error: non-static method sayHi() cannot be referenced from a static context
Main.sayHi();
^
1 error
静态方法被隐藏了,可以通过反编译来验证。
public class Main
{
public void sayHelloWorld()
{
Predef..MODULE$.println("Hello World");
} public void sayHi() {
Predef..MODULE$.println("non-static hi!");
}
}
实际生成的代码中并不包含静态成员。有没有办法访问之前的静态成员呢?可以试试下面的代码:
Main$.MODULE$.sayHi();
当然,以上是Java中调用的情况,在 Scala 中是可以区分两个sayHi的。
object UseInScala {
def main(args: Array[String]) {
Main.sayHi();
var main = new Main();
main.sayHi();
}
}
输出:
> scala UseInScala
Hi!
non-static hi!
从这些方面来看,Scala 的代码是极容易引入到 Java 中的,下一步可能会花些功夫在 Scala 的学习和应用上。
[1]http://tutorials.jenkov.com/scala/singleton-and-companion-objects.html
Scala 学习笔记(2)之类和对象的更多相关文章
- scala 学习笔记十 一 伴生对象
1.介绍 a.所谓伴生对象就是和某个class同名的object, 并且object 必须和class在同一个scala源文件中. b.在scala中,没有像java中的静态类,静态方法和静态成员等, ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- Scala学习笔记及与Java不同之处总结-从Java开发者角度
Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- Scala学习笔记之伴生对象
所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰. 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的 ...
- Scala学习笔记(五):类和对象
对象实例的变量组成了对象的内存映射 public是Scala的默认访问级别 Scala里方法参数的一个重要特征是它们都是val,不是var Scala不能定义静态成员 单例对象(singleton o ...
- 【大数据】Scala学习笔记
第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java 以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...
- Scala学习笔记之:tuple、array、Map
[TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...
- [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Scala学习笔记之二--基本数据类型
前言 本篇主要讲Scala的基本数据类型,更多教程请参考:Scala教程 基本数据类型 Scala一共提供了9中数据类型,Scala的基本数据类型与java中的基本数据类型是一一对应的,这是Scala ...
随机推荐
- 【BZOJ1228】[SDOI2009]E&D(博弈论)
[BZOJ1228][SDOI2009]E&D(博弈论) 题面 BZOJ 洛谷 题解 这种打表找规律的题目真的不知道可以说什么好啊... #include<iostream> #i ...
- 【转】如何解决使用keil下载或者调试程序是提示的“Invalid ROM Table”信息!
在将Discovery的工程移植到Mini-STM32F4x9BI开发板时,使用ULINK2下载程序可能会出现如下图所示的“Invalid ROM Table”这个错误. 可能原因是使用Mini-ST ...
- ASP.NET MVC学习之Log4Net配置(日志记录)
Log4Net配置笔记---- 首先,添加对log4net.dll的引用. 在Web.config文件下的Configuration节点下添加Log4Net的配置信息: <!--Log4Net配 ...
- 团体程序设计天梯赛-L3-021 神坛 的一些错误做法 和 一些想法
https://pintia.cn/problem-sets/994805046380707840/problems/994805046577840128 错误做法: 极角排序 + 最小三角形的两边是 ...
- LeetCode 7最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- CentOS 7.4 java验证码乱码的问题
转载阿里云 摘要: 新服务器配置发布网站 配置后程序顺利启动在登录时发现验证码无法识别显示出了图片,但是字是乱码 初步估计应该是字体问题 ssh登录服务器查看默认字体 #fc-match msam1 ...
- CXF wsdl2java 生成java代码供客户端使用
CXF wsdl2java 生成java代码供客户端使用 环境配置:1.下载apache-cxf-2.6.2在环境变量中配置CXF_HOME 值为E:\gavin\cxf\apache-cxf-3.0 ...
- 思考的乐趣----matrix67数学笔记:最精妙的无字证明
从<思考的乐趣----matrix67数学笔记>一书中看到这个证明,据说在mathoverflow网站上这个无字证明获得了最多的投票! http://mathoverflow.net/qu ...
- 【原创】backbone1.1.0源码解析之Collection
晚上躺在床上,继续完成对Backbone.Collection的源码解析. 首先讲讲它用来干嘛? Backbone.Collection的实例表示一个集合,是很多model组成的,如果用model比喻 ...
- 使用data:uri上传图片
上传图片的方式有两种,一种是使用传统的html控件的方式,设置form属性为multipart/form-data.这种方式兼容ie6,ie7.另一种方式是使用data:uri,将base64编码从浏 ...