scala学习笔记(二)——类、对象、继承、特质

时间:2021-12-20 23:10:23

lazy特性,变量如果将一个变量设置为lazy,这个变量只有在第一次使用的时候才会发生计算

<类>

//在Scala中,类并不用声明为public。
//Scala源文件中可以包含多个类,所有这些类都具有公有可见性。
class Student {
  //用val修饰的变量是只读属性,有getter但没有setter
  //(相当与Java中用final修饰的变量)
  val id = 666

  //用var修饰的变量既有getter又有setter
  var age: Int = 20

  //类私有字段,只能在类的内部使用
  private var name: String = "tom"

  //对象私有字段,访问权限更加严格的,Person类的方法只能访问到当前对象的字段
  private[this] val pet = "小强"
}

主构造方法:
   1)与类名交织在一起
   2)主构造方法运行,导致类名后面的大括号里面的代码都会运行
辅助构造方法:
   1)必须名字叫this
   2) 必须以调用主构造方法或者是其他辅助构造方法开始。

   3)里面的属性不能写修饰符

<对象>

1)object里面的方法都是静态方法

2)Object里面的字段都是静态字段

3)它本身就是一个单例,(因为不需要去new)

在Scala的类中,与类名相同的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性

通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)apply方法会被调用

<继承>

Scala中,让子类继承父类,与Java一样,也是使用extends关键字
继承就代表,子类可以从父类继承父类的field和method;然后子类可以在自己内部放入父类所没有,子类特有的field和method;使用继承可以有效复用代码

子类可以覆盖父类的field和method;但是如果父类用final修饰,field和method用final修饰,则该类是无法被继承的,field和method是无法被覆盖的


Scala中,如果子类要覆盖一个父类中的非抽象方法,则必须使用override关键字
override
关键字可以帮助我们尽早地发现代码里的错误,比如:override修饰的父类方法的方法名我们拼写错了;比如要覆盖的父类方法的参数我们写错了;等等

 此外,在子类覆盖父类方法之后,如果我们在子类中就是要调用父类的被覆盖的方法呢?那就可以使用super关键字,显式地指定要调用父类的方法

// 如果在父类中,有某些方法无法立即实现,而需要依赖不同的子来来覆盖,重写实现自己不同的方法实现。此时可以将父类中的这些方法不给出具体的实现,只有方法签名,这种方法就是抽象方法。

// 而一个类中如果有一个抽象方法,那么类就必须用abstract来声明为抽象类,此时抽象类是不可以实例化的

// 在子类中覆盖抽象类的抽象方法时,不需要使用override关键字


<特质>

类似于java的接口

特质里面的方法既可以实现,也可以不实现

实现特质,如果没有继承其它类,那么使用第一个特质使用extends后面的使用with

Scala中的Triat是一种特殊的概念
首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似
在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可
类可以使用extends关键字继承trait,注意,这里不是implement,而是extends,在scala中没有implement的概念,无论继承类还是trait,统一都是extends
类继承trait后,必须实现其中的抽象方法,实现时不需要使用override关键字
scala不支持对类进行多继承,但是支持多重继承trait,使用with关键字即可