Scala详细文本教学03

本文是Scala详细教学的第三部分,主要讲解类的定义、getter和setter、Bean属性、构造器,以及对象的单例、伴生对象、apply方法、应用程序对象等概念。此外,还涉及继承、抽象类、特质的使用,以及模式匹配和样例类的基础知识。
摘要由CSDN通过智能技术生成

前言

你们好我是啊晨
首先呢,内容很多,分为几篇,选择阅读就好,很详细。
请:

一、类

1、类的定义

//在Scala中,类的定义可以通过class关键字实现,类并不用声明为public。
//Scala源文件中可以包含多个类,所有这些类都具有公有可见性。
//文件名称和类名没有强制性的关系
class Dog {
   
  //属性必须有初始值,如果不想有初始值初始化为_下划线,赋值为_是必须指定数据类型,,并且 需要使用var声明

  private var leg = 4
  def shout(content: String) {
   
    println(content)
  }
  def currentLeg = leg
}

使用这个类:

//在Scala中,类并不用声明为public。
val dog = new Dog
//调用方法,通过对象.方法 对象+空格+方法
dog shout "汪汪汪"
dog.shout("汪汪汪")
println(dog currentLeg)
println(dog.currentLeg)
//访问属性,通过对象.属性 对象+空格+属性
dog.leg = 4
println(“leg =+dog.leg)
dog leg = 4
println(dog leg)
//在Scala中,类并不用声明为public。
//Scala源文件中可以包含多个类,所有这些类都具有公有可见性。
class Person {
   
  //用val修饰的变量是只读属性,有getter但没有setter
  //(相当与Java中用final修饰的变量)
  val id = "9527"
  //用var修饰的变量既有getter又有setter
  var age: Int = 18
// _代表初始值,使用时属性必须指定类型。并且是var声明
var color:Strng = _
  //类私有字段,只能在伴生对象和类的内部使用
  private var name: String = "唐伯虎"
  //对象私有字段,访问权限更加严格的,当前对象的字段只能被Person类的方法访问到
//对象私有字段,只能在类的内部使用
  private[this] val pet = "小强"
}

尖叫提示:在Scala中,类并不声明为Public,一个Scala源文件可以包含多个类。所有这些类都具有公有可见性。调用无参方法时,可以加(),也可以不加;如果方法定义中不带括号,那么调用时就不能带括号。

2、Getter Setter方法

对于scala类中的每一个属性,编译后,会有一个私有的字段和相应的getter、setter方法生成:

//getter
println(dog leg)
//setter
//对象.属性_=(值)
dog.leg_=(10)
println(dog currentLeg)

当然了,你也可以不使用自动生成的方式,自己定义

getter和setter方法
class Dog2 {
   
  private var _leg = 4
  def leg = _leg
  def leg_=(newLeg: Int) {
   
    _leg = newLeg
  }
}

使用之:

val dog2 = new Dog2
dog2.leg_=(10)
println(dog2.leg)

@BeanProperty
**尖叫提示:**自己手动创建变量的getter和setter方法需要遵循以下原则:

  1. 字段属性名以“_”作为前缀,如:_leg
  2. getter方法定义为:def leg = _leg
  3. setter方法定义时,方法名为属性名去掉前缀,并加上后缀,后缀是:“leg_=”,如例子所示

3、Bean属性

JavaBeans规范定义了Java的属性是像getXXX()和setXXX()的方法。许多Java工具都依赖这个命名习惯。为了Java的互操作性。将Scala字段加@BeanProperty时,这样的方法会自动生成。
创建一个Bean,使用@BeanProperty注解标识某个属性变量

import scala.beans.BeanProperty
class Person {
   
  @BeanProperty var name: String = _
}

通过getName、setName访问属性

val person = new Person
person.setName("Nick")
person.getName
println(person.name)

尖叫提示:
Person将会生成四个方法:
–name:String
–name_=(newValue:String): Unit
–getName():String
–setName(newValue:String):Unit

4、构造器

scala中构造分为主构造器和辅助构造器
注意:主构造器会执行类定义中的所有语句

/**
  *每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起
  */
class Student(val name: String, val age: Int){
   
  //主构造器会执行类定义中的所有语句
  println("执行主构造器")

  private var gender = "male"

  //用this关键字定义辅助构造器
  def this(name: String, age: Int, gender: String){
   
    //每个辅助构造器必须以主构造器或其他的辅助构造器的调用开始
this(name, age)
    println("执行辅助构造器")
    this.gender = gender
  }
}
//主构造器中name属性没有初始值,age属性有初始值,那么在调用主构造创建对象是,可以不传age这个参数的值
class Teacher(var name:String,var age:Int=30) {
   

}
//如果在主构造器中属性有初始值,那么在调用主构造创建对象是,可以不传这个参数的值
val t01 = new Teacher("xiaoming")
println(" t01 name "+t01.name)
println("t01 age = "+t01.age)





/**
  *如果在主构造器中定义的参数不带val或var,这定义的参数不是类的属性,不能通过
   对象.参数名称 调用
  *如果在主构造器中定义的参带val或var,这定义的参数提升为类的属性,能通过
   对象.参数名称 调用
  *构造器参数可以不带val或var,如果不带val或var的参数至少被一个方法所使用,
  *那么它将会被提升为字段,
  */
//在类名后面加private就变成了私有的,伴生对象中可以调用主构造器
class Queen private(val name: String, prop: Array[String], private var age: Int = 18){
   
  
  println(prop.size)

  //prop被下面的方法使用后,prop就变成了不可变得对象私有字段,等同于private[this] val prop
  //如果没有被方法使用该参数将不被保存为字段,仅仅是一个可以被主构造器中的代码访问的普通参数
  def description = name + " is " + age + " years old with " + prop.toBuffer
}

object Queen{
   
  def main(args: Array[String]) {
   
    //私有的构造器,只有在其伴生对象中使用
    val q = new Queen("hatano", Array("蜡烛", "皮鞭"), 20)
    println(q.description())
  }
}

二、对象

1、单例对象

在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
1.存放工具方法和常量
2.高效共享单个不可变的实例
3.单例模式

class SingleTon private() {
   

}
object SingleTon{
   
  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值