类和对象

47 阅读2分钟

面向对象

它是一种编程思想,它是基于面向对象的,强调的是以对象为基础完成各种操作。
1. 面向对象的三大特征是

(1) 封装

(2) 继承

(3) 多态

 类是属性和行为的集合。

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

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

在Scala中,用class来创建类,用new来创建对象

//定义类
class Person(){}

class Student(){}

def main(args: Array[String]): Unit ={
  //实例化对象
  val p1 =new Person()

  val s1 =new Student()

  println(p1)
  println(s1)
}

定义和访问成员

在本质上和java的set,get类似。 要注意:

1.val定义的变量可以生成 get。可以访问。

2.var定义的变量可以生成 get + set。可以访问 + 修改。

3.使用private修饰的变量,既不可以访问,也不可以修改。

class Person() {}

class Student() {
  //var 可修改
  //val 不可修改
  var name:String="校花"
  var age:Int=18
}
def main(args: Array[String]): Unit ={
  //实例化对象
  val p1 =new Person()
  val s1 =new Student()
  println(p1)
  println(s1.name)
  s1.name="小花"
  println(s1.name)
}

构造函数

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

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

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

class Student(var name:String="校花", var age:Int=18) {
  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()
}

应用

class Triangle(var a:Double=1.0, var b:Double=1.0,var c:Double=1.0){
  println(s"${a},${b},${c}")
  def check():Boolean={
     return a+b>c && b+c>a && a+c>b
  }
}
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)

  if(t1.check()){
    println("能构成三角形")
}else{
    println("不能构成三角形")
  }
}

image.png

class Triangle(var a:Double=1.0, var b:Double=1.0,var c:Double=1.0){
  println(s"${a},${b},${c}")
  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 ={
val t1 = new Triangle(3,4,7)
println(t1.getArea())

val t2 = new Triangle(3,4,3)
println(t2.getArea())
}

image.png

辅助构造器的作用

1. 提供多种初始化方式:

辅助构造器允许您为类提供多种初始化选项,使得创建对象时更加灵活。例如,您可以定义一个不需要所有参数的构造器。

2.简化对象创建:

通过定义多个辅助构造器,您可以简化对象的创建过程,避免在主构造器中处理过多的参数。

3.调用主构造器:

辅助构造器可以通过 this 关键字调用主构造器,从而确保所有初始化逻辑都集中在主构造器中。

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()
}

构造器中的参数的类型

1.val定义的属性,不能修改 2.var定义的属性,可以修改 3.没有val,也没有var的 ,不是对象的属性。不能使用 。语法来访问

辅助构造器

// 多种注册用户的方式 --- 辅助构造器
// 1. 手机号 + 密码
// 2. 邮箱 + 密码 + 用户名
class Register(val name: String, var email: String, var pwd: String, var phone: String) {
  println("主构造器调用")
  // 辅助构造器1:手机号+密码
  def this(phone: String, pwd: String) {
    this("随机用户xxxxxx", "xxxxx@qq.com", pwd, phone)
    println("辅助构造器调用")
  }
  // 辅助构造器2:邮箱+密码+用户名
  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("13617885566", "123456") // 使用手机号注册
    val r2 = new Register("19456651@qq.com", "123456", "小明") // 使用邮箱注册
    r1.say()
    r2.say()
  }