コンピューター ウィンドウズ インターネット

条件付き構造。 JavaServerPage。 JSPページの構文

JSPページには、組み合わせた構文があります。HTML仕様で定義されている標準構文と仕様で定義されているJSP構文の組み合わせです。 Javaサーバーページ。 JSP構文標準のHTMLタグとJSPタグで構成されるJSPページを作成するためのルールを定義します。

JSPページには、HTMLタグに加えて、次のカテゴリのJSPタグが含まれています。

JSPディレクティブ

JSPディレクティブサーバーに送信された特定の要求に関するグローバル情報を提供し、翻訳段階で必要な情報を提供します。 ディレクティブは常に他のすべてのタグの前にJSPページの先頭に配置されるため、 パーサー(パーサー)JSPは、テキストを解析するときに、最初にグローバル命令を強調表示しました。 したがって、JSPエンジン(JSPランタイム)はコードを解析し、JSPからサーブレットを作成します。 指令 JSPコンテナへのメッセージです。

構文 JSPディレクティブ次のように:

<%@ директива имяАтрибута="значение" %>

タスクの構文 ディレクティブ XMLの場合:

JSPディレクティブ複数の属性を持つことができます。 この場合、ディレクティブは属性ごとに繰り返すことができます。 同時に、カップル "属性名=値"スペースを区切り文字として使用して、1つのディレクティブの下に配置できます。

ディレクティブには次の3つのタイプがあります。

  • ページ(ページ)
  • taglib(タグライブラリ)
  • インクルード(インクルード)

JSPページディレクティブ

JSPページディレクティブトランスレータに影響を与えるJSPページのプロパティを定義します。 ディレクティブ内の属性の順序 ページ重要ではない。 構文に違反したり、認識されない属性が存在したりすると、翻訳エラーが発生します。 ディレクティブの例 ページ次のコードが役立ちます。

<%@ page buffer="none" isThreadSafe="yes" errorPage="/error.jsp" %>

pageディレクティブはそれを宣言します このページ JSPはバッファリングを使用しないため、指定されたものに同時にアクセスできます。 JSPページ多くのユーザー、そしてその名前のエラーページ error.jsp.

JSPページディレクティブページに関する情報が含まれる場合があります。

<%@ page info = "JSP Sample 1" %>

可能なディレクティブ属性のリスト ページ表に示されています。

属性名意味 説明
言語 ライン 翻訳されたコードの本体を含む、JSPファイルのスクリプトレット、式、または任意のインクルードファイルで使用される言語を決定します。 デフォルトは「java」です
拡張します ライン 生成されたサーブレットのスーパークラスを指定します。 サーバーがすでにスーパークラスを使用している可能性があるため、この属性は細心の注意を払って使用する必要があります。
輸入 ライン インポートするパッケージの定義。例:
<%@ page import="java.util.* %>
セッション 正しいか間違っているか 意味 NS(デフォルト)は、事前定義された変数を示します セッション(タイプHttpSession)は、既存のセッションにバインドする必要があります。バインドしない場合は、新しいセッションが作成されてバインドされます。 意味 NSセッションが使用されないことを決定し、変数へのアクセスを試みます セッション JSPページをサーブレットに変換するときにエラーが発生します
バッファ なし、またはバッファのサイズ(kB)。 JspWriter出力のバッファサイズを設定します。 デフォルト値はサーバー設定によって異なり、8kBを超えてはなりません。 値が なし出力はオブジェクトに直接送られます ServletResponse
autoFlush 正しいか間違っているか バッファがオーバーフローしたとき、またはエラーが発生したときに、バッファを自動的に空にするかどうかを決定します。 デフォルト値 NS
isThreadSafe 正しいか間違っているか 意味 NS(デフォルト)サーブレットの通常の実行モードを指定します。作成者がそのインスタンスの変数へのアクセスを同期していると仮定して、単一のサーブレットインスタンスを使用して複数のリクエストが同時に処理されます。 偽の値は、サーブレットが継承する必要があることを示します SingleThreadModel(シングルスレッドモデル)シーケンシャルリクエストまたはコンカレントリクエストがサーブレットの個別のインスタンスによって処理される場合
情報 ライン メソッドを使用してアクセスされるJSPページに関する情報の文字列を定義します サーブレット.getServletInfo()
errorPage ライン 属性値は、例外の原因となる可能性のあるエラーの場合に表示されるページのURLです。
isErrorPage 正しいか間違っているか このページを使用して他のJSPページのエラーを処理できるかどうかを通知します。 デフォルトは NS
contentType ライン JSPページと応答のエンコーディング、およびJSP応答のMIMEタイプを指定します。 コンテンツタイプのデフォルト値は テキスト/ html、エンコーディング- ISO-8859-1。例えば:
contentType = "text / html; charset = ISO-8859-1"
pageEncoding ライン JSPページの文字エンコードを決定します。 デフォルトは 文字コード属性から contentTypeそこで定義されている場合。 値が 文字コード属性内 contentType未定義、値 pageEncoding等しく設定されている ISO-8859-1

JSPtaglibディレクティブ

JSPディレクティブ taglib指定されたJSPページがタグライブラリを使用することを宣言し、URIで一意に識別し、ライブラリの操作に使用できるタグプレフィックスをマップします。 コンテナがタグライブラリを見つけられない場合、致命的な変換エラーが発生します。

指令 taglib構文は次のとおりです。

<%@ taglib uri="含まれているタグライブラリのURI"プレフィックス=" プレフィックス名" %>

プレフィックス " プレフィックス名「ライブラリを参照するときに使用されます。タグライブラリの使用例 mytags:

<%@ taglib uri="http://www.taglib/mytags" prefix="customs" %> . . .

この例では、タグライブラリにURIがあります "http://www.taglib/mytags"、文字列はプレフィックスとして割り当てられます 税関これは、タグライブラリの要素にアクセスするときにJSPページで使用されます。

JSPincludeディレクティブ

JSPディレクティブ 含む JSPページをサーブレットに変換するときにテキストまたはコードを挿入できます。 ディレクティブ構文 含むこのように見えます:

<%@ include file="含めるページの相対URI" %>

指令 含む 1つの属性があります- ファイル..。 指定されたリソースのテキストがJSPファイルに含まれます。 このディレクティブを使用して、すべてのJSPページに標準の著作権ヘッダーを配置できます。

<%@ include file="copyright.html" %>

JSPコンテナはインクルードファイルにアクセスします。 インクルードファイルが変更された場合、コンテナはJSPページを再コンパイルできます。 指令 含む JSPページなどのリソースを静的オブジェクトとして扱います。

指定されたURIは通常、リンクが配置されているページのJSPに関連して解釈されますが、他の相対URIと同様に、先頭に追加することで、WEBサーバーのホームディレクトリに対する対象のリソースの位置をシステムに伝えることができます。 「/」文字を含むURI。 インクルードファイルのコンテンツはプレーンJSPテキストとして扱われるため、静的HTML、スクリプト要素、ディレクティブ、アクションなどの要素を含めることができます。

多くのサイトでは、すべてのページで小さなナビゲーションバーを使用しています。 HTMLフレームの使用には問題があるため、このタスクは、ページの上または左半分に小さなテーブルを配置することで解決されることがよくあります。このテーブルのHTMLコードは、サイトのページごとに何度も繰り返されます。 指令 含む-これは、この問題を解決するための最も自然な方法であり、開発者をHTMLを個別のファイルにコピーするという悪夢から救います。

指令以来 含むページの翻訳中にファイルが含まれ、ナビゲーションバーに変更を加えた後、それを使用してすべてのJSPページを再翻訳する必要があります。 添付ファイルが頻繁に変更される場合は、アクションを使用できます jsp:含めるこれは、JSPページにアクセスするときにファイルを接続します。

JSP宣言ディレクティブ

JSPディレクティブ 宣言スクリプト言語で変数とメソッドを定義することを目的としています。これらは後でJSPページで使用されます。 構文 宣言このように見えます:

<%! код Java %>

宣言は宣言ブロックにあり、JSPページの式ブロックで呼び出されます。 宣言ブロックのコードは通常Javaで記述されていますが、アプリケーションサーバーは他のスクリプトの構文を使用できます。 広告 JavaBeansコンポーネントのプロパティから取得した動的データを操作するときに、機能を追加するために使用されることがあります。 の例 広告表に示されています。

宣言関数の値を計算するための以下のコードのように、複数の行を含めることができます 事実(int n)、nが2未満でnの場合、これは1に等しくなります。 nの正の値で;

<%! public static int fact (int n) { if (n <= 1) return 1; else return n * fact (n - 1); } %>

宣言標準出力への出力を生成しません アウト..。 宣言で宣言された変数とメソッドは初期化され、スクリプトレットなどで使用できるようになります 広告 JSPページが初期化されたとき。

スクリプトレットスクリプトレット

スクリプトレットディレクティブで定義されたスクリプト言語で記述されたさまざまなコードを含める 言語..。 コードスニペットは、言語の構文構造に準拠している必要があります スクリプトレットつまり、通常はJava言語の構文です。 スクリプトレット次の構文があります。

<% текст скриптлета %>

同等の構文 スクリプトレット XMLの場合:

スクリプトレットテキスト

本文中の場合 スクリプトレット文字のシーケンス%>は、タグとしてではなく、文字の組み合わせとして正確に使用する必要があります-終了記号 スクリプトレット、シーケンス%>の代わりに、次の文字の組み合わせ%\>を使用します。

JSP仕様は、単純でわかりやすい例を提供します スクリプトレットこれにより、JSPページのコンテンツが1日を通して動的に変更されます。

<% if (Calendar.getInstance ().get (Calendar.AM_PM) == Calendar.AM) {%>おはようございます<% } else { %>こんにちは<% } %>

内部のコードは注意する必要があります スクリプトレット書かれたとおりに挿入され、すべての静的HTMLテキスト(テンプレートテキスト)が前後に挿入されます スクリプトレット演算子を使用して変換 印刷..。 これは、スクリプトレットに完成したJavaチャンクを含める必要がなく、開いたままのチャンクが外部の静的HTMLに影響を与える可能性があることを意味します。 スクリプトレット.

スクリプト式と同じ自動定義変数にアクセスできます。 したがって、たとえば、ページに情報を表示する必要がある場合は、変数を使用する必要があります アウト.

<% String queryData = request.getQueryString (); out.println ("Дополнительные данные запроса: " + queryData); %>

式式

JSPページで、言語宣言で指定されたスクリプト言語(通常はJava)で記述された実行可能式。 結果 必要なタイプの文字列であるJSPは、標準出力ストリームに送信されます アウト現在のオブジェクトを使用する JspWriter..。 結果が キャストできません 、翻訳段階で問題が検出された場合に翻訳エラーが発生するか、例外がスローされます ClassCastExceptionリクエストの実行中に不整合が検出された場合。 表現構文は次のとおりです。

<%= текст выражения %>

JSPの代替構文 XMLを使用する場合:

式のテキスト

実行順序 JSPページで左から右へ。 もしも 表現複数のランタイム属性に表示され、そのタグで左から右に実行されます。 表現特定のスクリプト(通常はJava)の完全な式である必要があります。

HTTPプロトコルの実行中に実行されます。 式の値は文字列に変換され、JSPファイルの適切な位置に含まれます。

通常、JSPページ宣言ブロックで定義された、またはJSPからアクセス可能なJavaBeansから派生した変数とメソッドの文字列表現を計算して表示するために使用されます。 次のコード ページリクエストの日付と時刻を表示するのに役立ちます。

現在の時刻:<%= new java.util.Date () %>

単純化するために 使用できる事前定義された変数がいくつかあります。 最も一般的に使用される変数は次のとおりです。

  • リクエスト、HttpServletRequest;
  • 応答、HttpServletResponse;
  • セッション、HttpSession- リクエストに関連付けられている場合。
  • アウト、PrintWriter- クライアントにデータを送信するためのJspWriterタイプのバッファバージョン。

多くのプログラミング言語の基本的な要素の1つは 条件付き構文..。 これらの構造により、特定の条件に応じて、プログラムの作業をいずれかのパスに沿って指示することができます。

Java言語は、次の条件を使用します:if..elseおよびswitch..case

if / else構築

if / else式は特定の条件の真偽をチェックし、テストの結果に応じて、特定のコードを実行します。

Int num1 = 6; int num2 = 4; if(num1> num2)(System.out.println( "最初の数値が2番目の数値より大きい");)

ifキーワードの後に​​条件が配置されます。 そして、この条件が満たされた場合、中括弧がトリガーされた後、ifブロックにさらに配置されるコード。 2つの数値を比較する操作が条件として機能します。

この場合、最初の数値は2番目の数値よりも大きいため、式num1> num2はtrueであり、trueを返します。 その結果、制御は中括弧の後にコードのブロックに渡され、そこに含まれる命令、具体的にはSystem.out.printlnメソッド(「最初の数値が2番目の数値よりも大きい」)の実行を開始します。 ..。 最初の数値が2番目の数値以下の場合、ifブロックのステートメントは実行されません。

しかし、条件が満たされない場合に何らかのアクションを実行したい場合はどうなりますか? この場合、elseブロックを追加できます。

Int num1 = 6; int num2 = 4; if(num1> num2)(System.out.println( "最初の数値が2番目の数値よりも大きい");)else(System.out.println( "最初の数値が2番目の数値よりも小さい");

Int num1 = 6; int num2 = 8; if(num1> num2)(System.out.println( "最初の数値が2番目の数値より大きい");)else if(num1

論理演算子を使用して、一度に複数の条件を組み合わせることもできます。

Int num1 = 8; int num2 = 6; if(num1> num2 && num1> 7)(System.out.println( "最初の数値が2番目の数値より大きく、7より大きい");)

ここで、num1> num2がtrueであると同時に、num1> 7がtrueの場合、ifブロックが実行されます。

スイッチコンストラクト

設計 スイッチケース複数の条件を一度に処理できるため、if / else構文に似ています。

Int num = 8; switch(num)(case 1:System.out.println( "number is 1"); break; case 8:System.out.println( "number is 8"); num ++; break; case 9:System。 out .println( "number is 9"); break; default:System.out.println( "number is not 1、8、9");)

比較する式は、括弧内のswitchキーワードの後に​​続きます。 この式の値は、case演算子の後の値と順次比較されます。 そして、一致するものが見つかった場合、特定のケースブロックが実行されます。

他のブロックの実行を回避するために、breakステートメントはcaseブロックの最後に配置されます。 たとえば、次の場合にbreakステートメントを削除するとします。

ケース8:System.out.println( "数値は8"); num ++; ケース9:System.out.println( "数値は9"); 壊す;

次に、変数numが8に等しいため、case 8ブロックが実行されますが、このブロックではnum変数が1増加するため、breakステートメントがないため、case9ブロックが実行を開始します。

一致するものが見つからない場合の状況も処理する場合は、上記の例のように、デフォルトのブロックを追加できます。 ただし、デフォルトのブロックはオプションです。

JDK 7以降、switch..case式では、プリミティブ型に加えて、次の文字列を使用することもできます。

パッケージfirstapp; java.util.Scannerをインポートします。 public class FirstApp(public static void main(String args)(Scanner in = new Scanner(System.in); System.out.println( "Enter Y or N:"); String input = in.nextLine(); switch( input)(case "Y":System.out.println( "You press the letter Y"); break; case "N":System.out.println( "You press the letter N"); break; default:System .out .println( "不明な文字を押しました");)))

三項演算

三項演算の構文は次のとおりです。[第1オペランドは条件です]? [第2オペランド]:[第3オペランド]。 したがって、この操作には3つのオペランドが同時に含まれます。 条件に応じて、3項演算は2番目または3番目のオペランドを返します。条件が真の場合、2番目のオペランドが返されます。 条件がfalseの場合、3番目。 例えば:

Int x = 3; int y = 2; int z = x

ここで、三項演算の結果は変数zです。 まず、条件x

Javaプログラムを考えるとき、それはお互いのメソッドを呼び出すことによって相互作用するオブジェクトのコレクションとして定義することができます。 簡単に理解しましょう Java構文クラス、オブジェクト、メソッド、インスタンス変数はどういう意味ですか。

オブジェクト-オブジェクトには状態と動作があります。 例:犬は状態(色、名前、行動)を持つことができます-うなずく、走る、吠える、食べる。 オブジェクトはクラスのインスタンスです。

クラス-オブジェクトの動作を説明するテンプレートとして定義できます。

方法-主に動作です。 クラスには複数のメソッドを含めることができます。 論理的に記録されたデータが操作および実行されるのはメソッド内です。

インスタンス変数-各オブジェクトには、独自のインスタンス変数のセットがあります。 オブジェクトの状態は、これらのインスタンス変数に割り当てられた値によって生成されます。

最初のプログラムと言語の構文に精通している

「Helloworld!」という単語を表示する簡単なコードを見てみましょう。1つは、Java構文です。

public class MyFirstJavaProgram(public static void main(String args)(/ *これは私の最初のJavaプログラムです。実行すると "Hello world!"が表示されます* / System.out.println( "Hello world!"); //メッセージを表示します画面上))

  • メモ帳を開き、上記のコードを追加します。
  • ファイルを「MyFirstJavaProgram.java」として保存します。 以下では、Java構文を見て、その名前でその理由を調べます。
  • コマンドプロンプトウィンドウを開き、ファイルが保存されたディレクトリに移動します。 「C:」だとしましょう。
  • 「JavacMyFirstJavaProgram.java」と入力し、Enterキーを押してコードをコンパイルします。 コードにエラーがない場合、コマンドラインから次の行に移動します:(前提:パス変数が設定されている)。
  • 次に、「javaMyFirstJavaProgram」と入力してプログラムを実行します。
  • ウィンドウに「HelloWorld!」と印刷されているのがわかります。
C:> javac MyFirstJavaProgram.java C:> java MyFirstJavaProgram Hello world!

Java構文の基本

構文の次の点を知って覚えておくことが非常に重要です。

  • 大文字と小文字の区別-Javaは大文字と小文字を区別します。つまり、Helloとhelloの意味は異なります。
  • クラス名-すべての場合、最初の文字は大文字である必要があります。
  • クラス名を形成するために複数の単語が使用される場合、各内部単語の最初の文字は大文字である必要があります(例:「MyJavaClass」)。
  • メソッド名-Java構文では、すべてのメソッド名は小文字で始まる必要があります。
  • メソッド名を形成するために複数の単語が使用されている場合、各内部単語の最初の文字は大文字である必要があります(例:「public void myMethodName()」)。
  • プログラムファイル名-プログラムファイル名は 完全に一致するクラス名付き。
  • ファイルを保存するときは、クラス名を使用して保存し(大文字と小文字を区別することを忘れないでください)、名前の最後に「.java」を追加する必要があります(名前が一致しない場合、プログラムはコンパイルされません)。 MyJavaProgram "はクラスの名前であり、ファイルは" MyJavaProgram.java "として保存する必要があります。
  • public static void main(String args)-プログラムの処理は、すべてのプログラムの必須部分であるMain()メソッドから始まります。

Java識別子

識別子-クラス、変数、およびメソッドに使用される名前。 すべてのJavaコンポーネントには名前が必要です。

Java構文には、識別子について覚えておくべきいくつかの規則があります。 それらは次のとおりです。

  • 各識別子は、「A」から「Z」または「a」から「z」、「$」または「_」で始まる必要があります。
  • 文字の任意の組み合わせは、最初の文字の後に置くことができます。
  • キーワードを識別子として使用することはできません。
  • 最も重要なことは、Javaの識別子では大文字と小文字が区別されることです。
  • 正しいスペルの例:年齢、$給与、_value、__ 1_value。
  • スペルミスの例:123abc、-salary。

列挙

列挙はJava5.0で導入されました。 それらは、いくつかの事前定義された値の1つだけを選択するように変数を制約します。 この列挙されたリストの値は呼び出されます 転送.

Javaで列挙型を使用することにより、コード内のエラーの数を減らすことができます。

たとえば、店舗でフレッシュジュースの注文を検討している場合、ジュースパックのサイズを小、中、大に制限できます。 これにより、Javaで列挙型を使用できるようになり、小、中、大以外のパッケージサイズを注文する人がいなくなります。

Java列挙型コード例

class FreshJuice(enum FreshJuiceSize(SMALL、MEDIUM、LARGE)FreshJuiceSize size;)public class FreshJuiceTest(public static void main(String args)(FreshJuicejuice = new FreshJuice(); juice.size = FreshJuice.FreshJuiceSize.MEDIUM; System.out .println( "サイズ:" + Juice.size);))

上記の例の結果の出力:

サイズ:ミディアム

ノート: Javaでは、列挙型は独立して宣言することも、クラス内で宣言することもできます。 メソッド、変数、コンストラクターも列挙内で定義できます。

変数タイプ

  • ローカル変数。
  • クラス変数(静的)。
  • インスタンス変数(動的)。

修飾子

他の言語と同様に、Javaでは、修飾子を使用してクラスやメソッドなどを変更できます。 Javaの修飾子は、次の2つのカテゴリに分類されます。

  • アクセスあり:デフォルト、パブリック、保護、プライベート。
  • アクセスレス:final、abstract、strictfp。

次のセクションでは、クラス修飾子、メソッド修飾子などについて詳しく見ていきます。

配列

Javaでは、配列は同じタイプの複数の変数を格納するオブジェクトです。 ただし、配列自体はオブジェクトです。 後の章で、配列を作成してデータを設定する方法を見ていきます。

Javaマシンの起動時にmain()メソッドが呼び出されるクラスの名前と必ず一致する必要があります。

  • オブジェクト-継承元のクラス 全て配列や文字列を含むJavaのオブジェクト()。
  • アクセス指定子は、メンバーごとに個別です(宣言の前に指定されます)。
  • すべてのクラスメンバーは、デフォルトでスコープに対して開かれています パッケージ..。 デフォルトのスコープは、プライベートとプロテクトのクロスです。を参照してください。
  • 各* .javaファイルには次のものを含めることができます 唯一パブリックとして宣言され、外部からアクセスできるクラス。
  • クラスの定義と宣言は常に1つのファイルにあり、プロトタイプをヘッダーに入れることはできません。
  • ポインタがありません。
  • すべてのクラス変数は、実際にはオブジェクト自体への参照ではなく、オブジェクトへの参照です。 使用するための初期化は、newを介して行う必要があります<конструктор-класса>(...) .
  • 前のポイントに基づいて、あるオブジェクト変数を別のオブジェクト変数に割り当てると、リンクのみが変更され、オブジェクトはコピーされません。
  • 関数内の変数は、次の場合に値によって渡されます。 エレメンタリータイプ(int、byte、longなど...)、またはオブジェクトの場合は参照による。
  • クラスのパブリック静的メンバーには、ドット演算子を使用してアクセスします。 、::ではなく、私の意見では、外部の混乱を招きます。
  • デストラクタはありませんが、finalize()はあります。
  • Finalize()をC ++デストラクタと混同しないでください。 ファイナライズ()が呼び出されます ガベージコレクションのみ、これは、オブジェクトがスコープ外になり、このオブジェクトへの参照が少なくとも1つないこととは関係ありません。
  • 現在のRuntimeオブジェクトでRuntime.gc()メソッドを呼び出すか、静的System.gc()メソッドを呼び出すことで、ガベージコレクションを強制できます。 実験から判断すると、メモリの解放はJava仮想マシンの制限内でのみ機能し、一度割り当てられたメモリはマシンが終了するまでOSに戻されません。
  • Javaスタイルのコーディングでは、関数はコードを返す代わりに例外をスローします。 全身エラーまたは仮想マシンのロジックのエラー。 したがって、多くの関数は、例外を処理するtry(...)catch(...)(...)ブロック内で実行する必要があります。または、それらを呼び出すメソッドは、スローによってスローされる例外のリストを明示的に指定する必要があります。それらによって処理されないこれらの関数は、呼び出しスタックの上のメソッドによって処理されます。
  • 例外はとに分けられます。
  • try(...)ブロックは、finally(...)ブロックで終了することもできます。これは、前のtry(...)ブロックでの例外の有無に関係なく実行されます。 これを使用すると、コードブロックの実行結果に関係なく、必要なアクションを実行できます。たとえば、割り当てられているすべてのリソースを自動的に解放できます。
  • charは、C / C ++のようなシングルバイト型ではなく、サポートする1​​6ビット型です。 ユニコード文字列。
  • boolは、Javaではbooleanとして知られています。
  • 条件付きコンストラクトは それだけブール型の変数または式。 これは、コードが次のようになっていることを意味します。
    int a; ...変数に対するアクションa ...; もし) (...)
    Java構文に関して正しくなく、コンパイルされません。
  • 定数はconstではなくfinalとして宣言されます。
  • すべての配列はオブジェクトです。
  • 文字列定数(「任意の文字列定数」など)でさえオブジェクトです。
  • 文字列(クラスString)の場合、1つの演算子のみが定義されます-+、連結。
  • 文字列の比較は、Stringクラスのbool equals()メソッドを介して行われます(例:s1.equals(s2))。
  • Stringオブジェクトの内容は一定であり、文字列の1つの要素を変更することを意味するものではありません。これは、パフォーマンス上の理由から行われます。 このような操作が必要な場合は、StringBufferクラスを使用できます。
  • 初期化されていない文字列を空でない文字列と連結すると、次のようになります。 null +空でない文字列、たとえばs + = "| string"; 「null | string」と等しくなります
  • 配列には、パブリックメンバーの可変長があります。 文字列にはありません代わりに、length()メソッドを使用します。
  • Java サポートしていません多重継承。 その機能の一部は「インターフェース」を介して実行されます。 インターフェイスは、単一のクラス内の複数のインターフェイスの複数の「継承」実装をサポートし、一般に、多くの(インターフェイス)から多くの(クラス)の関係、およびその逆をサポートします。
  • インターフェイスを使用すると、これらのインターフェイスを実装するクラスのオブジェクトを参照できるリンクを作成できます。 確かに、参照インターフェイスを介してアクセスするときに適切な方法を動的に検索するには、多くのオーバーヘッドが必要になるため、望ましくありません。
  • 列挙の代わりに、メソッド宣言のないインターフェースを使用できます。 この場合、インターフェイスが定義されたときにすべてのインターフェイス変数を初期化する必要があり、それらの値は自動的に一定になります。 その後、実装を介して、定義されたクラスに「接続」できます。
  • また、JDK5以降は 外部的に古典的な列挙型-列挙型。 実際、これは名前付き定数のリストだけでなく、スーパークラスEnumから継承された特別なクラスです。 列挙の各要素は、このクラスのオブジェクトです。 列挙オブジェクトの数値は、序数の組み込み関数を使用して取得できます。
  • カスタム 演算子のオーバーロード C ++、Javaでおなじみ サポートされていません.
  • 「プリミティブ型」(int、float、charなど)を使用するオブジェクト環境で作業するために、Javaは オートボックス/オートボックスラッパー型(整数、浮動小数点、文字など)に変換します。 実際、これは、プリミティブ型とオブジェクトメソッドの機能を実装するいくつかの組み込みクラスの演算子オーバーロードの実装です。
  • super-サブクラスからスーパークラスのコンストラクターを呼び出すか、サブクラスのメンバーによって隠されたスーパークラスのメンバーを参照できるようにするキーワード。
    • コンストラクターとして使用する場合-スーパー 常に最初にする必要がありますサブクラスのコンストラクターの演算子。
  • 決定するため 概要メソッドでは、abstractキーワードが使用されます。抽象メソッドを含むクラスも、抽象クラスとして定義する必要があります...。
  • finalは、子クラスのメソッドのオーバーライドを禁止します。 finalとして宣言された「short」メソッドの場合、このキーワードは、関数を呼び出す代わりに、サブクラスでC ++のインラインと同じ効果があります。 多分スーパークラスメソッドのバイトコードを呼び出し元のクラスメソッドコードに挿入しました。
  • finalは、finalとして宣言されたクラスからの継承も禁止します。
  • 名前空間 Javaの(名前空間)は次のように実装されます パッケージ(パッケージ)。
  • 接続する パッケージ importを使用し、importstaticを使用することもできます ..(*|)クラスの静的メンバーをインポートします。
  • Javaは、組み込みのThreadクラスとRunableインターフェースを介してスレッドをサポートします。 同期の場合、クラスの説明のメソッドの前に同期指定子を使用するか、同期( )(...)と同期されたコードのブロック ..。 同期されたスレッド間のシグナルの場合、親Objectクラスのメソッドが使用されます:wait()/ notify()/ notifyAll()。
  • 一時的-オブジェクトを保存するとき、たとえば、ディスク/データベースに書き込む前にシリアル化するときに、オブジェクト/変数の値を「保持」する必要がないことを示す修飾子。 このようにして、Javaプロセスの現在のインスタンスでのみ意味のある一意のランタイム識別子やその他の同様の情報を含む変数をマークすることは論理的です。
  • instanceof -ランタイム操作、戻り値 NSもしも クラスへのリンクがあります 、またはこのクラスへの参照にキャストできます。それ以外の場合。 NS.
  • assert-JavaアサーションはCとほぼ同じ方法で使用されます:assert [:アサーション失敗の説明]、しかし 覚えておく必要がありますそれらはコンパイルされたバイトコードに「埋め込まれ」、java-eaを実行するときに含めることができます。
  • this(...)-クラスのコンストラクター内で使用して、引数のシグニチャーに一致する同じクラスの別のコンストラクターを呼び出すことができます。
  • それ以外の テンプレート使用されています 一般化、非常によく似ています:クラスCLASS_NAME (...)。 一般化では 禁止されています使用する 原生的タイプ ( int、byte、charなど..。)。 パラメータを使用できます クラスのみ.
    さらに、サポートされています 限定タイプ、パラメータクラスのスーパークラスを指定します。 たとえば、「ジェネリッククラス」クラスCLASS_NAMEを宣言します。 一般的な数値クラスNumberの子孫クラスのみが許可されます。
  • System.arraycopy()を使用すると、配列をすばやくコピーできるので便利です。
  • Javaソースファイルは、1つ以上のクラス定義を含むテキストファイルです。 Javaトランスレータは

    プログラムのソースコードがJava拡張子のファイルに保存されていること。 各クラスの変換中に取得されたコードは、クラス名およびクラス拡張子と同じ名前で個別の出力ファイルに書き込まれます。

    まず、この章では、正規の「Hello World」プログラムを作成、翻訳、および実行します。 その後、Javaトランスレータによって認識されるすべての重要な語彙要素(スペース、コメント、キーワード、識別子、リテラル、演算子、および区切り文字)を確認します。 この章の終わりまでに、優れたJavaプログラムを自分でナビゲートするのに十分な情報が得られます。

    これが最初のJavaプログラムです

    :

    クラスHelloWorld(

    システム。 アウト。 println( "Hello World");

    この本に記載されている例を使用するには、Sun Microsystemsからネットワークを経由して、Javaアプリケーションを開発するためのパッケージであるJava Developers Kitをインストールする必要があります(

    http://java.sun.com/products/jdk ). パッケージユーティリティの完全な説明 JDK-で 付録1 .

    Java言語では、すべてのプログラムコードが名前付きクラスに含まれている必要があります。 上記のサンプルテキストは、HelloWorld.javaファイルに書き込む必要があります。 ファイル名の大文字が、含まれているクラスの名前と同じであることを必ず確認してください。 この例を翻訳するには、Javaトランスレータであるjavacを起動して、ソーステキストをパラメータとしてファイル名を指定する必要があります。

    \> javac HelloWorld.Java

    この例では、トランスレータはプロセッサに依存しないバイトコードを使用してHelloWorld.classファイルを作成します。 結果のコードを実行するには、Javaランタイム環境(この場合はJavaプログラム)が必要です。この環境に、実行用の新しいクラスをロードする必要があります。 このクラスが含まれているファイルの名前ではなく、クラスの名前が指定されていることを強調します。

    > java HelloWorld

    ほとんど行われていませんが、インストールされたJavaトランスレータとランタイムが機能することを確認しました。

    ステップバイステップ

    HelloWorldは簡単な例です。 しかし、その言語の初心者のためのそのような単純なプログラムでさえJavaは、多くの新しい概念と構文の詳細を紹介するため、非常に複雑に見える場合があります。最初の例の各行を注意深く調べ、Javaプログラムを構成する要素を分析してみましょう。

    クラスHelloWorld(

    この行は予約語を使用しています

    クラス。 これは、新しいクラスについて説明することを翻訳者に伝えます。クラス全体の説明は、最初の行の開始中括弧と5行目の対応する終了中括弧の間に配置されます。Javaは、CおよびCとまったく同じ方法で使用されます。++.

    public static void main(String args)(

    これは、一見、過度に複雑な例の行は、Java言語の開発に固有の重要な要件の結果です。 ポイントは

    Javaにはグローバル関数がありません。 これらの行は、この本の最初の部分のほとんどの例に表示されるので、2番目の行の各要素を詳しく見てみましょう。

    この行を別々のトークンに分割すると、すぐにキーワードに出くわします

    公衆。 それ - アクセス修飾子、これにより、プログラマーは任意のメソッドと変数の可視性を制御できます。 この場合、アクセス修飾子publicは、メソッドがmainは表示され、どのクラスからもアクセスできます。 さらに2つのアクセスレベルインジケーターがあります-プライベートと 保護されています。これについては、第8章 .

    次のキーワードは

    静的。 この単語の助けを借りて、クラス全体を操作するために使用されるメソッドとクラス変数が宣言されます。 宣言でstaticキーワードを使用するメソッドは、ローカル変数と静的変数でのみ直接機能します。

    多くの場合、あるタイプまたは別のタイプの値を返すメソッドが必要になります。たとえば、

    整数の場合はint、float - プログラマーによって定義されたデータ型の実名またはクラス名。 この場合、文字列を表示し、メソッドから値を返す必要がありますmainは必要ありません。 そのため、修飾子が使用されました空所。 この問題については、第4章 .

    最後に、メソッド名を取得します

    主要。 ここでは珍しいことは何もありません。クラスを解釈するコマンドを受け取ったJavaインタープリターの既存のすべての実装は、メソッドを呼び出すことによって作業を開始します。主要。 Javaトランスレータは、mainメソッドを持たないクラスを変換できます。 そして、これがメソッドなしでクラスを実行するためのJavaインタープリターですメインはできません。

    メソッドに渡す必要のあるすべてのパラメーターは、「;」で区切られた項目のリストとして、括弧のペア内で指定されます。 (セミコロン)。 パラメータリストの各項目は、スペースで区切られたタイプと識別子で構成されています。 メソッドにパラメーターがない場合でも、名前の後にいくつかの括弧を付ける必要があります。 私たちが今議論している例では、方法

    mainには、かなり複雑なタイプですが、パラメーターは1つしかありません。argsは、という名前のパラメータを宣言しますクラスを表すオブジェクトの配列であるargs弦。 args識別子の後の角括弧に注意してください。 これらは、指定されたタイプの単一の要素ではなく、配列を処理していることを示しています。 次の章で配列の説明に戻りますが、今のところ、タイプに注意してください弦 - これはクラスです。 文字列については、第9章 .

    システム。 アウト。 prlntln( "Hello World!");

    この行はメソッドを実行します

    outオブジェクトのprintln。 オブジェクト outはクラスで宣言されていますOutputStreamであり、システムで静的に初期化されます。 V 第9章13 あなたはクラスの仕事のニュアンスに精通する機会があります文字列とOutputStream。

    4行目の閉じ中括弧は、メソッド宣言を終了します。

    mainであり、5行目の同じ括弧でHelloWorldクラス宣言を終了します。

    語彙の基本

    最小限のJavaクラスについて詳しく説明したので、戻ってこの言語の構文の一般的な側面を見てみましょう。 のためのプログラム

    Java- これは、スペース、コメント、キーワード、識別子、リテラル定数、演算子、および区切り文字のコレクションです。プログラムテキストの任意のフォーマットを可能にする言語。 プログラムが正しく機能するために、特別な方法でテキストを揃える必要はありません。 たとえば、クラスHelloWorldは、2行またはその他の任意の方法で記述できます。 また、個々のトークンの間に少なくとも1つのスペース、タブ、または改行があれば(その間に演算子や区切り文字はありません)、まったく同じように機能します。

    コメント(1)

    コメントはプログラムの実行可能コードにはまったく影響しませんが、

    正しく使用すると、ソースコードの非常に重要な部分であることがわかります。 コメントには、単一行コメント、複数行コメント、そして最後にドキュメントコメントの3種類があります。 単一行コメントは//で始まり、行の終わりで終わります。 このスタイルのコメントは、コードの個々の行に簡単な説明を提供するのに役立ちます。

    a = 42; // もしも

    42 -答え、質問は何でしたか?

    より詳細な説明については、コメントのテキストを記号/ *で開始し、記号* /で終了する、複数行に配置されたコメントを使用できます。この場合、これらの記号のペア間のすべてのテキストはコメントおよび翻訳者として扱われます。それを無視します。

    *このコードはやや複雑です...

    *説明しようと思います:

    3番目の特別な形式のコメントは、サービスプログラム用です。

    javadoc、これは、Javaコンパイラコンポーネントを使用して、クラスインターフェイスのドキュメントを自動的に生成します。 この種のコメントに使用される規則は次のとおりです。パブリッククラス、メソッド、または変数の宣言の前にドキュメントコメントを配置する, / **(スラッシュと2つのアスタリスク)で始める必要があります。 このようなコメントは、通常のコメントと同じように、* /記号で終了します。 javadocプログラムは、@記号で始まるdocコメント内のいくつかの特別な変数を区別できます。 このようなコメントの例を次に示します。

    *このクラスは素晴らしいことをすることができます。 私たちは誰にでもアドバイスします

    *さらに完璧なクラスを書きたいので、

    *基本。

    * @seeJava。 アプレット。 アプレット

    *©著者パトリックノートン

    クラスCoolAppletはアプレットを拡張します(/ **

    *このメソッドには2つのパラメーターがあります。

    keyはパラメータの名前です。名前が付いたパラメータの値です鍵。

    * / void put(文字列キー、オブジェクト値)(

    予約キーワード

    予約キーワードは、ある言語で使用される特別な識別子です。

    Javaは、組み込み型、修飾子、およびプログラム実行制御を識別するために使用されます。 今日の言語で NS avaには59の予約語があります(表2を参照)。 これらのキーワードは、演算子と区切り文字の構文とともに、言語の説明に含まれています。Java。 これらは意図された目的にのみ使用でき、変数、クラス、またはメソッド名の識別子として使用することはできません。

    表2

    Javaの予約語

    言葉に注意してください

    byvalue、cast、const、future、generic、goto、inner、operator、outer、rest、var予約済み Java、 まだ使用されていませんさらに、 Java 予約済みのメソッド名があります(これらのメソッドはすべてのクラスに継承され、クラスメソッドを明示的にオーバーライドする場合を除いて使用できません。物体)。

    表3

    予約済みのメソッド名

    Java

    識別子

    識別子は、クラス、メソッド、および変数に名前を付けるために使用されます。 小文字と大文字、数字、記号_(アンダースコア)と$(ドル)の任意のシーケンスを識別子として使用できます。 識別子は数字で始めないでください。これにより、トランスレータは、以下で説明する数値リテラル定数と識別子を混同しないようにします。

    Java- 大文字と小文字を区別する言語。 これは、たとえば、価値と価値- 異なる識別子。

    リテラル

    の定数

    Javaは、そのリテラル表現によって与えられます。 整数、浮動小数点数、ブール値、文字、および文字列は、ソースコードのどこにでも配置できます。 タイプはでカバーされます第4章 .

    整数リテラル

    整数は、通常のプログラムで最も一般的に使用される型です。 1、2、3、42などの整数値は、整数リテラルです。 この例では、10進数、つまり基数10の数値が示されています。これは、コンピューターの世界以外で日常的に使用されている数値です。 10進数に加えて、基数8および16の数値(8進数および16進数)も整数リテラルとして使用できます。 Javaは、先行ゼロによって8進数を認識します。 通常の10進数はゼロから始めることができないため、プログラムで外部的に有効な数値09を使用すると、9が0の範囲にないため、変換エラーメッセージが表示されます。

    7、8進数に有効です。 16進定数は、先行ゼロx文字(0xまたは0X)によって区別されます。 16進数の値の範囲は0です。15、および値10の数字として..15はAからの文字を使用します F(またはから NS)。 16進数を使用すると、たとえば次のように書くことで、コンピューター指向の値を簡潔かつ明確に表すことができます。 Oxffff 65535の代わりに。

    整数リテラルはタイプの値です

    int、これは Javaは32ビットワードで保存されます。 絶対値が約20億を超える値が必要な場合は、次のような定数を使用する必要があります。長さ。 この場合、数値は64​​ビットワードで格納されます。 上記のいずれかの基数を持つ数値の場合、右側に小文字または大文字を割り当てることができますL、与えられた数がタイプであることを示す長さ。 たとえば、Ox7ffffffffffffffLまたは9223372036854775807Lは、次のような数値の最大値です。長さ。

    浮動小数点リテラル

    浮動小数点数は、小数部分を持つ10進値を表します。 それらは、通常の形式または指数形式のいずれかで記述できます。 通常の形式では、数値は、小数点以下の桁数とそれに続く小数部の小数点以下の桁で構成されます。 たとえば、2.0、3.14159、および6667は、標準形式で記述された有効な浮動小数点値です。 指数形式では、リストされた要素の後に10進数の順序が追加で示されます。 順序は、文字EまたはEに続く正または負の10進数によって決定されます。指数形式の数値の例は、6.022e23、314159E-05、2e +100です。 V

    Java浮動小数点数は、デフォルトではdoubleとして扱われます。 あなたがのような定数が必要な場合float、リテラルの右側に、文字Fまたはfを割り当てる必要があります。 あなたが冗長な定義のファンなら、あなたは次のようなリテラルに追加することができます文字Dを2倍にする、または NS。 タイプのデフォルト値ダブルスは64ビットワードに格納され、精度の低い値は次のようになります float-32ビット。

    ブールリテラル

    ブール変数は2つの値しか持つことができません-

    真実と false(false)。 ブール値真実と falseは数値表現に変換されません。 キーワード Javaのtrueは1に等しくなく、falseは0に等しくありません。 Javaでは、これらの値はブール変数に割り当てるか、ブール演算子を使用した式でのみ使用できます。

    文字リテラル

    の記号

    Java- これらはシンボルテーブルのインデックスですUNICODE。 これらは16ビット値であり、整数に変換でき、加算演算子や減算演算子などの整数算術演算子を適用できます。 文字リテラルは、アポストロフィ( "")のペアの中に配置されます。 テーブルのすべての表示シンボルASCIIは、アポストロフィのペアの中に直接挿入できます。「a」、「z」、 「@」。 直接入力できない文字には、いくつかのエスケープシーケンスが用意されています。

    表3。

    2.エスケープシーケンス

    制御シーケンス

    説明

    8進数の記号

    (ddd)

    16進文字

    UNICODE(xxxx)

    アポストロフィ

    バックスラッシュ

    キャリッジリターン

    ラインフィード、改行

    ページの翻訳

    (フォームフィード)

    水平タブ

    (タブ)

    一歩戻る

    (バックスペース)

    文字列リテラル

    の文字列リテラル

    Javaは、他の多くの言語と同じように見えます-二重引用符( "")のペアで囲まれた任意のテキストです。 文字列リテラルはJavaは非常に独特な方法で実装されています(Javaは行ごとにオブジェクトを作成します)、外部的にはこれはまったく現れません。 文字列リテラルの例:"こんにちは 世界! "; "2つの\行; \これは引用符で囲まれています\" "。文字リテラルに対して定義されているすべてのエスケープシーケンスと8進数または16進数の表記形式は、文字列に対してまったく同じように機能します。Javaは、ソースコードの同じ行で開始および終了する必要があります。 この言語では、他の多くの言語とは異なり、新しい行で文字列リテラルを継続するためのエスケープシーケンスはありません。

    演算子

    演算子は、1つまたは2つの引数に対して何らかのアクションを実行し、結果を生成するものです。 構文的には、演算子はほとんどの場合、識別子とリテラルの間に配置されます。 演算子については、

    第5章 、それらのリストを表3に示します。 3.

    表3。

    3.言語の演算子 Java

    セパレーター

    構文的に正しいJavaプログラムに表示される可能性のある文字のいくつかのグループだけがまだ名前が付けられていません。 これらは、コードのルックアンドフィールに影響を与える単純な区切り文字です。

    名前

    それらは何のために使用されますか?

    丸括弧

    メソッドの宣言と呼び出しでパラメーターのリストを割り当てます。また、式での操作の優先順位の設定、プログラム実行制御ステートメントでの式の強調表示、および型キャスト演算子でも使用されます。

    中かっこ

    角括弧

    配列宣言で、および個々の配列要素にアクセスするときに使用されます。

    セミコロン

    演算子を区切ります。

    変数宣言内の識別子を区切ります。ループヘッダー内のステートメントをリンクするためにも使用されます

    にとって。

    パッケージ名をサブパッケージおよびクラス名から分離します。変数またはメソッド名を変数名から分離するためにも使用されます。

    変数

    変数は、Javaプログラムの主なストレージ要素です。 変数は、識別子、タイプ、およびスコープの組み合わせによって特徴付けられます。 変数を宣言した場所に応じて、たとえばforループ内のコードに対してローカルにすることも、このクラスのすべてのメソッドにアクセスできるインスタンス変数にすることもできます。 ローカルスコープは中括弧を使用して宣言されます。

    変数宣言

    変数を宣言する基本的な形式は次のとおりです。

    タイプ識別子[=値] [、識別子[=値

    7...];

    タイプは、組み込みタイプのいずれかです。つまり、

    byte、short、int、long、char、float、double、ブール値、またはクラスまたはインターフェイスの名前。 これらすべてのタイプについては、次の章 ..。 以下は、さまざまなタイプの変数を宣言するいくつかの例です。 一部の例には、初期値の初期化が含まれていることに注意してください。 初期値が指定されていない変数は、自動的にゼロに初期化されます。

    以下の例では、直角三角形の辺に対応する3つの変数を作成してから

    NS ピタゴラスの定理を使用して、斜辺の長さが計算されます。この場合は、辺が3-4-5の古典的な直角三角形の斜辺の大きさである5です。

    クラス変数(

    public static void main(String args)(

    = Math.sqrt(a * a + b * b);

    System.out.println( "c =" + c);

    あなたの最初のステップ

    私たちはすでに多くのことを達成しています:最初に私たちはその言語で小さなプログラムを書きました

    Javaとそれが何で構成されているか(コードブロック、コメント)を詳細に調べました。 キーワードと演算子のリストを見てきましたが、その目的については後の章で詳しく説明します。 これで、Javaプログラムの主要部分を個別に区別できるようになり、読み始める準備が整いました。第4章 、単純なデータ型の詳細。