创建使用类

(1)基本语法
[修饰符] class 类名 {
类体
}
说明
(1)Scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
(2)一个Scala源文件可以包含多个类

Java和Scala对比

java中类: public(文件名和类名一致) 和 默认

scala默认的getter和setter不满足标准的javaBean规范
getAge() setAge(…)
需要注解, 然后scala会自动的生产标准的getter和setter

类的属性

属性赋值

属性是类的一个组成部分
1)基本语法
[修饰符] var 属性名称 [:类型] = 属性值
注:Bean属性(@BeanPropetry),可以自动生成规范的setXxx/getXxx方法

  1. object ObjDemo1 {
  2. def main(args: Array[String]): Unit = {
  3. val user = new User()
  4. println(user.age)
  5. //赋值为200
  6. user.age = 200
  7. println(user.age)
  8. //赋值为100,正常人是不会用这个的.
  9. user.age_$eq(100) //user.age_$eq(100) 等价于 user.age = 100
  10. println(user.age)
  11. }
  12. }
  13. class User {
  14. // 定义属性:和定义普通的变量完全一样
  15. @BeanProperty var age = 10 // 生成类似Java的标准的get set 方法的注解
  16. private var name = "lisi"
  17. @BeanProperty val country = "china"
  18. private var a1 = 100 // 私有
  19. // 给类定义方法
  20. def eat() = {
  21. println("eat:" + name)
  22. }
  23. }

初始化赋值

类的属性, 在scala中也可以让虚拟机自动给初始化值
var age:Int = _
初始化的值分3种:
1. 数字型 0
2. boolean false
3. 其他所有类型: null

object Obj2 {

  def main(args: Array[String]): Unit = {
    val user = new User1
    println(user.age) // 0
    println(user.name) // null
    println(user.flag) //false

  }
}

class User1 {
  var age: Int = _
  var name: String = _
  var flag: Boolean = _
}

输出:

0
null
false

类的构造器

和Java一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法。

Scala类的构造器包括:主构造器和辅助构造器

基本语法

class 类名(形参列表) { // 主构造器
// 类体
def this(形参列表) { // 辅助构造器
}
def this(形参列表) { //辅助构造器可以有多个…
}
}

主构造器初始化赋值

  1. 调用构造器创建对象的时候, 可以给属性赋值
  2. 类名的后面添加需要的一些属性, 这些在创建对象的时候, 可以给这些属性赋值
  3. 类名后面根的其实就是构造器. 这个就是主构造器. 一个类只能有一个主构造器.
  4. 如果类后面没写入参的话,那么就是无参的构造器.

构造参数如果没有被var 或者val修饰的话,那么这个参数就是私有的参数,如果类的内部没有方法使用的话,那么这个私有参数就会在编译的时候被Scala优化掉了.

object Obj3 {
  def main(args: Array[String]): Unit = {
    val user = new User3(10, "张三", "男")
    println(user.age)
    //    println(user.sex) // sex没有被var和val修饰,所以就是私有的
    println(user.name)


  }
}

// sex 没有被val和var修饰,那么就是私有的属性了,无法取出来
class User3(val age: Int, var name: String, sex: String) {

}

输出

10
张三

辅助构造器

你可以理解为构造器的重载,辅助构造器的首行必须是调用主构造器.

语法:def this(){<br />    // 首行必须是调用主构造器

}


object Obj3 {
  def main(args: Array[String]): Unit = {
    val user = new User3() //调用了辅助构造器
    println(user.age)
    //    println(user.sex) // sex没有被var和val修饰,所以就是私有的
    println(user.name)


  }
}


class User3(val age: Int, var name: String, sex: String) {

  // 这种构造器: 辅构造器
  def this() {
    // 首行必须是调用主构造器
    this(10, "abc", "male")
  }

}

输出:

10
abc

定义多个辅助构造器

  1. 后面的辅构造可以调用前面的, 前面的不能调用后面的.
  2. 辅构造的参数, 仅仅是一个只能在当前的这个辅构造内的使用的普普通的一个常量
class User3(val age: Int, var name: String, sex: String) {

  // 这种构造器: 辅构造器
  def this() {
    // 首行必须是调用主构造器
    this(10, "abc", "male")
  }
  /*第二个辅助构造器,
  参数c只能在当前辅助构造器里面使用,不能在主方法里面使用.
   */
  def this(c: Int) {
    this() // 可以调用第一个辅助构造器
    //    this(c, "abc", "male") // 构造器内调用主构造器
    println(c)
  }
}

构造器参数

说明:

(1)辅助构造器,函数的名称this,可以有多个,编译器通过参数的个数来区分。

(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。

1)说明

Scala类的主构造器函数的形参包括三种类型:未用任何修饰、var修饰、val修饰

(1)未用任何修饰符修饰,这个参数就是一个局部变量

(2)var修饰参数,作为类的成员属性使用,可以修改

(3)val修饰参数,作为类只读属性使用,不能修改

类别名

如果原来的类名起的不太好(类名太长或者类名太烂),但是又不能改类名(别人写的类名你不能私自改),那么就可以取别名

给类取别名用type

object Obj3 {
  def main(args: Array[String]): Unit = {
    //给类取别名
    type U = User3
    val u = new U(10, "zhangsan", "男")
    println(u.age)
    println(u.getClass.getName) //获取原来的类名
    println(u.name)

  }
}


class User3(val age: Int, var name: String, sex: String) {
}

输出:

10
obj.User3
zhangsan