---
# System prepended metadata

title: 強型別 vs. 弱型別
tags: [強型別vs弱型別]

---

# 強型別 vs. 弱型別
###### tags: `強型別vs弱型別`
## 強型別
以Java為例，企圖在數字運算過程混進一個字串：
```
int x = 123 + "456";
System.out.println(x);
```
得到了一個編譯錯誤
```
HelloWorld.java:4: error: incompatible types: String cannot be converted to int
```
很明確的告訴你，在 Java 不能用隱喻的方式，企圖直接將字串轉成整數，如果你想實現的是將「數字 123 」和「字串 "456" 轉成的數字」相加，你必須用 Java 能接受的方式明確表明，比如：
```
int x = 123 + Integer.parseInt("456");
System.out.println(x);
```
* 強型別的語言，偏向不容忍隱性的型別轉換。

## 弱型別
以 PHP 為例：
```
$x = 123 + "456";
echo $x;
```
執行結果
```
579
```
* 弱型別的語言，這類語言偏向容忍隱性的型別轉換。
## 總結強型別和弱型別的定義和差別
* 強型別(strongly typed)：偏向不容許隱性型別轉換，型別檢查上較為嚴格。
* 弱型別(weakly typed)：偏向容許隱性型別轉換，型別檢查上較為寬鬆。



|靜態語言 / 動態語言| 強型別 / 弱型別 | 程式語言 |
| -------- | -------- | -------- |
| 靜態     | 強     | Java, C#     |
| 靜態     | 弱     | C/C++     |
| 動態     | 強     | Python, Ruby     |
| 動態     | 弱     | Perl, PHP, JavaScript     |

## 靜態語言以及動態語言
* 靜態語言: 能在編譯時期確認與檢查型別，並且在執行的時候不能改變結構
> * 明確定義屬性為顯式類型如：String something = "something"
> * 透過類型自動推導的為隱式類型如：var something = "something"
* 動態語言: 在執行時確認與檢查型別，也能在執行時改變結構，例如:建立新方法或新屬性。

[動態語言與靜態？直譯與編譯？強型別與弱型別？](https://millenniummeetonce.blogspot.com/2018/04/blog-post_5.html)


[上述內容，參考文章](https://ithelp.ithome.com.tw/articles/10202260)