抽象方法不需要加关键字,只有声明,没有具体实现
可以声明抽象字段,没有初始值
子类重写父类的抽象方法或者抽象字段,不需要加override

抽象属性和抽象方法

1.基本语法
(1)定义抽象类:

  1. abstract class Person{} //通过abstract关键字标记抽象类

(2)定义抽象属性:

  1. val|var name:String //一个属性没有初始化,就是抽象属性

(3)定义抽象方法:

  1. def hello():String //只声明而没有实现的方法,就是抽象方法

2.案例实操

  1. abstract class Person {
  2. val name: String
  3. def hello(): Unit
  4. }
  5. class Teacher extends Person {
  6. val name: String = "teacher"
  7. def hello(): Unit = {
  8. println("hello teacher")
  9. }
  10. }

继承&重写

  1. 如果父类为抽象类,那么子类需要将抽象的属性和方法实现,否则子类也需声明为抽象类
  2. 重写非抽象方法需要用override修饰,重写抽象方法则可以不加override
  3. 子类中调用父类的方法使用super关键字
  4. 子类对抽象属性进行实现,父类抽象属性可以用var修饰;子类对非抽象属性重写,父类非抽象属性只支持val类型,而不支持var;因为var修饰的为可变变量,子类继承之后就可以直接使用,没有必要重写
  5. Scala中属性和方法都是动态绑定,而Java中只有方法为动态绑定

案例实操(对比Java与Scala的重写)
scala

  1. class Person {
  2. val name: String = "person"
  3. def hello(): Unit = {
  4. println("hello person")
  5. }
  6. }
  7. class Teacher extends Person {
  8. override val name: String = "teacher"
  9. override def hello(): Unit = {
  10. println("hello teacher")
  11. }
  12. }
  13. object Test {
  14. def main(args: Array[String]): Unit = {
  15. val teacher: Teacher = new Teacher()
  16. println(teacher.name)
  17. teacher.hello()
  18. val teacher1: Person = new Teacher
  19. println(teacher1.name)
  20. teacher1.hello()
  21. }
  22. }
  1. 输出结果:
  2. teacher
  3. hello teacher
  4. teacher
  5. hello teacher

Java
补充:Java中多态就是父类引用指向子类对象,静态绑定→编译看左,动态绑定→运行看右

  1. class Person {
  2. public String name = "person";
  3. public void hello() {
  4. System.out.println("hello person");
  5. }
  6. }
  7. class Teacher extends Person {
  8. public String name = "teacher";
  9. @Override
  10. public void hello() {
  11. System.out.println("hello teacher");
  12. }
  13. }
  14. class TestDynamic {
  15. public static void main(String[] args) {
  16. Teacher teacher = new Teacher();
  17. Person teacher1 = new Teacher();
  18. System.out.println(teacher.name);
  19. teacher.hello();
  20. System.out.println(teacher1.name);
  21. teacher1.hello();
  22. }
  23. }
  1. 输出结果:
  2. teacher
  3. hello teacher
  4. person
  5. hello teacher