scala中的类和对象

4 阅读3分钟

类和对象相关概念

  1. 什么是面向对象?

    面向对象的三大特征:封装 继承 多态

  2. 什么是类class? 类是属性行为的集合

    (1) 属性也叫成员变量:名词,用来描述事物的外在特征

    (2) 行为也叫成员方法:动词,表示事物能做什么

创建类和对象

object basic27 {
  //1.定义一个类
  //类名:首字母大写
  //class 类名(){}
  class Student() {
  
    //属性
    var name: String = "dd"
    var age:Int = 20

    //方法
    //定义方法和定义函数一致
    def sayHello() = {
      println(s"我是${age}岁的${name}")
    }
  }
  def main(args: Array[String]): Unit = {
    //2.创建对象(实例化对象)
    //对象名 = new 类名()
    val st1 = new Student()

    //通过 对象.属性名 来访问属性
    println(st1.name)
    
    //通过 对象.方法名() 来调用方法
    st1.sayHello()

  }
}

带参数的构造器(构造函数)

  1. new class 会发生什么?

    new 会调用一次构造器 代码

    构造器 ==== class

    构造器的作用: 生产对象

object basic28 {
  class Student(var name:String = "dd", var age:Int = 20) {
    //方法
    //定义方法和定义函数一致
    def sayHello() = {
      println(s"我是${age}岁的${name}")
    }
  }

  def main(args: Array[String]): Unit = {
    // new Student()
    // 1. 调用构造器,第4行
    // 2. 没有传人相关的参数,使用默认值
    val st1 = new Student()

    //new class 会发生什么?
    //new 会调用一次 构造器(或者叫构造函数) 代码
    //构造器 ==== class
    //构造器的作用: 生产对象
    new Student()
    println(st1.name)

    // new Student("dd",20)
    // 1. 调用构造器,第28行
    // 2.传人相关的参数
    val st2 = new Student("wym",19)
    println(st2.name)
  }
}

构造器的参数修饰符

  1. val 表示不可以被修改的属性

  2. var 表示可以被修改的属性

  3. 没有修饰符,表示对象的属性,无法访问

  4. 可以在两个地方写属性: (1)构造器的参数列表 (2)构造器内部

object basic30 {
  class Triangle(val a:Double,var b:Double,c:Double) {

  }
  def main(args: Array[String]): Unit = {
    val t = new Triangle(1,2,3)
    t.b = 2
  //t.c 无法访问
  }
}

写多个构造器

案例1:定义一个注册类,它提供多种注册方式

object basic31 {
  /* 
   * 支持多种创建对象的方式 ==== 在网站注册用户的时候,可以有多种注册方式:手机号,微信号,邮箱名
   */

  // 主构造器
  class User(val phone:String,var pwd:String){
    var email:String = ""
    var name:String = ""

     // 辅构造器
    def this(email:String,name:String,pwd:String){
      // 调用一次主构造器
      this("",pwd)
      // 再对其他的属性赋值
      this.name = name
      this.email = email
    }

    // 辅构造器
    def this(email:String,name:String,pwd:String,phone:String){
      // 调用一次主构造器
      this(phone,pwd)
      // 再对其他的属性赋值
      this.name = name
      this.email = email
    }

    def say(): Unit = {
      println(s"我的信息如下:")
      println(s"姓名:${name}")
      println(s"手机号:${phone}")
      println(s"邮箱:${email}")
      println(s"密码:${pwd}")

    }
  }

  def main(args: Array[String]): Unit = {
    var u1 = new User("13617891234","123456")
    u1.say()

    var u2 = new User("12345@qq.com","小朱","123456")
    u2.say()

    var u3 = new User("12345@qq.com","小胡","123456","13578543")
    u3.say()
  }
}

练习题

案例1:封装一个三角形类

object basic29 {
  class  Triangle(a:Double,b:Double,c:Double) {
    // 1.计算面积
    def getArea():Double = {
      if(check()){
        //能否根据三条边长来计算面积?
        var s = (a+b+c)/2
        s = s*(s-a)*(s-b)*(s-c)
        return Math.sqrt(s)  //Math.sqrt(4) ===> 2 就是开平方操作
      } else {
        print("不能构成三角形")
        return 0;
      }
    }
    
    // 2.检查是否能构成三角形
    def check():Boolean = {
      //任意两边之和大于第三边
      return (a+b)>c && (b+c)>c && (a+c)>b
    }
  }
  
  def main(args: Array[String]): Unit = {
    //Triangle 表示一个三角形类
    //Triangle(边长a,边长b,边长c)
    val t1 = new Triangle(3,4,5)
    println(t1.getArea()) //获取面积

    val t2 = new Triangle(1,2,3)
    println(t2.getArea()) //获取面积
  }
}