1)scala中,让子类继承父类,与java一样,使用extends关键字
2)继承就代表,子类可以从父类继承父类的field和method,然后子类可以在自己内部放入父类所没有,子类特有的filed和method,使用继承可以复用代码
3)子类可以覆盖父类的filed和method,但是要注意的是final关键字,代表field和method无法覆盖
4)子类中的方法要覆盖父类中的方法,必须写override
5)子类中的属性val要覆盖父类中的属性,必须写override
6)父类中的变量不可以覆盖
4)定义抽象类
abstract class Animal { //定义一个抽象类,用于继承
var age :Int = 2
val weight:Double = 35
//抽象方法,没有具体的实现
def color()
//非抽象方法,有具体的实现
def eat()={
println("吃食物")
}
//使用了final关键字,表示不能重写, override
final def action():Unit = {
println ("奔跑")
}
}
/**
* 如果想实现父类的方法:CTRL+I
* 如果想重写父类的方法:CTRL+O
*/
class Monkey extends Animal{
//重写父类字段
override var age:Int = 15
override val weight: Double = 15
//抽象方法,没有实现(重写父类抽象的方法,可以选择性的使用override)
override def color(): Unit = {
println("棕色")
}
//非抽象方法有实现了,(重写父类非抽象方法,必须使用override)
override def eat(): Unit = {
println("吃桃子")
}
}
object Monkey{
def main(args: Array[String]): Unit = {
val monkey = new Monkey
println(monkey.weight)
println(monkey.color())
println(monkey.eat())
println(monkey.action())
}
}
(*)多态
1)什么是多态:目的是为了让代码更加,降低耦合
有继承或实现特质(接口)
父类引用指向子类对象或接口指向实现类
方法需要重写
abstract class Element {
def demo(): Unit ={
println("Element's invoked")
}
}
class ArrayElement extends Element{
override def demo(): Unit = {
println("ArrayElement's invoked")
}
}
class LineElement extends ArrayElement{
override def demo(): Unit = {
println("LineElement's invoked")
}
}
class UniforElement extends Element //没有重写父类方法
object ElementTest{
//参数类型为祖宗类,任何子类实例都可以传递(基类)
def invokedDemo(e:Element): Unit ={
e.demo() //多态,在运行时调用相应子类方法
}
def main(args: Array[String]): Unit = {
invokedDemo(new ArrayElement) //父类引用指向子类对象
invokedDemo(new LineElement) //祖父类引用指向孙类对象
invokedDemo(new UniforElement) //没有重写父类方法,所以调用的时候输出祖宗类demo
}
}
}
(*)trait:特质
1)scala 特征:相当于Java中的接口,实际上他比接口功能强大
2)与接口不同的是:是可以定义属性和方法的实现
3)一般情况下scala的类只能被继承单一父类,但是如果是trait的话可以实现多个继承,从结果上来看就是实现了多继承
4)trait定义的方式与类类似,但是它使用的关键字是trait