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关键字即可