多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
**1. 定义抽象类的基础语法** ```scala abstract class ClassName(参数列表){ 抽象方法 非抽象方法 字段 } ``` * 抽象类可以同时存在抽象方法和非抽象方法,抽象方法不需要`abstract`关键字修饰 * 抽象类无法实例化,即不能被`new` * 抽象类新增抽象方法和不能被实例化外,与类的其它细节都是一样的 **2. 继承相关** * Scala的抽象类同Java的抽象类一样,只有被子类继承才能调用它的相关成员; * 当子类重写父类方法或字段时,必须使用`override`关键字修饰; * 子类必须重写父类的抽象方法,非抽象方法可选; * 无论是哪种类,子类都不能重写父类中的`var`字段; * 如果不想某个类或成员被继承,可以使用`final`修饰类或成员; **3. 定义抽象类** ```scala // 抽象类的主构造器和它的字段 abstract class Point1(var x:Int, var y:Int) { // 无参辅助构造器 def this() = { this(0, 0) } // 非抽象方法 def move(dx:Int, dy:Int):Unit={ x = x + dx; y = y + dy; } // 抽象方法,没有方法体就是抽象方法,不需要abstract关键字修饰 // 何况abstract关键字不能修饰方法 def add(x:Int, y:Int):Int } ``` 我们可以通过查看编译后的Java代码了解Scala为我们自动做了哪些事: ```java import scala.reflect.ScalaSignature; @ScalaSignature(bytes="\006\0") public abstract class Point1 { private int x; private int y; public int x() { return this.x; } public void x_$eq(int x$1) { this.x = x$1; } public int y() { return this.y; } public void y_$eq(int x$1) { this.y = x$1; } public void move(int dx, int dy) { x_$eq(x() + dx); y_$eq(y() + dy); } public abstract int add(int paramInt1, int paramInt2); public Point1(int x, int y) { } public Point1() { this(0, 0); } } ```