**1. 定義類的基礎語法:**
```
// 主構造器
class ClassName(參數列表) {
輔助構造器
成員變量
成員方法
}
```
<br/>
**2. 定義類**
(1)寫法1
```scala
// 主構造器
// Point1(xc:Int, yc:Int)是該類的主構造器
class Point1(xc:Int, yc:Int) {
// 字段
var x:Int = xc;
var y:Int = yc;
// 輔助構造器,相當于Java中構造器的重載
def this() = {
this(0, 0) // 輔助構造器的第一句必須調用該類已存在的構造器,不一定是主構造器
}
// 成員方法
def move(dx:Int, dy:Int):Unit={
x = x + dx;
y = y + dy;
}
}
```
(2)寫法2
```scala
class Point1(var x:Int, var y:Int) { // 自動生成為類的字段
// 字段。可以寫,也可以不寫了,因為會隱式地自動生成
// var x:Int = xc;
// var y:Int = yc;
def this() = {
this(0, 0)
}
def move(dx:Int, dy:Int):Unit={
xc = xc + dx;
yc = yc + dy;
}
}
```
**3. 調用**
對于類先要`new`才能調用它的字段和方法。
```scala
import org.example.oop.Point1
object App{
def main(args: Array[String]): Unit = {
// 實例化對象
val point1 = new Point1(10, 10)
println(point1.x) // 10
println(point1.y) // 10
point1.move(20, 20)
println(point1.x) // 30
}
}
```
**4. 關于類的細節**
Scala代碼由Java編譯器進行編譯,查看編譯后的Java代碼如下(無論是寫法1還是寫法2都基本一樣的)。
```java
package org.example.oop;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes="\002\0")
// 1. 定義的類的訪問權限默認為public
public class Point1
{
// 2. 成員變量默認訪問權限是private
private int x;
private int y;
// 3. 自動為成員變量提供類似于Java中的Getter方法,并且訪問權限是public
// 在上面我們point1.x,調用的其實是這個方法,而不是字段
public int x(){ return this.x; }
// 4. 自動為成員變量提供類似于Java中的Setter方法,并且訪問權限是public
// x_$eq,與 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; }
// 5. 成員方法的默認訪問權限為public
public void move(int dx, int dy)
{
x_$eq(x() + dx);
y_$eq(y() + dy);
}
// 6. 根據成員變量自動提供了兩個參數的構造器,并且默認訪問權限默認為public
public Point1(int x, int y)
{
}
// 7. 根據輔助構造器自動提供了無參構造器,默認訪問權限為public
public Point1()
{
this(0, 0);
}
}
```
1. **`this`:** 在Scala 中,`this`是關鍵字,用于引用當前對象。可以使用 this 調用實例變量、方法、構造器。
2. 如果不指定訪問修飾符,除了字段是`private`外,其它都是`public`,當然你也可以指定為`private`或`protected`。
3. Scala 類中無法定義靜態成員和方法,因為沒有 `static` 關鍵字。
4. 在Scala中,無論是字段或者成員方法,統一稱為成員變量。
5. 在Scala中,方法使用`def`關鍵字定義,任何方法的參數列表的關鍵字都是`val`,所以你不能對該參數賦值,如下:
```scala
def method(x:Int, y:Int){
// 不能對參數進行賦值
x = 10
y = 10
}
// 方法的參數列表不能使用var或val修飾
def method(var x:Int, val y:Int) {}
```
6. 統一訪問原則: 當方法無參時與字段的調用是一樣的,比如方法`def method():Unit = println("")`是無參的,它可以`obj.method()`調用或者`obj.method`調用,如果調用字段一樣。
7. 對于無參構造器,可以`new Point()`,也可以`new Point`實例化。
8. 對于無參成員方法,其實可以將關鍵字`def`轉換為`val`或者`var`,如下:
```scala
def method():Unit = { println(1000) }
var method = { println(1000) }
val method = { println(1000) }
```
區別在于,方法每次調用都會重新計算,而字段只在初始化時被計算,所以字段的運行效率比方法效率高。
9. 對于`val`定義的字段,Scala自動創建該字段的Getter方法,但是沒有Setter方法;對于`var`定義的字段,則兩者都會自動創建。
10. 如果字段使用`val`修飾則不能對其賦值,如下:
```scala
class Point1(val x:Int, var y:Int) {}
val point1 = new Point1
point1.x = 1000 // 編譯報錯
point1.y = 1000 // 編譯通過
```
- Scala是什么?
- Scala特性
- 開發環境搭建
- 環境搭建
- windows下的環境搭建
- IntelliJ IDEA環境搭建
- Scala關鍵字
- Hello, World
- 數據類型
- 數據類型
- 數據類型層次結構
- 字面量
- Null類型
- Nothing類型
- Unit類型
- 變量與常量
- type定義類型別名
- 字符串插值器
- 條件控制
- 循環控制
- 數組
- 元組
- 集合
- 集合分類
- List常用操作
- Set常用操作
- Map常用操作
- 函數
- 函數聲明與調用
- 函數與方法的區別
- 函數注意事項
- 匿名函數
- 可變參數
- 高階函數
- 中置表達式
- 函數嵌套
- 函數科里化
- 隱式參數
- 隱式函數
- 閉包
- 類和對象
- Java與Scala的比較
- 有關類與對象概念
- 類
- 類的定義和調用
- 類的繼承
- 抽象類
- 單例對象
- 伴生對象和伴生類
- 特質
- 定義特質
- 混入特質
- 抽象類與特質的選擇
- 自身類型
- 依賴注入
- this別名
- 樣例類
- 枚舉類
- 泛型類
- 包與包對象
- 模式匹配
- 基本語法
- 匹配模式
- 偏函數
- 注解
- 運算符
- 正則表達式
- 隱式類
- 異常處理
- 高級類型
- 結構類型
- 復合類型