scala的类

版权声明: https://blog.csdn.net/weixin_39966065/article/details/89821824

目录

 

1.类的声明 

2.类的对象的封装

3.构造函数

 


1.类的声明 

包含类的对象
包含类的方法 
例子: 
class HelloWorld {
  private var name = "leo"
  def sayHello() { print("Hello, " + name) }  
  def getName = name
}
 

2.类的对象的封装

(1)类的属性的限定方式:
var:并提供public的getter和setter方法
val:则只会生成getter方法
private:则生成的getter和setter也是private的
private[this]:没有getter,setter方法,只能在类的内部使用属性,与方法隔绝

(2)getter,setter 对象的自动生成
getter,setter的使用: 直接 “ . ” + 属性名称

class Student {
  var myName = "leo"
}

例子:
// 调用getter和setter方法,分别叫做 myName 和 myName_ =
val leo = new Student
print(leo.myName)
leo.myName = "leo1"


(3)自定义setter,getter (注意setter方法的调用比较特别  使用 “=” 来进行参数的传递)

class Student {
  private var myName = "leo"
  def name = "your name is " + myName
  def name_=(newValue: String)  {
    myName = newValue
    print("you edit your name!")
  }
}

val leo = new Student
print(leo.name)   //调用 getter
leo.name = "leo1" // 调用 setter  这种模式儿,相当于调用了 name_ 方法

特点: setter 的声明
       setter 的调用


(4)自定义函数,来替代它本身的 setter,getter
class Student {
  private var myName = "leo"

  def updateName(newName: String) { 
    if(newName == "leo1") myName = newName 
    else print("not accept this new name!!!")
  }

  def name = "your name is " + myName
}


(5)不希望 field 被其他对象访问:(只能当前类的对象使用** 理解)

例子:
class Student {
  private[this] var myAge = 0
  def age_=(newValue: Int) { 
    if (newValue > 0) myAge = newValue 
    else print("illegal age!") 
  }
  def age = myAge
  def older(s: Student) = {
    myAge > s.myAge
  }
  
报错:
error: value myAges is not a member of Students 
       myAges > s.myAge —— 报错
       
       
(6)生成与java相同风格的 getter , setter 
结果: 此时会生成4个方法,name: String、name_=(newValue: String): Unit、getName(): String、setName(newValue: String): Unit

例子:
import scala.reflect.BeanProperty
class Student {
  @BeanProperty var name: String = _
}
class Student(@BeanProperty var name: String)

val s = new Student
s.setName("leo")
s.getName()

3.构造函数


(1)辅助构造函数:
  本质:对主构造函数的重载
  格式:必须第一行调用主constructor
  class Student {
  private var name = ""
  private var age = 0
  def this(name: String) {
    this()
    this.name = name
  }
  def this(name: String, age: Int) {
    this(name)
    this.age = age
  }
}

  
(2)主构造函数:
定义方式:主constructor是与类名放在一起的

class Student(val name: String, val age: Int) {
  println("your name is " + name + ", your age is " + age)
}

使用默认参数:
class Student(val name: String = "leo", val age: Int = 30) {
  println("your name is " + name + ", your age is " + age)
}


(3)Scala中,在类中定义内部类
内部类区别:与java不同的是,每个外部类的对象的内部类,都是不同的类

import scala.collection.mutable.ArrayBuffer
class Class {
  class Student(val name: String) {}
  val students = new ArrayBuffer[Student]
  def getStudent(name: String) =  {
    new Student(name)
  }
}

val c1 = new Class
val s1 = c1.getStudent("leo")
c1.students += s1

val c2 = new Class
val s2 = c2.getStudent("leo")
c1.students += s2

error: type mismatch (类型不匹配)

结论:scala 中的类型归属划分更加严格
内部类的类型会与父类进行绑定

猜你喜欢

转载自blog.csdn.net/weixin_39966065/article/details/89821824