ScalaOOP--类、伴生类和伴生对象、特质、协变逆变和不变

本文详细介绍了Scala中的面向对象特性,包括类的访问修饰符、定义与继承,抽象类,单例对象及其与伴生类的关系,特质的使用,以及协变、逆变和不变的概念。通过这些内容,读者可以深入理解Scala的面向对象编程思想。
摘要由CSDN通过智能技术生成

1、Scala面向对象基本概念

1.1 类(class)

与java相同:

1、类通过class关键字定义

2、类通过new关键字创建实例

3、类拥有成员变量和方法

4、类的成员默认为public,也支持private、protected

与java不同:

5、类中无法定义静态成员变量和方法

6、类无需明确定义构造方法,通过构造参数列表声明为类的一部分

1.1.1类的访问修饰符

java:

Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N

Scala:

Modifier Class Companion Subclass Package World
default Y Y Y Y Y
protected Y Y Y N N
private Y Y N N N

1.1.2类的定义

构造器:

​ 主构造器:一个类如果没有显示定义的主构造器则自动拥有一个无参的主构造器。

​ 辅助构造器:可以没有,也可以有多个,辅助构造器必须从调用其他构造器开始,辅助构造的名称是this。

class Student {
    //Scala主构造函数,主构造函数定义在类的头部
  //定义成员变量
  var name:String="zhang"
  var age:Int=_  //默认0
  var gender:String=_  //默认null

  //定义一个辅助构造器1(可以没有辅助构造器)
  def this(name:String,age:Int)={
   
    //辅助构造器必须从调用其他构造器开始
    this()  //调用主构造器
    this.name=name
    this.age=age
  }
  //定义一个辅助构造器2
  def this(gender:String){
   
    this("张三",18)  //调用辅助构造器1
    this.gender=gender
  }
  //定义一个成员方法
  def study()={
   
    println("good good study,day day up")
  }
}

object Test01{
   
  def main(args: Array[String]): Unit = {
   
    val stu1 = new Student()
    println(stu1.name)
    println(stu1.gender)
    println(stu1.age)
    stu1.study()

    val stu2 = new Student("zhangsan",20)
    println(stu2.name)
    println(stu2.gender)
    println(stu2.age)
    stu2.study()

    //scala中定义成员变量后,会默认生成get和set方法
    stu2.age=25
    println(stu2.age)

  }
}

1.1.3类的继承

1、Scala使用“extends”关键字实现继承

2、子类重写父类方法必须使用“override”关键字

1.2 抽象类(abstract class)

1、抽象类可包含未实现的方法,即抽象方法

2、抽象类无法实例化

3、抽象类使用“abstract”关键字修饰

  • 子类重写父类抽象方法时,“override”关键字可选

  • 子类重写父类非抽象方法,“override”关键字必写

1.3 单例对象(object)

1、Scala的类中无法定义静态成员,即无static关键字。如何像Java一样表达类的静态成员变量、成员方法与静态代码块?

2、Scala解决方案:单例对象

  • 使用“object”关键字声明,可包含变量、方法与代码定义
  • 单例对象中的成员变量、成员方法通过单例对象名直接调用
  • 单例对象第一次被访问时初始化,并执行全部代码块
  • 单例对象不能new,且无构造参数
  • 程序入口main()方法必须定义在单例对象中
  • 单例对象与同名类定义在同一文件中时形成绑定关系(伴生)

1.4 样例类(case class)

样例类常用于描述不可变的值对象(Value Object)

  1. 样例类构造参数默认声明为“val”,自动实现类构造参数的getter

  2. 样例类构造参

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值