Java&Kotlin&Dart語法教程

沒事多翻書html

Java

基本語法

關於Java程序,請務必牢記如下幾點。

  • 區分大小寫 - Java區分大小寫,所以標識符Hellohello在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組件都須要名稱。 用於類,變量和方法的名稱稱爲 標識符
在Java中,標識符的命名有幾點要記住。 它們以下 -

  • 全部標識符都應以字母(AZaz),貨幣字符($)或下劃線(_)開頭。
  • 在第一個字符以後,標識符能夠是任何字符組合。
  • 關鍵字不能用做標識符。
  • 標識符區分大小寫。
  • 合法標識符的示例:age$salary_value__1_value
  • 非法標識符的示例:123abc-salary

Java修飾符

與其餘語言同樣,能夠經過使用修飾符來修改類,方法等。 修飾符分爲兩類 -

  • 訪問修飾符 - default, public , protected, private
  • 非訪問修飾符 - finalabstractstrictfp

在下一節中學習有關修飾符的更多細節。

Java變量

如下是Java中的變量類型 -

  • 局部變量
  • 類變量(靜態變量)
  • 實例變量(非靜態變量)

Java數組

數組是存儲多個相同類型變量的對象。 可是,數組自己是堆上的對象。

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關鍵字

如下列表中列出了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

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 文件中:

  • kotlin.*
  • kotlin.annotation.*
  • kotlin.collections.*
  • kotlin.comparisons.*
  • kotlin.io.*
  • kotlin.ranges.*
  • kotlin.sequences.*
  • kotlin.text.*

函數定義

函數定義使用關鍵字 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(匿名函數)

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"
複製代碼

NULL檢查機制

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

語法定義了一組用於編寫程序的規則。每種語言規範都定義了本身的語法。Dart程序代碼由如下組成 -

  • 變量和運算符
  • 函數
  • 表達式和編程構造
  • 決策和循環結構
  • 註解
  • 庫和包
  • 類型定義
  • 數據結構 - 集合/泛型

第一個Dart語序

main() { 
   print("Hello World!"); 
}


Dart
複製代碼

main()函數是Dart中的預約義方法。此方法充當應用程序的入口點。Dart腳本須要main()方法來執行。print()是一個預約義的函數,它將指定的字符串或值打印到標準輸出(即終端)。

上述代碼的輸出將是 -

Hello World!


Shell
複製代碼

執行Dart程序

可使用如下兩種方式執行Dart程序 -

  • 經過終端/控制檯
  • 經過WebStorm IDE

經過終端/控制檯

經過終端執行Dart程序 -

  • 進入到當前項目的路徑

  • 在「終端/控制檯」窗口中鍵入如下命令 -

    C:/> dart helloword.dart

    Shell

經過WebStorm IDE

要經過WebStorm IDE執行Dart程序 -

  • 右鍵單擊IDE上的Dart腳本文件。(該文件應包含main()函數以啓用執行)
  • 單擊「運行<file_name>」選項。

以下截圖所示 -

WebStorm

Dart命令行選項

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
複製代碼

Dart標識符

標識符是程序中元素的名稱,如變量,函數等。標識符的規則是 -

  • 標識符能夠包括字符和數字。可是,標識符不能以數字開頭。
  • 除下劃線(_)或美圓符號($)外,標識符不能包含特殊符號。
  • 標識符不能是關鍵字。
  • 它們必須是惟一的。
  • 標識符區分大小寫。
  • 標識符不能包含空格。

下表列出了有效和無效標識符的幾個示例 -

有效標識符 無效標識符
firstName Var
first_name first name
num1 first-name
$result 1result

Dart關鍵字

關鍵字在語言的上下文中具備特殊含義。下表中列出了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面向對象編程

Dart是一種面向對象的語言。面向對象是一種遵循真實世界建模的軟件開發範例。面向對象將程序視爲經過稱爲方法的機制相互通訊的對象集合。

  • 對象 - 對象是任何實體的實時表示。根據Grady Brooch,每一個對象必須具備三個功能 -
    • 狀態 - 由對象的屬性描述。
    • 行爲 - 描述對象的行爲方式。
    • 標識 - 將對象與一組相似此類對象區分開的惟一值。
  • 類 - 類是建立對象的藍圖/模板,類封裝了對象的數據。
  • 方法 - 方法促進對象之間的通訊。

示例: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
複製代碼
相關文章
相關標籤/搜索