沒事多翻書html
Javajava
kotlin安全
Dartasync
關於Java程序,請務必牢記如下幾點。
區分大小寫 - Java區分大小寫,所以標識符Hello
和hello
在Java中具備不一樣的含義。
類名 - 對於全部類名,第一個字母應爲大寫。 若是使用多個單詞來造成類的名稱,則每一個內部單詞的第一個字母應爲大寫。
示例:class MyFirstJavaClass
方法名稱 - 全部方法名稱都應以小寫字母開頭。若是使用多個單詞來造成方法的名稱,那麼每一個內部單詞的第一個字母應該是大寫字母。
示例:public void myMethodName()
程序文件名 - 程序文件的名稱應與類名徹底匹配。保存文件時,應使用類名保存它(記住Java區分大小寫)並在名稱的末尾使用擴展名稱:.java
(若是文件名和類名不匹配,則程序將沒法編譯))。但請注意,若是代碼文件中沒有public class
,則文件名可能與類名不一樣。在代碼文件中也沒有強制要求必須有public class
。
示例:假設MyFirstJavaProgram
是類名,那麼該文件應保存爲: MyFirstJavaProgram.java 。
public static void main(String args[])
− Java程序處理從main()
方法開始,該方法是每一個Java程序的必需部分。
全部Java組件都須要名稱。 用於類,變量和方法的名稱稱爲 標識符 。
在Java中,標識符的命名有幾點要記住。 它們以下 -
A
到Z
或a
到z
),貨幣字符($
)或下劃線(_
)開頭。age
,$salary
,_value
,__1_value
。123abc
,-salary
。與其餘語言同樣,能夠經過使用修飾符來修改類,方法等。 修飾符分爲兩類 -
default
, public
, protected
, private
;final
,abstract
,strictfp
;在下一節中學習有關修飾符的更多細節。
如下是Java中的變量類型 -
數組是存儲多個相同類型變量的對象。 可是,數組自己是堆上的對象。
枚舉是在Java 5.0中引入的。 枚舉將變量限制爲僅具備少數預約義值之一。此枚舉列表中的值稱爲枚舉。
經過使用枚舉,能夠減小代碼中的錯誤數量。
例如,在新鮮果汁店中,可將玻璃杯大小限制爲: 小杯 , 中杯 和 大杯 。 這將確保它不容許購買除了小杯,中杯或大杯以外的玻璃杯。
示例代碼:
class FreshJuice {
// 定義枚舉
enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String args[]) {
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
System.out.println("玻璃杯大小: " + juice.size);
}
}
Java
複製代碼
編譯並執行上面示例代碼,獲得如下結果:
玻璃杯大小: MEDIUM
Shell
複製代碼
注 - 枚舉能夠單獨聲明或在類中聲明。 方法,變量,構造函數也能夠在枚舉內定義。
如下列表中列出了Java中的保留字(關鍵字)。這些保留字不能用做常量或變量或任何其餘標識符名稱。
abstract | assert | boolean | break |
---|---|---|---|
byte | case | catch | char |
class | const | continue | default |
do | double | else | enum |
extends | final | finally | float |
for | goto | if | implements |
import | instanceof | int | interface |
long | native | new | package |
private | protected | public | return |
short | static | strictfp | super |
switch | synchronized | this | throw |
throws | transient | try | void |
volatile | while |
Java支持與C和C++很是類似的單行和多行註釋。Java編譯器會忽略任何註釋中可用的全部字符。
示例代碼:
public class MyFirstJavaProgram {
/* This is my first java program.
* This will print 'Hello World' as the output
* This is an example of multi-line comments.
*/
public static void main(String []args) {
// 這是單行註釋
/* 這也是一個單行註釋 */
/* 這是一個
多行的
註釋
*/
System.out.println("Hello World");
}
}
Java
複製代碼
在Java中,類能夠從類派生(繼承)。 若是須要建立一個新類,而且已經有一個包含須要的代碼的類,那麼能夠直接從這個現有代碼派生一個新類。
此概念可重用現有類的字段和方法,而無需在新類中重寫代碼。 在這種狀況下,現有類稱爲超類,派生類稱爲子類。
在Java語言中,接口能夠定義爲對象之間如何相互通訊的契約。 在涉及繼承的概念時,接口起着相當重要的做用。
接口定義一些方法,在派生類(子類)應該使用這些方法。 可是這些方法的實現徹底取決於子類。
Kotlin 文件以 .kt 爲後綴。
代碼文件的開頭通常爲包的聲明:
package com.runoob.main
import java.util.*
fun test() {}
class Runoob {}
複製代碼
kotlin源文件不須要相匹配的目錄和包,源文件能夠放在任何文件目錄。
以上例中 test() 的全名是 com.runoob.main.test、Runoob 的全名是 com.runoob.main.Runoob。
若是沒有指定包,默認爲 default 包。
有多個包會默認導入到每一個 Kotlin 文件中:
函數定義使用關鍵字 fun,參數格式爲:參數 : 類型
fun sum(a: Int, b: Int): Int { // Int 參數,返回值 Int
return a + b
}
複製代碼
表達式做爲函數體,返回類型自動推斷:
fun sum(a: Int, b: Int) = a + b
public fun sum(a: Int, b: Int): Int = a + b // public 方法則必須明確寫出返回類型
複製代碼
無返回值的函數(相似Java中的void):
fun printSum(a: Int, b: Int): Unit {
print(a + b)
}
// 若是是返回 Unit類型,則能夠省略(對於public方法也是這樣):
public fun printSum(a: Int, b: Int) {
print(a + b)
}
複製代碼
函數的變長參數能夠用 vararg 關鍵字進行標識:
fun vars(vararg v:Int){
for(vt in v){
print(vt)
}
}
// 測試
fun main(args: Array<String>) {
vars(1,2,3,4,5) // 輸出12345
}
複製代碼
lambda表達式使用實例:
// 測試
fun main(args: Array<String>) {
val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
println(sumLambda(1,2)) // 輸出 3
}
複製代碼
可變變量定義:var 關鍵字
var <標識符> : <類型> = <初始化值>
複製代碼
不可變變量定義:val 關鍵字,只能賦值一次的變量(相似Java中final修飾的變量)
val <標識符> : <類型> = <初始化值>
複製代碼
常量與變量均可以沒有初始化值,可是在引用前必須初始化
編譯器支持自動類型判斷,即聲明時能夠不指定類型,由編譯器判斷。
val a: Int = 1
val b = 1 // 系統自動推斷變量類型爲Int
val c: Int // 若是不在聲明時初始化則必須提供變量類型
c = 1 // 明確賦值
var x = 5 // 系統自動推斷變量類型爲Int
x += 1 // 變量可修改
複製代碼
Kotlin 支持單行和多行註釋,實例以下:
// 這是一個單行註釋
/* 這是一個多行的
塊註釋。 */
複製代碼
與 Java 不一樣, Kotlin 中的塊註釋容許嵌套。
$ 表示一個變量名或者變量值
$varName 表示變量值
${varName.fun()} 表示變量的方法返回值:
var a = 1
// 模板中的簡單名稱:
val s1 = "a is $a"
a = 2
// 模板中的任意表達式:
val s2 = "${s1.replace("is", "was")}, but now is $a"
複製代碼
Kotlin的空安全設計對於聲明可爲空的參數,在使用時要進行空判斷處理,有兩種處理方式,字段後加!!像Java同樣拋出空異常,另外一種字段後加?可不作處理返回值爲 null或配合?:作空判斷處理
//類型後面加?表示可爲空
var age: String? = "23"
//拋出空指針異常
val ages = age!!.toInt()
//不作處理返回 null
val ages1 = age?.toInt()
//age爲空返回-1
val ages2 = age?.toInt() ?: -1
複製代碼
當一個引用可能爲 null 值時, 對應的類型聲明必須明確地標記爲可爲 null。
當 str 中的字符串內容不是一個整數時, 返回 null:
fun parseInt(str: String): Int? {
// ...
}
複製代碼
如下實例演示如何使用一個返回值可爲 null 的函數:
fun main(args: Array<String>) {
if (args.size < 2) {
print("Two integers expected")
return
}
val x = parseInt(args[0])
val y = parseInt(args[1])
// 直接使用 `x * y` 會致使錯誤, 由於它們可能爲 null.
if (x != null && y != null) {
// 在進行過 null 值檢查以後, x 和 y 的類型會被自動轉換爲非 null 變量
print(x * y)
}
}
複製代碼
咱們可使用 is 運算符檢測一個表達式是否某類型的一個實例(相似於Java中的instanceof關鍵字)。
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 作過類型判斷之後,obj會被系統自動轉換爲String類型
return obj.length
}
//在這裏還有一種方法,與Java中instanceof不一樣,使用!is
// if (obj !is String){
// // XXX
// }
// 這裏的obj仍然是Any類型的引用
return null
}
複製代碼
或者
fun getStringLength(obj: Any): Int? {
if (obj !is String)
return null
// 在這個分支中, `obj` 的類型會被自動轉換爲 `String`
return obj.length
}
複製代碼
甚至還能夠
fun getStringLength(obj: Any): Int? {
// 在 `&&` 運算符的右側, `obj` 的類型會被自動轉換爲 `String`
if (obj is String && obj.length > 0)
return obj.length
return null
}
複製代碼
區間表達式由具備操做符形式 .. 的 rangeTo 函數輔以 in 和 !in 造成。
區間是爲任何可比較類型定義的,但對於整型原生類型,它有一個優化的實現。如下是使用區間的一些示例:
for (i in 1..4) print(i) // 輸出「1234」
for (i in 4..1) print(i) // 什麼都不輸出
if (i in 1..10) { // 等同於 1 <= i && i <= 10
println(i)
}
// 使用 step 指定步長
for (i in 1..4 step 2) print(i) // 輸出「13」
for (i in 4 downTo 1 step 2) print(i) // 輸出「42」
// 使用 until 函數排除結束元素
for (i in 1 until 10) { // i in [1, 10) 排除了 10
println(i)
}
複製代碼
fun main(args: Array<String>) {
print("循環輸出:")
for (i in 1..4) print(i) // 輸出「1234」
println("\n----------------")
print("設置步長:")
for (i in 1..4 step 2) print(i) // 輸出「13」
println("\n----------------")
print("使用 downTo:")
for (i in 4 downTo 1 step 2) print(i) // 輸出「42」
println("\n----------------")
print("使用 until:")
// 使用 until 函數排除結束元素
for (i in 1 until 4) { // i in [1, 4) 排除了 4
print(i)
}
println("\n----------------")
}
複製代碼
輸出結果:
循環輸出:1234
----------------
設置步長:13
----------------
使用 downTo:42
----------------
使用 until:123
----------------
複製代碼
語法定義了一組用於編寫程序的規則。每種語言規範都定義了本身的語法。Dart程序代碼由如下組成 -
main() {
print("Hello World!");
}
Dart
複製代碼
main()
函數是Dart中的預約義方法。此方法充當應用程序的入口點。Dart腳本須要main()
方法來執行。print()
是一個預約義的函數,它將指定的字符串或值打印到標準輸出(即終端)。
上述代碼的輸出將是 -
Hello World!
Shell
複製代碼
可使用如下兩種方式執行Dart程序 -
經過終端/控制檯
經過終端執行Dart程序 -
進入到當前項目的路徑
在「終端/控制檯」窗口中鍵入如下命令 -
C:/> dart helloword.dart
Shell
經過WebStorm IDE
要經過WebStorm IDE執行Dart程序 -
main()
函數以啓用執行)<file_name>
」選項。以下截圖所示 -
Dart命令行選項用於修改Dart腳本執行。Dart的常見命令行選項包括如下內容 -
編號 | 命令行選項 | 描述 |
---|---|---|
1 | -c 或 --c |
啓用斷言和類型檢查(選中模式)。 |
2 | --version |
顯示VM版本信息 |
3 | --packages <path> |
指定程序包解析配置文件的路徑。 |
4 | -p <path> |
指定在何處查找導入的庫。此選項不能與--packages 一塊兒使用。 |
5 | -h 或 --help |
顯示幫助信息。 |
Dart程序以兩種模式運行,即 -
建議在開發和測試期間以檢查模式運行Dart VM,由於它會添加警告和錯誤以幫助開發和調試過程。選中的模式會強制執行各類檢查,例如類型檢查等。要打開選中的模式,請在運行腳本時在腳本文件名以前添加- c或—checked選項。
可是,爲了在運行腳本時確保性能優點,建議在生產模式下運行腳本。
假設 test.dart 腳本文件代碼以下 -
void main() {
String s = "welcome to yiibai.com";
print(s);
}
Dart
複製代碼
輸入如下命令運行腳本 -
C:/> dart test.dart
Shell
複製代碼
上面腳本將產生如下輸出 -
welcome to yiibai.com
Shell
複製代碼
標識符是程序中元素的名稱,如變量,函數等。標識符的規則是 -
_
)或美圓符號($
)外,標識符不能包含特殊符號。下表列出了有效和無效標識符的幾個示例 -
有效標識符 | 無效標識符 |
---|---|
firstName | Var |
first_name | first name |
num1 | first-name |
$result | 1result |
關鍵字在語言的上下文中具備特殊含義。下表中列出了Dart語言中的一些關鍵字。
abstract | continue | false | new | this |
---|---|---|---|---|
as | default | final | null | throw |
assert | deferred | finally | operator | true |
async | do | for | part | try |
async* |
dynamic | get | rethrow | typedef |
await | else | if | return | var |
break | enum | implements | set | void |
case | export | import | static | while |
catch | external | in | super | with |
class | extends | is | switch | yield |
const | factory | library |
空白和換行
Dart忽略程序中出現的空格,製表符和換行符。能夠在程序中自由使用空格,製表符和換行符,而且能夠自由地以簡潔一致的方式格式化和縮進程序,使代碼易於閱讀和理解。
Dart區分大小寫
Dart區分大小寫。Dart中大寫和小寫字符表示不一樣地含義。
聲明以分號結尾
每行指令都稱爲語句。每一個dart語句必須以分號(;
)結尾。一行能夠包含多個語句。可是,這些語句必須用分號分隔。
註釋是提升程序可讀性的一種方法。註釋可用於包含有關程序的其餘信息,如代碼的做者,有關函數/構造的提示等。編譯器會忽略註釋。
Dart支持如下類型的註釋 -
單行註釋(//
) - //
和行尾之間的任何文本都視爲註釋
多行註釋(/* */
) - 這個註釋可能跨越多行。
// 這是單行註釋
/* 這是... 一個 多行的 註釋 */
Dart
Dart是一種面向對象的語言。面向對象是一種遵循真實世界建模的軟件開發範例。面向對象將程序視爲經過稱爲方法的機制相互通訊的對象集合。
示例:Dart和麪向對象
class TestClass {
void display() {
print("Dart and Object Orientation");
}
}
void main() {
TestClass c = new TestClass();
c.display();
}
Dart
複製代碼
上面的示例代碼中定義了一個類TestClass
。該類有一個display()
方法。該方法在終端上打印字符串 - "Dart and Object Orientation"
。new
關鍵字建立類的對象。該對象調用display()
方法。
執行上面代碼將產生如下輸出 -
Dart and Object Orientation
Shell
複製代碼