Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性。

类定义

scala使用class关键字定义类:

class MyComplex(real0:Double, image0:Double) {
var real:Double = real0;
var image:Double = image0;
private val eps:Double = 0.001; def show() {
println("%f+%fi".format(this.real, this.image));
}
}
scala> var c = new MyComplex(1,1);
c: MyComplex = MyComplex@49c17ba4 scala> c.show()
1.000000+1.000000i

定义的语法与Java类似,同样采用this关键字访问实例自身。并且采用和Java类似的三种访问修饰符:

  • private: 仅类自身的方法可以访问

  • protected: 仅类自身和派生类的方法可以访问

  • public: 所有方法都可以访问, 默认访问权限

scala类定义语法与Java最大的不同在于,类声明中含有参数声明。scala的整个类声明体即为一个函数体,我们称其为类的主构造函数。

在类实例化时类声明中所有代码都将被执行,属性和方法的声明语句将定义相应的类成员。也因为如此, 所有属性声明时必须给出默认值.

给出MyComplex类声明的Java版本, 可以让我们直观的认识主构造函数:

class MyComplex {

	public Double real;

	public Double image;

	public MyComplex(Double real0, Double image0) {
this.real = real0;
this.image = image0;
} public void show() {
println("%f+%fi".format(this.real, this.image));
}
}

辅助构造函数

scala支持重载方法, 重载构造函数需要使用this关键字重载, 它们被称为辅助构造函数:

class MyComplex(real0:Double, image0:Double) {
var real:Double = real0;
var image:Double = image0;
val eps:Double = 0.001; def this(real0:Int, image0:Int) {
this(real0.toDouble, image0.toDouble);
} def show() {
println("%f+%fi".format(this.real, this.image));
}
}

调用辅助构造函数时,必须先调用主构造函数或其它已经定义好的构造函数

object

class关键字定义的类可以多次初始化, 而object关键字定义的是一个单例类,声明完成后即可访问,不需要再进行实例化:

object Config {
var username:String = "";
var password:String = "";
var mode:Int = 0; def show() {
println("username:" + this.username);
println("password" + this.password);
println("mode" + this.mode);
}
}
scala> Config.username
res: String = "" scala> Config.show()
username:
password
mode0

伴生对象

在面向对象的设计模式中静态属性和方法被认为是一种不好的实践, 应该采用单例模式代替.

伴生对象与类同名, 类对象和伴生对象可以互相访问对方的private成员, 编译后出现在同一个.class文件中.

class User {
var username:String = "";
var password:String = "";
var mode:Int = 0; User.add();
println(User.count);
} object User {
private var count:Int = 0; private def add() {
this.count += 1;
} def main(args: Array[String]) {
var u = new User();
println(this.count);
}
}

编译执行:

$ scalac companion.scala
cat: /release: No such file or directory $ ls
User$.class User.class companion.scala $ scala User
cat: /release: No such file or directory
1
1

继承

scala同样采用extends关键字进行继承:

class MyComplex(real0:Double, image0:Double) {
var real:Double = real0;
var image:Double = image0;
val eps:Double = 0.001; def this(real0:Int, image0:Int) {
this(real0.toDouble, image0.toDouble);
} def show() {
println("%f+%fi".format(this.real, this.image));
}
} class MyComplex2(real0:Double, image0:Double)
extends MyComplex(real0, image0) { override val eps:Double = 0.001; override def show() {
if (this.real != 0) {
println("%f+%fi".format(this.real, this.image));
}
else {
println("%fi".format(this.image));
}
}
}

在继承声明中需要向基类构造函数传递实参.

覆盖基类的非抽象属性和非抽象方法时必须使用override关键字.

抽象类

使用abstract关键字可以定义抽象类:

abstract class AbstractComplex {
var real:Double;
var image:Double;
val eps:Double = 0.001; def show;
}

抽象类允许不初始化属性或不实现方法,派生类在重写抽象属性和方法时不需要override关键字:

class MyComplex(real0:Double, image0:Double) extends AbstractComplex {
var real:Double = real0;
var image:Double = image0; def show() {
println("%f+%fi".format(this.real, this.image));
}
}

继承了抽象类的类必须实现所有属性和方法, 否则需要使用abstract关键字声明派生类仍然是抽象类:

abstract class MyComplex(real0:Double, image0:Double) extends AbstractComplex {
var real:Double = real0;
var image:Double = image0; }

trait

trait类似于Java中的interface, 用于定义类的接口. 与Java类似, scala只允许继承一个实体或抽象类但允许实现多个trait.

不同的是trait可以定义属性和方法, 并根据已有属性和方法生成新的属性和方法.

trait ComplexTrait {
def equalWith(x:ComplexTrait): Boolean;
def notEqualWith()(x:ComplexTrait): Boolean = !equalWith(x);
}

scala使用extends关键字来继承trait, 若已经使用了extends则需使用with关键字对trait进行多继承:

// class MyComplex(real0:Double, image0:Double)
// extends ComplexTrait {...}
class MyComplex(real0:Double, image0:Double)
extends AbstractComplex with ComplexTrait {
var real:Double = real0;
var image:Double = image0; def equalWith(x:ComplexTrait):Boolean = {
if (this.real == x.real && this.image == x.image) {
return true;
}
else {
return false;
}
} def show() {
println("%f+%fi".format(this.real, this.image));
}
}

继承trait的类必须实现trait所有未实现的属性和方法.

Scala面向对象编程与类型系统的更多相关文章

  1. 6. Scala面向对象编程(基础部分)

    6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...

  2. 7. Scala面向对象编程(中级部分)

    7.1 包 7.1.1 看一个应用场景 现在有两个程序员共同开发一个项目,程序员xiaoming希望定义一个类取名Dog,程序员xiaohong也想定一个类也叫Dog,两个程序员还为此吵了起来,该怎么 ...

  3. 大数据笔记(二十四)——Scala面向对象编程实例

    ===================== Scala语言的面向对象编程 ======================== 一.面向对象的基本概念:把数据和操作数据的方法放到一起,作为一个整体(类 c ...

  4. Scala实战高手****第7课:零基础实战Scala面向对象编程及Spark源码解析

    /** * 如果有这些语法的支持,我们说这门语言是支持面向对象的语言 * 其实真正面向对象的精髓是不是封装.继承.多态呢? * --->肯定不是,封装.继承.多态,只不过是支撑面向对象的 * 一 ...

  5. 2.3 Scala面向对象编程基础

    一.类 1.类的定义 Unit表示什么都不返回 方法体最后一句的值,就是方法的返回值. 2.类成员的可见性 3.方法的定义方式 定义方法的时候加圆括号,调用时可以加圆括号c.getValue()也可以 ...

  6. 8. Scala面向对象编程(高级部分)

    8.1 静态属性和静态方法 8.1.1 静态属性-提出问题 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决 8.1.2 基本介绍 -Sca ...

  7. 7、scala面向对象编程之类

    1.  定义一个简单的类 2.getter与setter 3.自定义getter与setter方法 4.仅暴露field的getter方法 5.private[this]的使用 6.Java风格的ge ...

  8. Scala 面向对象编程之类

    定义一个简单的类 // 定义类,包含field以及方法 class HelloWorld { private var name = "leo" def sayHello() { p ...

  9. scala函数式编程(二) scala基础语法介绍

    上次我们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助大家理解,从这里开始我将真正开始介绍scala编程的一些内容. 这里会先重点介绍scala的一些语法.当然,这里是假设你有一些ja ...

随机推荐

  1. AOP打印请求日志,打印返回值

    @Aspect // 申明是个spring管理的bean @Component @Slf4j public class LogAspectServiceApi { private JSONObject ...

  2. 无线网卡连接网络后共享给本地有线网卡使用(Win10)

    无线网卡连接网络后共享给本地有线网卡使用(Win10) 1. 本文主要目的是介绍地有线网卡共享无线网卡的Wifi信号,该应用场景如下: 当在只有wifi环境下,同时有两台电脑A和B,   A为笔记本: ...

  3. SpringMVC 学习 十一 springMVC控制器向jsp或者别的控制器传递参数的四种方法

    以后的开发,大部分是发送ajax,因此这四种传递参数的方法,并不太常用.作为了解吧 第一种:使用原生 Servlet 在控制器的响应的方法中添加Servlet中的一些作用域:HttpRequestSe ...

  4. selenium+java+chrome 自动化测试环境搭建

    安装jdk    (jdk 配置环境变量)    eclipse(可用免安装的) 安装谷歌浏览器 下载chorme driver (chorme driver 也要配置环境变量,将chormedriv ...

  5. Linux学习---GCC编译过程

    (一)GCC编译过程 预处理 cpp -o a.i a.c     //生成预处理文件 等同于[gcc -E] //预处理为将宏定义(#define)等进行替换. 编译 /user/lib/gcc/i ...

  6. jmeter+Jenkins持续集成(邮件通知)

    jmeter构建后,自送发送邮件到指定的邮箱,配置如下 1)Jenkins Location配置 jenkins首页->系统管理->系统配置页面 其中Jenkins URL有默认值,最好修 ...

  7. 27、通过visual s'tudio 验证 SOCKET编程:搭建一个TCP服务器

    本文就是在windows下进行socket编程,搭建一个TCP客户端. 在visual studio下编程,首先在windows下进行初始化(这点在linux下是不需要的): /* 初始化 Winso ...

  8. Eclipse 中 SVN 插件的安装与使用

    下载和安装SVN插件 插件在线安装 可以选择在线安装插件的方式,就是使用eclipse里Help菜单的“Install New Software”,通过输入SVN地址,直接下载安装到eclipse里. ...

  9. 兼容多数浏览器的js添加收藏夹脚本

    浏览器不断发展,js的很多脚本需要跟进才能适应,目前多数代码对新版本浏览器(IE11, Firefox 27)无法适用,特关注跟进. 推荐代码1 适用浏览器:IE11(windows 8.1), Fi ...

  10. css font-family属性设置中文字体乱码

    一般设置字体,个人都喜欢用中文,比如:font-family:"微软雅黑":但是偶尔会出现设置以后字体显示乱码的问题 解决方法[1]: 看看你的CSS文件的第一行有没有:@char ...