Java語言基礎(chǔ)

java語言入門

像任何編程語言一樣,Java 語言指定了一些編譯器認(rèn)為具有特殊意義的關(guān)鍵字。出于該原因,您不能使用它們來命名您的 Java 構(gòu)造。保留字(也稱為關(guān)鍵字)非常少:

|

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

|

您也不能使用 true、falsenull(嚴(yán)格意義上講,它們是 字面常量 而不是關(guān)鍵字)來命名 Java 構(gòu)造

使用 IDE 進(jìn)行編程的一個優(yōu)勢是,它可以對保留字使用語法顏色。

Java 類的結(jié)構(gòu)

類是包含屬性和行為的離散實(shí)體(對象)的藍(lán)圖。類定義了對象的基本結(jié)構(gòu),在運(yùn)行時,您的應(yīng)用程序會創(chuàng)建對象的實(shí)例。對象擁有明確定義的邊界和狀態(tài),在正確請求對象時,它們可以執(zhí)行相應(yīng)的操作。每種面向?qū)ο蟮恼Z言都擁有關(guān)于如何定義類的規(guī)則。

在 Java 語言中,類的定義如清單 1 所示:

清單 1. 類定義

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

|

package packageName;

import ClassNameToImport;

accessSpecifier class ClassName {

accessSpecifier dataType variableName [= initialValue];

accessSpecifier ClassName([argumentList]) {

constructorStatement(s)

}

accessSpecifier returnType methodName ([argumentList]) {

methodStatement(s)

}

// This is a comment

/* This is a comment too */

/* This is a

multiline

comment */

}

|

備注
清單 1 和本節(jié)的其他一些代碼示例中,方括號表示它們之中的結(jié)構(gòu)不是必需的。方括號本身(不同于 {})不是 Java 語法的一部分。

清單 1 包含各種類型的構(gòu)造,第 1 行是 package,第 2 行是 import,第 3 行是 class。這 3 種構(gòu)造都屬于保留字,所以它們必須保持清單 1 中的準(zhǔn)確格式。我為清單 1 中的其他構(gòu)造提供的名稱描述了它們表示的概念。

請注意,清單 1 中第 11 到 15 行是注釋行。在大多數(shù)編程語言中,程序員都可添加注釋來幫助描述代碼。Java 語法允許采用單行和多行注釋。

|

// This is a comment

/* This is a comment too */

/* This is a

multiline

comment */

|

單行注釋必須包含在一行上,但可以使用鄰近的多個單行注釋來形成一個注釋塊。多行注釋以 /* 開頭,必須以 */ 終止,而且可以分布在任意數(shù)量的行上。

接下來,我們將詳細(xì)介紹清單 1 中的構(gòu)造,首先是 package。

打包類

在 Java 語言中,可以為類選擇名稱,比如 AccountPersonLizardMan。有時,可能最終使用了同一個名稱來表達(dá)兩個稍微不同的概念。這種情形稱為名稱沖突,經(jīng)常發(fā)生。Java 語言使用來解決這些沖突。

Java 包是一種提供名稱空間的機(jī)制— 名稱空間是一個區(qū)域,名稱在該區(qū)域內(nèi)是唯一的,但在其外部可能不是唯一的。要唯一地標(biāo)識某個構(gòu)造,必須包含它的名稱空間來完全限定它。

包也是構(gòu)造包含離散功能單元的更復(fù)雜應(yīng)用程序的好方法。

要定義包,可使用 package 關(guān)鍵字,后跟一個合法的包名稱,并以一個分號結(jié)尾。包名稱通常遵循這種事實(shí)標(biāo)準(zhǔn)模式:

|

package orgType.orgName.appName.compName;

|

這個包定義可分解為不同的部分:

  • *orgType* 是組織類型,比如 com、orgnet
  • *orgName* 是組織的域名稱,比如 makotojava、oracleibm。
  • *appName* 是應(yīng)用程序的縮寫名稱。
  • *compName* 是組件的名稱。

本課程將使用此約定,建議堅持使用它來定義包中的所有 Java 類。(Java 語言沒有強(qiáng)制要求您遵循這種包約定。您完全不需要指定一個包,但在這種情況下,您的所有類都必須有唯一的名稱且位于默認(rèn)包中。)

導(dǎo)入語句

Eclipse 簡化了導(dǎo)入
在 Eclipse 編輯器中編寫代碼時,可以鍵入想要使用的類的名稱,然后按 Ctrl+Shift+O。Eclipse 會確定您需要哪些導(dǎo)入語句并自動添加它們。如果 Eclipse 找到兩個具有相同名稱的類,它會詢問您想為哪個類添加導(dǎo)入語句。

類定義中的下一部分(返回參考清單 1)是導(dǎo)入語句。導(dǎo)入語句告訴 Java 編譯器在何處查找您在代碼中引用的類。任何非無效類都會使用其他類來實(shí)現(xiàn)某種功能,導(dǎo)入語句是您向 Java 編譯器告知這些類的方式。

導(dǎo)入語句看起來通常類似于:

|

import ClassNameToImport;

|

您指定 import 關(guān)鍵字,后跟想要導(dǎo)入的類,然后是一個分號。類名應(yīng)是完全限定的,這意味著類名中應(yīng)包含它的包。

要導(dǎo)入一個包中的所有類,可以將 .* 放在包名稱后。例如,這條語句導(dǎo)入 com.makotojava 包中的每個類:

|

import com.makotojava.*;

|

但是,導(dǎo)入整個包可能會降低代碼的可讀性,所以推薦使用完全限定名稱來僅導(dǎo)入所需的類。

類的聲明

要在 Java 語言中定義一個對象,必須聲明一個類??梢詫㈩惪醋魇菍ο蟮哪0?,就像一個餅干模子。

清單 1 包含這個類的聲明:

|

accessSpecifier class ClassName {

accessSpecifier dataType variableName [= initialValue];

accessSpecifier ClassName([argumentList]) {

constructorStatement(s)

}

accessSpecifier returnType methodName([argumentList]) {

methodStatement(s)

}

}

|

類的 *accessSpecifier* 可擁有多個值,但該值通常是 public。您很快會看到 *accessSpecifier* 的其他值。

您可以采用您想要的任意方式對類進(jìn)行命名,但根據(jù)約定應(yīng)使用駝峰式大小寫:以一個大寫字母開頭,將串聯(lián)的每個單詞的首字母大寫,將其他所有字母小寫。類名應(yīng)僅包含字母和數(shù)字。堅持這些準(zhǔn)則,可確保代碼更容易供其他遵循相同約定的人使用。

變量和方法

類可以擁有兩種類型的成員變量方法。

變量

類的變量值可以區(qū)分該類的每個實(shí)例并定義它的狀態(tài)。這些值通常稱為實(shí)例變量。一個變量包含:

  • 一個 *accessSpecifier*
  • 一個 *dataType*
  • 一個 *variableName*
  • 一個可選的 *initialValue*

可能的 *accessSpecifier* 值包括:

公共變量
使用公共變量絕不是一個好主意,但在極少的情況下必須這么做,所以存在這種選擇。Java 平臺不會限制您的用例,所以使用良好的編碼約定取決于您的自律,即使您采取了別的選擇。

  • public:任何包中的任何對象都能看到該變量。(不要使用此值;請參閱公共變量側(cè)欄。)
  • protected:相同包中定義的任何對象或(在任何包中定義的)一個子類都可以看到該變量。
  • 沒有說明符(也稱為友好包私有訪問):只有在相同包中定義了其類的對象才能看到該變量。
  • private:只有包含該變量的類能夠看到它。

變量的 *dataType* 取決于該變量是什么 — 它可能是一種原語類型或另一種類類型(稍后會更詳細(xì)地介紹)。

*variableName* 由您自己決定,但根據(jù)約定,變量名稱應(yīng)使用駝峰式大小寫約定,除了以小寫字母開頭的變量名稱。(這種樣式有時稱為小駝峰式大小寫。)

現(xiàn)在暫時不要擔(dān)憂 *initialValue*,只需知道您在聲明一個實(shí)例變量時可以將其初始化。(否則,編譯器會為您生成在實(shí)例化該類時設(shè)置的默認(rèn)值。)

示例:Person 的類定義

下面這個示例總結(jié)了您目前所學(xué)的知識。清單 2 是 Person 的類定義。

清單 2. Person 的基類定義

|

package com.makotojava.intro;

public class Person {

private String name;

private int age;

private int height;

private int weight;

private String eyeColor;

private String gender;

}

|

Person 的這個基類定義目前不是很有用,因?yàn)樗鼉H定義了 Person 的屬性(而且還是私有屬性)。要變得更完整,Person 類還需要行為 — 即方法。

方法

類的方法定義了它的行為。

方法可分為兩種主要類別:構(gòu)造方法;以及其他所有方法,這些方法具有許多類型。構(gòu)造方法僅用于創(chuàng)建類的實(shí)例。其他類型的方法可用于幾乎任何應(yīng)用程序行為。

清單 1 中的類定義給出了定義方法結(jié)構(gòu)的方法,該結(jié)構(gòu)包括以下元素:

  • *accessSpecifier*
  • *returnType*
  • *methodName*
  • *argumentList*

這些結(jié)構(gòu)元素在方法定義中的組合也稱為方法的簽名

現(xiàn)在仔細(xì)查看兩種方法類別,先查看構(gòu)造方法。

構(gòu)造方法

可使用構(gòu)造方法指定如何實(shí)例化類。清單 1 以抽象形式給出了構(gòu)造方法的聲明語法;這里再次給出了它:

|

accessSpecifier ClassName([argumentList]) {

constructorStatement(s)

}

|

構(gòu)造方法是可選的
如果未使用構(gòu)造方法,編譯器會為您提供一個,該構(gòu)造方法為默認(rèn)構(gòu)造方法,也稱為無參數(shù)no-arg)構(gòu)造方法。如果您使用的構(gòu)造方法不是 no-arg 構(gòu)造方法,編譯器不會自動為您生成一個構(gòu)造方法。

構(gòu)造方法的 *accessSpecifier* 與變量的 accessSpecifier 相同。構(gòu)造方法的名稱必須與類名匹配。因此,如果您將類命名為 Person,構(gòu)造方法的名稱也必須也是 Person。

對于任何其他非默認(rèn)構(gòu)造方法(參見構(gòu)造方法是可選的側(cè)欄),需要傳遞一個*argumentList*,其中包含一個或多個:

|

argumentType argumentName

|

*argumentList* 中的參數(shù)用逗號分隔,而且任何兩個參數(shù)不能同名。 *argumentType* 為原語類型或另一種類類型(與變量類型相同)。

包含構(gòu)造方法的類定義

現(xiàn)在來看看在通過兩種方式添加了創(chuàng)建 Person 對象的能力后會發(fā)生什么:通過使用 no-arg 構(gòu)造方法和通過初始化一個部分屬性列表。

清單 3 展示了如何創(chuàng)建構(gòu)造方法,以及如何使用 argumentList

清單 3. 包含構(gòu)造方法的 Person 類定義

|

package com.makotojava.intro;

public class Person {

private String name;

private int age;

private int height;

private int weight;

private String eyeColor;

private String gender;

public Person() {

// Nothing to do...

}

public Person(String name, int age, int height, int weight String eyeColor, String gender) {

this.name = name;

this.age = age;

this.height = height;

this.weight = weight;

this.eyeColor = eyeColor;

this.gender = gender;

}

}

|

請注意,清單 3 中使用了 this 關(guān)鍵字來執(zhí)行變量賦值。this 關(guān)鍵字是“this object”的 Java 簡寫形式,在引用兩個具有相同名稱的變量時必須使用它。在本例中,age 既是一個構(gòu)造方法參數(shù),也是一個類變量,所以 this 關(guān)鍵字可幫助編譯器辨別它屬于哪種情況。

Person 對象變得越來越有趣,但它需要更多行為。為此,您需要更多方法。

其他方法

構(gòu)造方法是一種具有特定功能的特定方法類型。類似地,其他許多類型的方法執(zhí)行 Java 程序中的特定功能。從本節(jié)開始到全教程結(jié)束,我們將探索其他方法類型。

返回到清單 1 中,可以看到方法的聲明方式:

|

accessSpecifier returnType methodName ([argumentList]) {

methodStatement(s)

}

|

其他方法看起來非常像構(gòu)造方法,但有兩處例外。 首先,您可為其他方法提供您喜歡的任何名稱(但是,肯定要遵守某些規(guī)則)。我推薦遵守以下約定:

  • 以小寫字母開頭。
  • 避免使用數(shù)字,除非絕對必須使用它們。
  • 僅使用字母字符。

第二,不同于構(gòu)造方法,其他方法有一個可選的返回類型。

Person 的其他方法

有了這些基本信息,就可以在清單 4 中看到在向 Person 對象添加一些方法后發(fā)生的情況。(為簡潔起見,我省略了構(gòu)造方法。)

清單 4. 包含一些新方法的 Person

|

package com.makotojava.intro;

public class Person {

private String name;

private int age;

private int height;

private int weight;

private String eyeColor;

private String gender;

public String getName() { return name; }

public void setName(String value) { name = value; }

// Other getter/setter combinations...

}

|

請注意清單 4 中有關(guān)“getter/setter combinations”的注釋。稍后會更多地使用 getter 和 setter。就現(xiàn)在而言,您只需知道 getter 是一個檢索屬性值的方法,setter 是一個修改該值的方法。 清單 4 僅給出了一種 getter/setter 組合(針對 Name 屬性),但您可用類似方式定義更多組合。

清單 4 中可以注意到,如果某個方法沒有返回值,則必須在該方法的簽名中指定 void 返回類型來告知編譯器。

靜態(tài)和實(shí)例方法

通常會使用兩種類型的(非構(gòu)造)方法:實(shí)例方法靜態(tài)方法。實(shí)例方法依賴于特定對象實(shí)例的狀態(tài)來實(shí)現(xiàn)其行為。靜態(tài)方法有時也稱為類方法,因?yàn)樗鼈兊男袨椴灰蕾囉谌魏我粋€對象的狀態(tài)。靜態(tài)方法的行為是在類級別上發(fā)生的。

靜態(tài)方法主要用于實(shí)用程序;您可將它們視為全局方法(類似于 C 語言),但將該方法的代碼與定義它的類放在一起。

例如,在整個教程中,您都會使用 JDK Logger 類向控制臺輸出信息。要創(chuàng)建一個 Logger 類實(shí)例,不需要實(shí)例化 Logger 類;而是應(yīng)該調(diào)用一個名為 getLogger() 的靜態(tài)方法。

在類上調(diào)用靜態(tài)方法的語法不同于在對象上調(diào)用方法的語法。您還會使用包含該靜態(tài)方法的類的名稱,如這個調(diào)用中所示:

|

Logger l = Logger.getLogger("NewLogger");

|

在這個示例中,Logger 是類名,getLogger(...) 是方法名。因此,要調(diào)用靜態(tài)方法,不需要對象實(shí)例,只需類名即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 天是陰暗 心是藤線 女孩來到街邊 等待她的明天 等幸運(yùn) 等花開 等幸福 等他來 她每天都來這里等待 她,真的好傻…...
    三流作者貓小橙閱讀 272評論 0 2
  • 今天休息 出去轉(zhuǎn)了轉(zhuǎn) 調(diào)整一下狀態(tài) 總結(jié) 勞逸結(jié)合
    劉磊stely閱讀 230評論 0 0

友情鏈接更多精彩內(nèi)容