继承的作用:代码复用,提高扩展性和维护性
当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义公共的属性和方法,子类继承父类即可
子类继承了所有属性,私有属性不可以直接访问,需要通过公共的方法访问

  1. object ExtendsDemo {
  2. def main(args: Array[String]): Unit = {
  3. val dog = new Dog
  4. dog.printMsg()
  5. dog.roar()
  6. // dog.eat // 该方法无法访问,因为是 protected 修饰的,只能在子类中访问,同包中不能访问
  7. }
  8. }
  9. // 父类(基类)
  10. class Animal {
  11. var name: String = _
  12. protected var age: Int = _
  13. // color 属性在子类中无法访问
  14. private var color: String = _
  15. protected def eat(): Unit = {
  16. println("eating~~~")
  17. }
  18. def roar(): Unit = {
  19. println("roaring~~~")
  20. }
  21. }
  22. // 子类
  23. class Dog extends Animal {
  24. def printMsg(): Unit = {
  25. this.name = "dog"
  26. this.age = 22
  27. eat()
  28. println(s"name=$name, age=$age")
  29. }
  30. override def roar(): Unit = println("汪汪汪~~~")
  31. }

默认:什么地方都可以访问
protected:只有子类可以访问
private:只有本类或伴生对象可以访问

重写方法

重写一个非抽象非私有的方法需要使用 override 关键字,调用超类的方法使用super关键字

  1. class A {
  2. protected def fun1() { println("haha") }
  3. }
  4. class B {
  5. override def fun1() { println("xixi") }
  6. }