大数据学习之Scala——03Scala面向对象编程(一)

一. 类与对象

1. 类与对象的区别和联系

  1. 类是抽象的,概念的,代表一类事物
  2. 对象是具体的,实际的,代表一个具体事物
  3. 类是对象的模板,对象是类的一个个体,对应一个实例
  4. Scala中类和对象的区别和联系 和 Java是一样的。

2. 类

1. 如何定义类
  1. 基本语法

    [修饰符] class 类名 {
       类体
    } 
    
2. 定义类的注意事项
  1. scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
  2. 一个Scala源文件可以包含多个类.
3. 属性/成员变量注意事项
  1. 属性的定义语法同变量,示例:[访问修饰符] var 属性名称 [:类型] = 属性值
  2. 属性的定义类型可以为任意类型,包含值类型[AnyVal]或引用类型[AnyRef]
  3. Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略(这点和Java不同)。[案例演示]
  4. 如果赋值为null,则一定要加类型,因为不加类型, 那么该属性的类型就是Null类型.
  5. 如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值.
    在这里插入图片描述
  6. 不同对象的属性是独立,互不影响,一个对象对属性的更改,不影响另外一个。

3. 对象

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

4. 构造器

1. 基本介绍
  1. 构造器(constructor)又叫构造方法,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。
  2. Scala类的构造器包括: 主构造器(一个) 和 辅助构造器(多个)
2. Scala构造器的基本语法

辅助构造器 函数的名称this, 可以有多个,编译器通过不同参数(个数或类型)来区分.

class 类名(形参列表) {  // 主构造器
   	// 类体
   def  this(形参列表) {  
   	// 辅助构造器
   }
   def  this(形参列表) {  
   	//辅助构造器可以有多个...
   }
}  
3. 构造器参数
  1. Scala类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量。外部不能访问该变量

    object Test04 {
      def main(args: Array[String]): Unit = {
        val p3: Person1 = new Person1("李四", 25)
        // println(p3.name) // 报错
        println(p3)
      }
    }
    
    class Person1(name: String) {
      var age: Int = _
      def this(xname: String, xage: Int){
        this(xname)  // 主构造器
        this.age = xage
      }
      override def toString: String = {
        s"姓名是: $name, 年龄是: $age"
      }
    }
    
  2. 如果参数使用val关键字声明,那么Scala会将参数作为类的私有的只读属性使用 , 不能修改

    object Test04 {
      def main(args: Array[String]): Unit = {
        val p3: Person1 = new Person1("李四", 25)
        println(p3.name)
        // p3.name = "张三"   // 报错
        println(p3)
      }
    }
    class Person1(val name: String) {
      var age: Int = _
      def this(xname: String, xage: Int){
        this(xname)  // 主构造器
        this.age = xage
      }
      override def toString: String = {
        s"姓名是: $name, 年龄是: $age"
      }
    }
    
  3. 如果参数使用var关键字声明,那么Scala会将参数作为类的成员属性使用,并会提供属性对应的xxx()[类似getter]/xxx_$eq()[类似setter]方法,即这时的成员属性是私有的,但是可读写。

    object Test04 {
      def main(args: Array[String]): Unit = {
        val p3: Person1 = new Person1("李四", 25)
        println(p3.name)
        p3.name = "张三"
        println(p3)
      }
    }
    class Person1(var name: String) {
      var age: Int = _
      def this(xname: String, xage: Int){
        this(xname)  // 主构造器
        this.age = xage
      }
      override def toString: String = {
        s"姓名是: $name, 年龄是: $age"
      }
    }
    
4. Scala构造器注意事项和细节
  1. Scala构造器作用是完成对新对象的初始化,构造器没有返回值。

  2. 主构造器的声明直接放置于类名之后

  3. 主构造器会执行类定义中的所有语句(把类中写的语句放入到主构造器),这里可以体会到Scala的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别

  4. 如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略

  5. 辅助构造器名称为this(这个和Java是不一样的),多个辅助构造器通过不同参数列表进行区分, 在底层就是构造器重载。

    object Test04 {
      def main(args: Array[String]): Unit = {
        val p1: Person = new Person("张三")
        val p2: Person = new Person(20)
        val p3: Person = new Person("李四", 25)
        println(p1)
        println(p2)
        println(p3)
      }
    }
    
    // 因为Person类没有参数, 所以主构造器为空
    class Person() {
      var name: String = _
      var age: Int = _
    
      def this(xname: String) {
        this()  // 主构造器
        this.name = xname
      }
    
      def this(xage: Int) {
        this()  // 主构造器
        this.age = xage
      }
    
      def this(xname: String, xage: Int){
        this()  // 主构造器
        this.name = xname
        this.age = xage
      }
    
      override def toString: String = {
        s"姓名是: $name, 年龄是: $age"
      }
    }
    
  6. 如果想让主构造器变成私有的,可以在()之前加上private,这样用户不能直接通过主构造器来构造对象了

  7. 辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复)

5. Scala对象创建对象流程分析
  1. 加载类的信息(属性信息和方法信息), 如果父类也没有加载, 则由父到子加载父类
  2. 在内存中(堆)给对象开辟空间
  3. 使用父类的构造器(主构造器/辅助构造器)完成父类的初始化 (多个父类)
  4. 使用本类的主构造器完成初始化
  5. 使用本类的辅助构造器继续初始化
  6. 将对象在内存中的地址赋给 p 这个引用

声明:

  1. 本文参考了尚硅谷Scala课程的课件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值