**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別名
- 樣例類
- 枚舉類
- 泛型類
- 包與包對象
- 模式匹配
- 基本語法
- 匹配模式
- 偏函數
- 注解
- 運算符
- 正則表達式
- 隱式類
- 異常處理
- 高級類型
- 結構類型
- 復合類型