scala面向对象综述

一、Scala面向对象编程综述

1.1 Scala是纯粹的面向对象的语言

以Java为例, Java并不是一门纯面向对象的语言,其允许非对象值的存在,也允许不属于任何对象的静态字段和方法存在。
Scala是纯粹的面向对象的语言,每个值都是对象,每个操作都是方法调用。

1.2 Scala大量重用了 Java中的类型

Scala与 Java完全兼容, Scala程序会被编译成 Java字节码,访问 Java字段,继承 Java类,实现 Java接口都不需要特别的语法,实际上 Scala也使用了大量的Java库代码。比如 Scala String类与 java.lang.String一样。

1.3 Scala OOP比较 Java OOP的主要差异

  • Scala取消了接口( Interface),新增了类似的 特质 概念( Trait)
  • Scala取消静态字段和方法,新增 单例对象 的概念( Singleton Object)
  • Scala新增了 样例类 case class)

二、类和对象

  • 类是对对象的抽象模板,描述了该类对象可以拥有的属性和方法
  • 对象是类 的具体实例
  • 类和对象最明显的 区别:类不占用内存,对象占用内存

2.1类的定义

Scala与 Java创建普通类的方式基本一样:

class 类名 (参数列表 ){
辅助构造器
成员变量
成员方法
}
  • Scala提出主构造器与辅助构造器的概念,类似 Java构造方法。主构造器是 “类名 (构造参数列表 )” ,辅助构造器 this(构造参数列表 )” ,辅助构造器类似于 Java中的构造方法重载,所有构造器都没有返回值。注意辅助构造器必须间 接或直接调用主构造器。
  • Scala中,“ this” 是关键字,用于引用当前对象。可以使用 this调用实例变量、方法、构造器。
  • Scala类成员默认为 public ,也可修改为 privateprotected
  • Scala类中无法定义静态成员和方法,因为没有 static关键字。
  • 类中可以有字段和方法,统称为成员变量。字段可以用var或 val定义,都是指向对象的变量。

示例: 创建一个 Studnet 类

class Student() {    //默认无参。括号可以不加    默认有一个无参构造器
  //定义成员变量      //使用var修饰自带了get、set方法, val只有get方法
  var name:String="张三"      //设置name默认值为 张三
  var age:Int= _    //默认为0
  var gender:String = _  //默认null
  var banji:Int = 1   //设置班级默认为1

  //定义一个辅助构造器1,设置 name,age属性
  def this(name:String,age:Int)={      
    //辅助构造器必须从调用其他构造器开始
    this()
    this.name=name
    this.age=age
  }
  //定义一个辅助构造器2,设置gender属性
  def this(gender:String){          
    this("李四",18)      //可以在this中设置name,age的默认值
    this.gender =gender
  }

  //定义一个成员方法
  def study()={
    println(name+"喜欢学习scala")
  }
}

  object Test01{    //main方法只能写在object中
    def main(args: Array[String]): Unit = {
      //使用默认无参的构造方法
      val stu1: Student = new Student()
      println(stu1.name)
      println(stu1.age)
      println(stu1.gender)
      stu1.study()
      //控制台输出:
      /*张三
      0
      null
      张三喜欢学习scala
      */

      //调用辅助构造器1
      val stu2: Student = new Student("小明", 22)
      println(stu2.name)
      println(stu2.age)
      println(stu2.gender)
      stu2.study()
       //控制台输出:
      /*小明
      22
      null
      小明喜欢学习scala
      */
      
      //调用辅助构造器2
      val stu3=new Student("男")
      println(stu3.name)
      println(stu3.age)
      println(stu3.gender)
      stu3.age=18
      stu3.study()
        //控制台输出:
      /*李四
      18
      男
      李四喜欢学习scala
      */
    }
  }

除了上面介绍的类定义方法,还有一种更简便的创建类的方式:

class Dog(val name: String,var age:Int){ //自动生成类的属性
  def cry()=println("wow ...")
}

object Dog {
  val dog = new Dog("Harry",2)
  dog.name="Wang" //编译错误,需要将val类型改成var
  dog.age=3 //编译通过
}

注: 主构造器中,使用val的定义的变量自动生成 getter var定义的变量自动生成 getter&setter。在 Scala中,严格来说是没有 getter和 setter这个说法,使用了“ value”和 value_=”两个方法来分别代替了 getter和 setter。如下所示:

class Counter(var value:Int)
class Counter{
	private var privateValue = 0  //私有变量,外界无法直接访问
	def value = privateValue  //定义一个方法,代替 getter
	def value_= ( newValue : Int ){   // value_= 是方法名字 ,代替 setter
	value = newValue     //将 newValue 赋值给 value,类似于set方法
	} //注意, scala中默认方法是 public的
}

猜你喜欢

转载自blog.csdn.net/and52696686/article/details/107704837