第六章 scala面向对象基础

6.1 通过一个例子入门

张老太养了两只猫:一直名字叫小白,今年3岁,白色。还有一只叫小花,今年10岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名字错误时,就显示张老太没有这只猫。

问题:

  1. 猫有三个属性,类型不一样。
  2. 如果使用普通变量就不好管理。
  3. 使用一种新的「数据类型」可以管理多个不同类型的数据【属性】,可以对属性进行操作-「方法」

scala语言是面向对象的

  • Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型,null,静态方法等等
  • Scala语言是来自于Java,所以天生就是面向对象的语言,而且Scala是纯粹的面向对象的语言,即在Scala中,一切都是对象。
  • 在面向对象的学习过程中可以对比着Java语言学习。

对上面的例子写成Cat类

object TestScala {
  def main(args: Array[String]): Unit = {
    //创建一只猫
    val cat = new Cat
    //给猫的属性赋值
    cat.name = "小白"
    cat.age = 10
    cat.color = "白色"
  }
}

//定义一个类
class Cat{
  //声明三个属性,并且需要赋初始值
  //说明:
  //1.当我们声明了var name :String时,在底层对应 private name
  //2. 同时会生成两个public方法 name(),类似于 public String getName() 方法
  var name:String = ""
  var age:Int = 0
  var color:String = ""
}


object TestScala {
  def main(args: Array[String]): Unit = {
    //创建一只猫
    val cat = new Cat
    //给猫的属性赋值
    cat.name = "小白"
    cat.age = 10
    cat.color = "白色"
  }
}

//定义一个类
class Cat{
  //声明三个属性,并且需要赋初始值
  //说明:
  //1.当我们声明了var name :String时,在底层对应 private name
  //2. 同时会生成两个public方法 name(),类似于 public String getName() 方法
  var name:String = ""
  var age:Int = 0
  var color:String = ""
}

说明:

  1. 当我们声明了var name :String时,在底层对应 private name
  2. 同时会生成两个public方法 name(),类似于 public String getName() 方法

6.2 类的定义

[修饰符] class 类名{
    类体
}

[修饰符] class 类名{
    类体
}
6.2.1 定义类的注意事项
  • scala语法中,类并不声明为public,所有这些类都具有共有可见性(即默认就是public)
  • 一个scala源文件可以包含多个类。
  • 定义的属性可以是值数据类型,也可以是引用类型。
6.2.2 属性/成员变量注意事项
  • 属性的定义语法同变量,示例:[访问修饰符] var 属性名称 [:类型] = 属性值
  • 属性的定义类型可以为任意类型,包含值类型或引用类型
  • Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略(这点和Java不同)
  • 如果赋值为null,则一定要加类型,因为不加类型,那么概述性的类型就是Null类型。

6.3 创建对象

基本语法

val | var 对象名 : 类型 = new 类型()

val | var 对象名 : 类型 = new 类型()

说明:

  • 如果我们不希望改变对象的引用(即:内存地址),应该声明val性质的,否则声明为var,scala设计者推荐使用val,因为一般来说,在程序中,我们只是改变对象属性的值,而不是改变对象的引用。
  • scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,「但当类型和后面new对象类型有继承关系即多态时,就必须写了」

6.4 类和对象的内存分配机制

同java的类和对象内存分配机制相同,如图所示:

可以在一个方法中使用两个axios吗_可以在一个方法中使用两个axios吗