scala中的类和对象

80 阅读4分钟
  • 类是属性行为的集合
  • 属性也叫成员变量:名词,用来描述事物的外在特征
  • 行为也叫成员方法:动词,表示事物能做什么

面向对象的三大特征:

  1. 封装
  2. 继承
  3. 多态
  • 在Scala中,用class来创建类,用new来创建对象。
  • 创建一个Person类,并创建它的对象,然后将对象打印到控制台上。

1. 使用IDEA创建一个scala项目,并创建object类。

2. 设置项目名,包名,项目地址。注意不要使用中文,空格,特殊符号作为名字及路径名。

定义和访问成员变量

object Base34 {
  //Person就是一个类名理解为变量名
  //首字母大写!
  //类名一般来说是名词
  //1.定义类
  class Person(){}
  class Student() {
    var name: String = "小花"
    var age: Int = 18
  }

  def main(args: Array[String]): Unit = {
    //2.实例化对象
    val p1 = new Person()
    val s1 = new Student()
   //访问成员变量
    println(s1.name)
    //修改成员变量
    s1.name = "小花花"
    println(s1.name)
  }
}

在scala的类中,使用def定义成员方法

返回值的类型可以不写,由Scala自动进行类型推断

Class 类名(参数列表),参数列表中的变量可以用var|val,也可以不用。

用val或var定义,在类外可以访问,var可变变量,val不可变变量

不用val|var定义,在类外不可以访问 内部只读,不可改写

object Base35 {
  //把功能都封装在class中
  //1.属性
  //2.方法
  //3.辅助构造器
  class Student() {
    //1.类的属性 - 变量
    var name: String = "小花"
    var age: Int = 18
    //2.类的方法 - 函数
    def say(): Unit = {
      println(s"${name},${age}")
    }
  }

  def main(args: Array[String]): Unit = {
    //实例化对象
    val s1 = new Student()
    s1.say()
    val s2 = new Student()
    s2.say()
  }
}
object Base36 {
  //带参数的构造器(构造函数)
  //把功能都封装在class中
  //1.属性
  //2.方法
  //3.辅助构造器
  class Student(var name: String = "小花",var age: Int = 18) {
    //1.类的属性 - 变量
    //var name: String = "小花"
    //var age: Int = 18
    //2.类的方法 - 函数
    def say(): Unit = {
      println(s"${name},${age}")
    }
  }

  def main(args: Array[String]): Unit = {
    //实例化对象
    val s1 = new Student()
    s1.say()
    val s2 = new Student("小明",19)
    s2.say()
  }
}
object Base37 {
  class Triangle(var  a:Double = 1.0,var  b:Double = 1.0,var  c:Double = 1.0) {
    println(s"${a} ${b} ${c}")
    //检查是否构成三角形,结果是boolean
    def check():Boolean = {
      return a+b > c && b+c>a && a+c>b
  }
    //计算面积:根据三角形的三边计算面积
    def getArea():Double = {
    if(check()){
      var s = (a+b+c)/2
      s = Math.sqrt(s*(s-a)*(s-b)*(s-c))
      return s
     }else{
      println(s"${a} ${b} ${c}不能构成一个三角形")
      return -1
     }
    }
  }
  def main(args: Array[String]): Unit = {
    //print("请输入第一条边")
    //val a = scala.io.StdIn.readDouble()
    //print("请输入第二条边")
    //val b = scala.io.StdIn.readDouble()
    //print("请输入第三条边")
    //val c = scala.io.StdIn.readDouble()
    //val t1 = new Triangle(a, b, c)

    val t1 = new Triangle(3,4,7)
    println(t1.getArea())

    val t2= new Triangle(3,4,3)
    println(t2.getArea())
    //if(t1.check()){
    //  println("能构成三角形")
    //}else{
      //println("不能构成三角形")
    //}
  }
}
object Base38 {
  //构造器的默认值
  //必填项:姓名,年龄
  //有默认值的项
  //性别:男
  //民族:汉
  //
 class Student(var name:String, var age:Int, var gender:String="男",var nav:String="汉族") {
   def say(): Unit = {
     println(s"${name},${age},${gender},${nav}")
   }
 }
  def main(args: Array[String]): Unit = {
    var s1 = new Student("小明",19)
    s1.say()
    var s2= new Student("小花",18,"女","回族")
    s2.say()
  }
object Base39 {
  //构造器中的参数的类型
  //1.val定义的属性不能修改
  //2.var定义的属性可以修改
  //3.没有val,也没有var的,不是对象的属性,不能使用,语法来访问
 class Student(var name:String, var age:Int, var gender:String="男",var nav:String="汉族") {
   def say(): Unit = {
     println(s"${name},${age},${gender},${nav}")
   }
 }
  def main(args: Array[String]): Unit = {
    var s1 = new Student("小明",19)
    s1.age = 20
    s1.say()
  }
}

辅助构造函数

构造函数可以有很多个

  • 辅助构造器可以通过 this 关键字调用主构造器,从而确保所有初始化逻辑都集中在主构造器中。
object Base40 {
  // 主构造器的方式---辅助构造器
  // 1. 主构造器的参数
  // 2. 辅助 + 密码 + 用户名
  // 组合
  class Register(var name: String, var email: String, var pwd: String, var phone: String) {
    println("主构造器被调用")
    // 辅助构造器
    // 1. 名称一定是this
    // 2. 在辅助构造器内部,一定要调用主构造器this
    // 3. 可以有多个
    def this(phone: String, pwd: String) {
      this("用户xxxx", "xxxx@qq.com", pwd, phone) // 调用主构造器
      println("辅助构造器被调用")
    }
    def this(email: String, pwd: String, name: String) {
      this(name, email, pwd, "13600000000") // 调用主构造器
      println("辅助构造器被调用")
    }
    def say(): Unit = {
      println(s"姓名: ${name}, 邮箱: ${email}, 密码: ${pwd}, 手机号: ${phone}")
    }
  }
  def main(args: Array[String]): Unit = {
    val r1 = new Register("小明", "123123@qq.com", "123456", "13517855567")
    // 调用辅助构造器
    val r2 = new Register("13517855566", "123456")
    val r3 = new Register("74565655@qq.com", "123456", "小明")
    r1.say()
    r2.say()
    r3.say()
  }
}