scala中类和对象

50 阅读2分钟

面向对象

  1. 概念:面向过程(c)-->面向对象(java/scala)<比较复杂>
  2. 面向对象的特点:
  • ①.更符合人的思考习惯 -②.把复杂的事情简单化 -③.把程序员从执行者变成指挥者
  1. 类class(类是属性行为的集合):
  • ①.属性也叫成员变量:名词,用来描述事物的外在特征
  • ②.行为也叫成员方法:动词,表示事物能做什么
  1. 面向对象的特征:①. 封装②. 继承③. 多态

创建类和对象

Person就是一个类名,理解为变量名(首字母大写,类名一般为名词)

object Base31 {
  def main(args: Array[String]): Unit = {
    
    //定义类:
    class Person(){}
    class Student(){}
    
    def main(args: Array[String]): Unit = {

      //实例化对象:  
      val p1 = new Person()

      val s1 = new Student()

      println(p1)
      println(s1)

    }
  }
}

定义和访问成员变量

把功能都封装在class中: ①.属性 ②.方法 ③.辅助构造器

object Base31 {
  def main(args: Array[String]): Unit = {

    //定义类:
    class Person(){}
    class Student() {
      //在类中,定义就是变量
      var name: String = "小花"
      var age: Int = 18
    }

    def main(args: Array[String]): Unit = {

      //实例化对象:
      val p1 = new Person()

      val s1 = new Student()

      //访问成员变量
      println(s1.name)
      //修改成员变量
      s1.name="小花花"
      
      println(s1.name)

    }
  }
}

定义和访问成员方法(函数)

//类的方法-函数
def say(): Unit = {
  println(s"${name},${age}")

带参数的构造器(构造函数)<即将参数直接放入构造器中>

object Base32 {
  def main(args: Array[String]): Unit = {

    //带参数的构造器(构造函数)
    //定义类:
    class Person() {}
    class Student(var name: String = "小花", var age: Int = 18) {

      println("Student.....被调用了...")

      //在类中,定义就是变量
      //类的属性-变量
      //var name: String = "小花"
      //var age: Int = 18

      //类的方法-函数
      def say(): Unit = {
        println(s"${name},${age}")
      }
    }

      //实例化对象:

      val s1 = new Student()
      s1.say()

      val s2 = new Student("小明", 19)
      s2.say()
    




  }
}

eg:求三角形的面积:

  • 1.求三角形的面积
    1. 判断是否是个三角形
  • 3.构成三角形的条件是:任意两边之和 > 第三边
object Base33 {
      // 1.求三角形的面积
      // 2. 判断是否是一个三角形。
      class Triangle(var a: Double = 1.0, var b: Double = 1.0, var c: Double = 1.0) {
        // 检查是否构成三角形,结果是 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)){
        //}


      }
}

构造器的默认值

  • ①.必填项(姓名,年龄)
  • ②.有默认项(性别:男;民族:汉)
  • eg:
object Base34 {
  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(ages:Array[String]): Unit = {
    //var s0=new Student()//gender和nav使用默认值
    var s1=new Student("小明",19)
    s1.say()

    var s2=new Student("小花",18,"女","回族")
    s2.say()
  }
}

构造器中的参数中的类型

  • ①.val定义的属性,不能修改
  • ②.var定义的属性,可以修改
  • ③.没有var,也没有val的,不是对象的属性,不能使用语法来访问
object Base35 {
  class Student(val name:String,var age:Int,var gender:String="男",var nav:String="汉族") {
    def say(): Unit = {
      println(s"${name},${age},${gender},${nav}")
    }
  }
  def main(ages:Array[String]): Unit = {
    //var s0=new Student()//gender和nav使用默认值
    var s1=new Student("小明",19)
    s1.age=20
    s1.say()
  }
}

辅助构造器

    1. 名称一定是this
    1. 在辅助构造器内部,一定要调用主构造器this
    1. 可以有多个
  • eg: 多种注册用户的方式 --- 辅助构造器 ①. 手机号 + 密码②.邮箱 + 密码 + 用户名

object Base36 {
  class Register(val name: String, var email: String, var pwd: String, var phone: String) {

    println("主构造器被调用")
    def this(phone: String, pwd: String) {
      this("默认用户xxxxxx", "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("小明", "12323@qq.com", "123456", "13617885566")
      // 调用辅助构造器
      val r1 = new Register("13617885566", "123456")
      val r2 = new Register("9456651@qq.com", "123456", "小明")

      r1.say()
      r2.say()
    }

}