我们要封装数据,定义模板等操作,所以我们需要面向对象。

一、scala中的单例对象

    在scala当中,是没有static的,scala给我们提供了单例模式的实现方法。就是使用关键字object。
static在java中修饰属性和方法,目的是直接类名.进行调用。
在scala中object是一个单例对象
在scala中object定义的成员变量和方法都是静态的
可以通过 类名. 来进行调用

1、ScalaTest

object ScalaTest {
//定义成员变量
val name: String = "tom"
//定义方法public static
def sleep(str: String): Unit = {
println(str)
}
}

2、ScalaMain

/**
* 在scala中object是一个单例对象
* 在scala中object定义的成员变量和方法都是静态的
* 可以通过 类名. 来进行调用
*/
object ScalaMain {
def main(args: Array[String]): Unit = {
println(ScalaTest.name)
ScalaTest.sleep("Tom睡得很香!")
}
}

结果:

二、scala类与构造器的使用

    scala中主构造器:
定义在类名后面的构造器叫主构造器
scala辅助构造器:
定义在class类中,可以有多个辅助构造器 如果主构造器中成员变量属性没有被val var修饰的话,该属性不能被访问
相当于java中没有对外提供get方法 如果成员属性使用var修饰的话,相当于java中对外提供了get方法和set方法
如果成员属性使用val修饰的话,相当于java中对外只提供了get方法

1、Person1

//定义类
class Person1 {
//定义姓名 年龄
var name: String = _
var age: Int = _
} //继承App特质 可以不写main
object Test extends App{
val p = new Person1
p.name = "tom"
p.age = 18
println(p.name)
}

2、Person2

//定义主构造器
class Person2(name:String,age:Int) { } object Test2 extends App{
val p = new Person2("john",19)
println(p)
}

结果:

3、Person3

class Person3(var name:String,age:Int) {
var high:Int = _
var weight:Int = _ //定义辅助构造器
def this(name:String,age:Int,high:Int){
//注意:在辅助构造器中必须先调用主构造器
this(name,age)
this.high = high
} //辅助构造器可以是多个
def this(name:String,age:Int,high:Int,weight:Int){
/*
如果主构造器中成员变量属性没有被val var修饰的话,该属性不能被访问
相当于java中没有对外提供get方法 如果成员属性使用var修饰的话,相当于java中对外提供了get方法和set方法
如果成员属性使用val修饰的话,相当于java中对外只提供了get方法
*/
this(name,age)
this.weight = weight
}
} object Test3 extends App{
val p1 = new Person3("tom",18)
println(p1.name)
}

结果:

三、构造器的访问权限

在主构造器或者辅助构造器前加上private修饰符即可

1、Person4

/*
类的构造器访问权限:
private 私有
*/
//主构造器设置为私有
class Person4 private (var name:String,age:Int) { var high: Int = _
private def this(name:String,age:Int,high:Int){
this(name,age)
this.high = high
}
}

2、ScalaDemo

object ScalaDemo {
def main(args: Array[String]): Unit = {
//被private 修饰的主构造器 对外访问权限
val p = new Person4("hh",88)
val p2 = new Person4("ff",33,190)
println(p.name)
println(p2.name)
}
}

结果:

四、类的访问权限

1、Person5

/**
* 类的前面如果加上包名,表示当前类在当前包及其子包可见,可以访问
* [this}默认是它,表示当前包都有访问权限
*/
private[this] class Person5(var name:String,age:Int) {
var high:Int = _ def this(name:String,age:Int,high:Int){
this(name,age)
this.high = high
}
}

2、Test

object Test {
def main(args: Array[String]): Unit = {
val p = new Person5("dd",18,188)
println(p.name)
}
}

五、伴生对象

1、Person6

class Person6(private var name:String,age:Int) {
var high:Int = _ def this(name:String,age:Int,high:Int){
this(name,age)
this.high = high
}
} //注意:在伴生对象中可以访问类的私有成员方法和属性
//什么是伴生对象? 单例类名和类名相同
object Person6 extends App{
val p = new Person6("tom",18,180)
println(p.name)
}

六、特质

相当于java中Interface接口。

1、Animal

trait Animal {
//定义未实现的方法
def eat(name:String) //定义实现的方法
def sleep(name:String): Unit = {
println(s"$name -> 在睡觉")
}
}

2、Pig

object Pig extends Animal {
override def eat(name: String): Unit = {
println(s"$name -> 在吃饭")
} override def sleep(name: String): Unit = {
println(s"$name -> 做梦吃鸡")
} def main(args: Array[String]): Unit = {
Pig.eat("john")
Pig.sleep("tom")
}
}

结果:

七、混入特质

1、Animal

trait Animal {
//定义未实现的方法
def eat(name:String) //定义实现的方法
def sleep(name:String): Unit = {
println(s"$name -> 在睡觉")
}
}

2、Running

trait Running {
def how(str:String): Unit = {
println(s"$str -> 在奔跑")
}
}

3、Dog

//混入特质
object Dog extends Animal with Running {
override def eat(name: String): Unit = {
println(s"$name -> 吃骨头")
} override def sleep(name: String): Unit = {
println(s"$name -> 长膘")
} def main(args: Array[String]): Unit = {
Dog.eat("小狗")
Dog.how("金毛")
}
}

结果:

八、抽象类

1、AbstractDemo

//定义抽象类
abstract class AbstractDemo {
def eat(food:String) def sleep(how:String): Unit = {
println(s"$how -> 睡得很香")
}
}

2、AbstractImpl

//继承抽象类可以再继承特质 但是抽象类写在前 用with连接
object AbstractImpl extends AbstractDemo with Running {
override def eat(food: String): Unit = {
//ctrl + i
println(s"$food -> 吃火锅")
} def main(args: Array[String]): Unit = {
AbstractImpl.eat("tom")
AbstractImpl.how("john")
}
}

结果:

九、模式匹配

1、MatchTest

//模式匹配
object MatchTest {
def main(args: Array[String]): Unit = {
def strMatch(str:String) = str match {
case "john" => println("很帅")
case "mary" => println("很美")
case _ => println("你是谁?")
}
strMatch("john") def arrayMatch(arr:Any) = arr match {
case Array(1) => println("只有一个元素的数组")
case Array(1,2) => println("有两个元素的数组")
}
arrayMatch(Array(1,2)) def tuple(tuple:Any) = tuple match {
case (1,_) => println("元组的第一个元素为1,第二个元素任意")
case ("tom",18) => println("这是个帅小伙")
}
tuple("tom",18)
}
}

结果:

十、final关键字

    如果方法不想被重写可以使用final关键字进行修饰
用final修饰的:
类:类不能被继承
方法:不能被重写
val

1、Animal

trait Animal {
//定义姓名
final var name:String = "tom"
var age:Int = 18 def eat(name: String) final def sleep(name: String): Unit = {
println(s"$name -> 睡得天花乱坠")
}
}

2、Pig

object Pig extends Animal {
//重写eat方法
override def eat(name: String): Unit = {
println(s"$name -> 吃吃吃")
} //这里编译报错,final修饰方法不能被重写
override def sleep(name: String): Unit = {
println(s"$name -> 做梦吃鸡")
} def main(args: Array[String]): Unit = {
Pig.eat("猪")
Pig.sleep("john")
Pig.name = "john tom"
println(Pig.name)
}
}

十一、type关键字

    别名设置
使我们的程序变得更灵活
T

1、Anl

trait Anl {
//定义特质时可以不指定类型
type T def sleep(str: T): Unit = {
println(str)
}
}

2、AnlTest

object AnlTest extends Anl {
override type T = String def main(args: Array[String]): Unit = {
AnlTest.sleep("睡得很香")
}
}

结果:

十二、样例类和样例对象

    1)样例类
样例类支持模式匹配
写法:case class 类名(属性...)
2)样例对象
写法:case object 类名(属性...)
不能封装数据
支持模式匹配
case object Check
match{
case "Check" => println(Check)
}

1、TestEat

//样例类支持模式匹配
case class Eat(food:String,drink:String) object TestEat {
def main(args: Array[String]): Unit = {
val eat = new Eat("麻辣香锅","北冰洋")
println(eat)
}
}

2、TestEat1

//样例类支持模式匹配
case class Boy(high:Int,weight:Int)
case class Girl(high:Int,weight:Int) object TestEat1 extends App {
def objMatch(obj:Any) = obj match {
case Boy(x,y) => println(s"$x $y 的男孩")
case Girl(x,y) => println(s"$x $y 的女孩")
} objMatch(Boy(180,120))
objMatch(Girl(160,90))
}

结果:

Scala面向对象和模式匹配的更多相关文章

  1. scala 面向对象之 继承

    scala 面向对象之 继承 scala   1.extends Scala中,让子类继承父类,与Java一样,也是使用extends关键字 继承就代表,子类可以从父类继承父类的field和metho ...

  2. Spark 3000门徒第二课scala面向对象总结

    昨晚听了王家林老师3000门徒spark系列课程的第二课,讲述了scala面向对象知识,并且带着过了一遍Spark核心类:SparkContent,RDD的代码,下面写一下心得: RDD是抽象类,实现 ...

  3. 第74讲:从Spark源码的角度思考Scala中的模式匹配

    今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...

  4. Scala 经典的模式匹配和尾递归

    Scala 经典的模式匹配和尾递归 package io import java.io.{BufferedWriter, File, FileWriter} import java.text.Simp ...

  5. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  6. Scala基础:模式匹配和样例类

    模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...

  7. Scala——面向对象和函数式编程语言

    Scala Scala是一门运行时基于JVM的编程语言,具备函数式编程和面向对象特点. 基本知识 basics 任意词均可作为符号名,对于关键词,以反引号包裹,避免使用下划线,避免带美元符的名字. 声 ...

  8. Scala面向对象

    面向对象编程OOP: Scala vs Java 都有这三特性 封装:把属性.方法封装到类中 Person: int id, String name, Date birthday.... 需要gett ...

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

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

随机推荐

  1. 在hadoop集群添加了slave节点的方法

    分为以下几个步骤: 1  ,修改master和slave 的参数,和配置时相同,只是修改和节点数相关,如slaves(我的只改了slaves), 将任意一个该好的文件发送到新增加的机器(或者虚拟机) ...

  2. 用MathType怎么编辑带圈数字序号

    在用MathType编辑公式时,涉及到的数学公式与符号这些都能编辑出来,只要你能够细心一点找到它们相应的模板,不管是在word公式编辑器MathType工具栏模板中,还是在插入符号之后的面板中都可以. ...

  3. zoj 1022 - Parallel Expectations

    题目:有两个指令序列,在执行时,能够执行随意指令序列的下一条指令.每条指令要一直执行到结束. 求两组指令执行结束后,每一个变量里面存储值的期望. 分析:dp,模拟.这道题算不上难题,只是算得上的麻烦题 ...

  4. ios iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) 转自容芳志大神的博客:http://www.cnblogs.com/stoic/archive/2013/02/27/2940 ...

  5. strip() 、lstrip() 、rstrip()

    strip() 用于移除字符串开头和结尾的空格或换行符,如果指定参数,则表示移除指定的字符lstrip() 用于移除字符串开头的空格或换行符,如果指定参数,则表示移除指定的字符rstrip() 用于移 ...

  6. lodash(二)对象+循环遍历+排序

    前言: lodash(一)中只是研究了array中的多种方法,接下来就是经常用到的循环遍历问题 过程: 1._.forEach(collection, [iteratee=_.identity], [ ...

  7. Android TextView实现跑马灯

    TextView实现跑马灯的效果:例子一: 这个例子可以解决给一个TextView实现跑马灯的效果,但是不能解决给所有的TextView实现跑马灯的效果. <TextView android:l ...

  8. PyQt4预定义对话框

    PyQt4中的对话框 对话窗口和对话框是现代GUI应用程序必不可少的一部分.生活中“对话”被定义为发生在两人或更多人之间的会话.而在计算机世界,“对话”则时人与应用程序之间的“会话”.人及对话的形式有 ...

  9. MVC Route路由

    由于某些原因,需要默认区域,所以需要对路由进行设置 具体实现如下: using System.Web; using System.Web.Mvc; using System.Web.Routing; ...

  10. <转>KMP算法详解

    看了好久的KMP算法,都一直没有看明白,直到看到了这篇博客http://www.tuicool.com/articles/e2Qbyyf让我瞬间顿悟. 如果你看不懂 KMP 算法,那就看一看这篇文章 ...