**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);
}
}
```
- Scala是什么?
- Scala特性
- 开发环境搭建
- 环境搭建
- windows下的环境搭建
- IntelliJ IDEA环境搭建
- Scala关键字
- Hello, World
- 数据类型
- 数据类型
- 数据类型层次结构
- 字面量
- Null类型
- Nothing类型
- Unit类型
- 变量与常量
- type定义类型别名
- 字符串插值器
- 条件控制
- 循环控制
- 数组
- 元组
- 集合
- 集合分类
- List常用操作
- Set常用操作
- Map常用操作
- 函数
- 函数声明与调用
- 函数与方法的区别
- 函数注意事项
- 匿名函数
- 可变参数
- 高阶函数
- 中置表达式
- 函数嵌套
- 函数科里化
- 隐式参数
- 隐式函数
- 闭包
- 类和对象
- Java与Scala的比较
- 有关类与对象概念
- 类
- 类的定义和调用
- 类的继承
- 抽象类
- 单例对象
- 伴生对象和伴生类
- 特质
- 定义特质
- 混入特质
- 抽象类与特质的选择
- 自身类型
- 依赖注入
- this别名
- 样例类
- 枚举类
- 泛型类
- 包与包对象
- 模式匹配
- 基本语法
- 匹配模式
- 偏函数
- 注解
- 运算符
- 正则表达式
- 隐式类
- 异常处理
- 高级类型
- 结构类型
- 复合类型