6.    类、对象、继承、特质

Scala的类与Java、C++的类比起来更简洁,学完之后你会更爱Scala!!!

6.1.   类

6.1.1.    类的定义

  1. package cn.itcast.class_demo
  2.  
  3. /**
  4. * Scala中,类并不用声明为public类型的。
  5. * Scala源文件中可以包含多个类,所有这些类都具有共有可见性。
  6. */
  7. class Person {
  8.   //用val修饰的变量是可读属性,有getter但没有setter(相当与Java中用final修饰的变量)
  9.   val id="9527"
  10.  
  11.   //用var修饰的变量都既有getter,又有setter
  12.   var age:Int=18
  13.  
  14.   //类私有字段,只能在类的内部使用或者伴生对象中访问
  15.   private var name : String = "唐伯虎"
  16.  
  17.   //类私有字段,访问权限更加严格的,该字段在当前类中被访问
  18.   //在伴生对象里面也不可以访问
  19.   private[this] var pet = "小强"
  20.  
  21. }
  22.  
  23. //伴生对象(这个名字和类名相同,叫伴生对象)
  24. object Person{
  25.   def main(args: Array[String]): Unit = {
  26.     val p=new Person
  27.  
  28.     //如果是下面的修改,发现下面有红线,说明val类型的不支持重新赋值,但是可以获取到值
  29.     //p.id = "123"
  30.     println(p.id)
  31.     //打印age
  32.     println(p.age)
  33.     //打印name,伴生对象中可以在访问private变量
  34.     println(p.name)
  35.     //由于pet字段用private[this]修饰,伴生对象中访问不到pet变量
  36.     //p.pet(访问不到)
  37.  
  38.   }
  39. }
  1.  

6.1.2.    构造器

Scala中的每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起。

注意:主构造器会执行类定义中的所有语句。

  1. package cn.itcast.class_demo
  2.  
  3. /**
  4.   *每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起
  5.   */
  6. class Student(val name:String,var age:Int) {
  7.   //主构造器会执行类定义的所有语句
  8.   println("执行主构造器")
  9.   private  var gender="male"
  10.   def this(name:String,age:Int,gender:String){
  11.     //每个辅助构造器执行必须以主构造器或者其他辅助构造器的调用开始
  12.     this(name,age)
  13.     println("执行辅助构造器")
  14.     this.gender=gender
  15.   }
  16. }
  17.  
  18. object Student {
  19.   def main(args: Array[String]): Unit = {
  20.     val s1=new Student("zhangsan",20)
  21.    
  22.     val s2=new Student("zhangsan",20,"female")
  23.   }
  24. }

6.2.   Scala面向对象编程之对象

6.2.1.     Scala中的object

  • object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method;

在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的。

object作用:

1.存放工具方法和常量

2.高效共享单个不可变的实例

3.单例模式

  • 举例说明:
  1. package cn.itcast.object_demo
  2. import scala.collection.mutable.ArrayBuffer
  1. class Session{}
  1. object SessionFactory{
  2.   //该部分相当于java中的静态块
  3.    val session=new Session
  4.   //在object中的方法相当于java中的静态方法
  5.   def getSession(): Session ={
  6.     session
  7.   }
  8. }
  9. object SingletonDemo {
  10.   def main(args: Array[String]) {
  11.     //单例对象,不需要new,用【单例对象名称.方法】调用对象中的方法
  12.     val session1 = SessionFactory.getSession()
  13.     println(session1)
  14.     //单例对象,不需要new,用【单例对象名称.变量】调用对象中成员变量
  1. val session2=SessionFactory.session
  2.     println(session2)
  3.   }
  4. }
  5.  
  6.  
  1.  

6.2.2.     Scala中的伴生对象

  • 如果有一个class文件,还有一个与class同名的object文件,那么就称这个object是class的伴生对象,class是object的伴生类;
  • 伴生类和伴生对象必须存放在一个.scala文件中;
  • 伴生类和伴生对象的最大特点是,可以相互访问;
  • 举例说明:
  1. package cn.itcast.object_demo

  2. //伴生类
  3. class Dog {
  4.   val id = 1
  5.   private var name = "itcast"
  6.   def printName(): Unit ={
  7.     //在Dog类中可以访问伴生对象Dog的私有属性
  8.     println(Dog.CONSTANT + name )
  9.   }
  10. }
  11. //伴生对象
  12. object Dog {
  13.   //伴生对象中的私有属性
  14.   private val CONSTANT = "汪汪汪 : "
  15.   def main(args: Array[String]) {
  16.     val p = new Dog
  17.     //访问私有的字段name
  18.     p.name = "123"
  19.     p.printName()
  20.   }
  21. }
  22. //执行结果 汪汪汪 : 123

6.2.3.     Scala中的apply方法

  • object 中非常重要的一个特殊方法,就是apply方法;
  • apply方法通常是在伴生对象中实现的,其目的是,通过伴生类的构造函数功能,来实现伴生对象的构造函数功能;
  • 通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用;
  • 在创建伴生对象或伴生类的对象时,通常不会使用new class/class() 的方式,而是直接使用 class(),隐式的调用伴生对象的 apply 方法,这样会让对象创建的更加简洁;
  • 举例说明:
  1. package cn.itcast.object_demo
  2. /**
  3.  *  Array 类的伴生对象中,就实现了可接收变长参数的 apply 方法,
  4.  * 并通过创建一个 Array 类的实例化对象,实现了伴生对象的构造函数功能
  5.  */
  6. // 指定 T 泛型的数据类型,并使用变长参数 xs 接收传参,返回 Array[T] 数组
  7. // 通过 new 关键字创建 xs.length 长的 Array 数组
  8. // 其实就是调用Array伴生类的 constructor进行 Array对象的初始化
  9. //  def apply[T: ClassTag](xs: T*): Array[T] = {
  10. //    val array = new Array[T](xs.length)
  11. //    var i = 0
  12. //    for (x <- xs.iterator) { array(i) = x; i += 1 }
  13. //    array
  14. //  }
  15.  
  16. object ApplyDemo {
  17.   def main(args: Array[String]) {
  18.     //调用了Array伴生对象的apply方法
  19.     //def apply(x: Int, xs: Int*): Array[Int]
  20.     //arr1中只有一个元素5
  21.     val arr1 = Array(5)
  1.     //new了一个长度为5的array,数组里面包含5个null
  2.     var arr2 = new Array(5)
  3.     println(arr1.toBuffer)
  4.   }
  5. }

6.2.4.     Scala中的main方法

  • 同Java一样,如果要运行一个程序,必须要编写一个包含 main 方法的类;
  • 在 Scala 中,也必须要有一个 main 方法,作为入口;
  • Scala 中的 main 方法定义为 def main(args: Array[String]),而且必须定义在 object 中;
  • 除了自己实现 main 方法之外,还可以继承 App Trait,然后,将需要写在 main 方法中运行的代码,直接作为 object 的 constructor 代码即可,而且还可以使用 args 接收传入的参数;
  • 案例说明:
  1. package cn.itcast.object_demo

  2. //1.在object中定义main方法
  3. object Main_Demo1 {
  4.   def main(args: Array[String]) {
  5.     if(args.length > 0){
  6.       println("Hello, " + args(0))
  7.     }else{
  8.       println("Hello World!")
  9.     }
  10.   }
  11. }
  12. //2.使用继承App Trait ,将需要写在 main 方法中运行的代码
  13. // 直接作为 object 的 constructor 代码即可,
  14. // 而且还可以使用 args 接收传入的参数。
  15.  
  16. object Main_Demo2 extends App{
  17.     if(args.length > 0){
  18.       println("Hello, " + args(0))
  19.     }else{
  20.       println("Hello World!")
  21.     }
  22. }

第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法的更多相关文章

  1. 第2节 Scala中面向对象编程:12、13、14、15、16、trait

    6.4.  Scala中面向对象编程之trait 6.4.1.    将trait作为接口使用 Scala中的trait是一种特殊的概念: 首先先将trait作为接口使用,此时的trait就与Java ...

  2. 第2节 Scala中面向对象编程:9、getClass和classOf;10、调用父类的constructor;11、抽象类和抽象字段;

    6.3.4.     Scala中getClass 和 classOf Class A extends class B B b=new A    b.getClass ==classOf[A] B b ...

  3. 第2节 Scala中面向对象编程:7、继承的概念以及override和super关键字;8、isInstanceOf 和 asInstanceOf关键字

    6.3.   Scala面向对象编程之继承 6.3.1.     Scala中继承(extends)的概念 Scala 中,让子类继承父类,与 Java 一样,也是使用 extends 关键字: 继承 ...

  4. JavaScript面向对象编程(二)构造函数和类

    new关键字和构造函数 在文章JavaScript面向对象编程(一)原型与继承中讨论啦JavaScript中原型的概念,并且提到了new关键字和构造函数.利用new关键字构造对象的实例代码如下: // ...

  5. JavaScript 面向对象编程(三)如何写类和子类

    在JavaScript面向对象编程(一)原型与继承和JavaScript面向对象编程(二)构造函数和类中,我们分别讨论了JavaScript中面向对象的原型和类的概念.基于这两点理论,本篇文章用一个简 ...

  6. PHP中面向对象编程思想的3个特征

    面向对象编程思想的3个特征: 封装: 无非是一个大的指向思想,目的是为了将一个类设计得更为健壮! 其基本做法是: 尽可能地将一个类的成员私有化,只开放那些必不可少的对外的属性或方法,能private的 ...

  7. C#中面向对象编程中的函数式编程详解

    介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...

  8. 第4节 Scala中的actor介绍:1、actor概念介绍;2、actor执行顺序和发送消息的方式

    10.    Scala Actor并发编程 10.1.   课程目标 10.1.1.    目标一:熟悉Scala Actor并发编程 10.1.2.    目标二:为学习Akka做准备 注:Sca ...

  9. scala的面向对象编程

    1.scala的简单编程 2.构造方法 辅助构造函数是在主构造函数没有的情况下,执行的构造函数. 3.object的介绍 4.半生类和半生对象 5.半生的案例程序(半生类可以调用半生) 6.apply ...

随机推荐

  1. Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建

    Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建 一.Jenkins 进入项目---->Configure 1.设置项目代码从git中拉取 2.设置钩子程序 二.git ...

  2. 查看KVM宿主机上虚拟机的IP的脚本

    查看KVM宿主机上虚拟机的IP的脚本 #!/bin/bash #Auth:liucx #ping当前网段内在线的主机,以便产生arp记录. .{..};do { >& }& do ...

  3. MySQL:ALTER COLUMN、MODIFY COLUMN 和 CHANGE COLUMN

    ALTER COLUMN.MODIFY COLUMN 和 CHANGE COLUMN 语句修改列: ALTER COLUMN:改变.删除列的默认值(备注:列的默认值存储在 .frm 文件中). 这个语 ...

  4. 【PAT甲级】1098 Insertion or Heap Sort (25 分)

    题意: 输入一个正整数N(<=100),接着输入两行N个数,表示原数组和经过一定次数排序后的数组.判断是经过插入排序还是堆排序并输出再次经过该排序后的数组(数据保证答案唯一). AAAAAcce ...

  5. 「JSOI2012」玄武密码

    「JSOI2012」玄武密码 传送门 题目是要求多个串在母串上的最长匹配长度. 考虑 \(\text{AC}\) 自动机,我们建出 \(\text{Trie}\) 图然后用母串来在上面跑. 每一个能匹 ...

  6. 图解 Kafka 水印备份机制

    高可用是很多分布式系统中必备的特征之一,Kafka 日志的高可用是通过基于 leader-follower 的多副本同步实现的,每个分区下有多个副本,其中只有一个是 leader 副本,提供发送和消费 ...

  7. servlet filter listener interceptor 知识点

    这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下:   概念 生命周期 使命 servlet ...

  8. python学习笔记:分支 与 循环

    if 语句 if 条件: ...... # 条件为真的时候,执行缩进的代码 if 条件: ...... # 条件为真的时候执行 else: ...... # 条件为假的时候执行 if 条件1: ... ...

  9. /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found的解决办法

    #############################BEGIN############################# strings /usr/lib64/libstdc++.so.6.0. ...

  10. 【转】centos升级curl版本

    1.安装repo rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/rhel6/x86_64/city-fan.org-release-2-1 ...