Think Java2nd Ed.
この本の目標は、あなたがコンピュータ科学者のように考えるように教えることです。この考え方は、数学、工学、自然科学の最高の機能のいくつかを組み合わせたものです。数学者と同様に、コンピュータ科学者は形式言語を使用してアイデア、具体的には計算を示します。エンジニアのように、彼らは物事を設計し、コンポーネントをシステムに組み立て、代替案間のトレードオフを評価します。そして、科学者のように、彼らは複雑なシステムの動作を観察し、仮説を形成し、予測をテストします。
コンピュータ科学者にとって重要なスキルは問題ですsolving.It 問題を定式化し、解決策について創造的に考え、解決策を明確に表現する能力を必要とします。accurately.As 結局のところ、コンピュータをプログラムすることを学ぶプロセスは、問題解決スキルを開発する絶好の機会です。あるレベルでは、Javaプログラムを書くことを学ぶことになります。しかし、別のレベルでは、あなたはへの手段としてプログラミングを使用しますend.As 私たちは一緒に行く、その終わりが明確になります。
1.1コンピュータとは何ですか?
コンピュータという言葉を聞くと、デスクトップやラップトップを思い浮かべることがよくあります。驚くことではありませんが、Google画像(https://images.google.com/)で”コンピュータ”を検索すると、これらのタイプのマシンの行と行が表示されます。しかし、より一般的な意味では、コンピュータは、データを格納および処理する任意のタイプのデバイスであり得る。
Dictionary.com コンピュータを”データを受け入れ、所定の数学的および論理的な操作を高速で実行し、これらの操作の結果を表示するように設計されたプログラマブルメインフレーム、デスクトップおよびラップトップコンピュータ、タブレット、およびスマートフォンは、コンピュータの異なるタイプのいくつかです。”
各タイプのコンピュータには独自のデザインがありますが、内部的にはすべて同じタイプのハードウェアを共有しています。最も重要なハードウェアコンポーネントは、単純な計算を実行するプロセッサ(またはCpu)と、情報を一時的に格納するメモリ(またはRAM)です。図1.1は、これらのコンポーネントがどのように見えるかを示しています。
図1.1:プロセッサとメモリハードウェアの例
ユーザーは一般的にタッチスクリーン、キーボード、モニターを見たり操作したりしますが、実際の計算を実行するのはプロセッサとメモリです。今日では、少なくとも8つのプロセッサと4ギガバイト(40億セル)のメモリを搭載することは、スマートフォンであってもかなり標準的です。
1.2プログラミングとは何ですか?
プログラムは、コンピュータのハードウェア上で計算を実行する方法を指定する命令のシーケンスです。計算は、方程式系を解くか、多項式の根を見つけるような数学的なものかもしれません。また、文書内のテキストの検索や置換、または(不思議なことに)プログラムのコンパイルのような記号的な計算でもあります。
詳細は言語によって異なりますが、基本的な手順はほぼすべての言語で表示されます。
入力:キーボード、ファイル、センサー、またはその他のデバイスからデー 出力:画面にデータを表示するか、ファイルや他のデバイスにデータを送信します。 数学:加算や除算などの基本的な数学演算を実行します。 決定:特定の条件を確認し、適切なコードを実行します。 繰り返し: 通常、いくつかのバリエーションで、繰り返しアクションを実行します。
信じようと信じまいと、それだけで十分だ。あなたが今までに使用したすべてのプログラムは、どんなに複雑であっても、多くのように見える小さな命令で構成されていますthese.So プログラミングは、大規模で複雑なタスクを小規模なサブタスクに分割するプロセスと考えることができます。このプロセスは、サブタスクがハードウェアによって提供される電子回路で実行されるのに十分簡単になるまで続きます。
1.3こんにちは世界プログラム
伝統的に、最初のプログラムを書き学習の際の新しいプログラミング言語と呼ばれる”Hello World”プログラム。では出力のこんにちは、世界! の画面になります。Javaでは、このようになります:
このプログラムを運行表示され、以下の:
こんにちは、世界!
出力には引用符が含まれていないことに注意してください。
Javaプログラムはクラス定義とメソッド定義で構成され、メソッドはステートメントで構成されます。ステートメントは、基本的なアクションを実行するコード行です。のこんにちは世界プログラムこのラインが印刷書を表示するメッセージのユーザー:
システム。出ろprintln(“Hello,World!”);
System.out.println
結果を画面に表示します。println
という名前は”印刷行”を表します。紛らわしいことに、printは”画面に表示する”と”プリンタに送信する”の両方を意味することができます。この本では、画面に出力することを意味するときに”表示する”と言うことを試みます。ほとんどの文と同様に、print文はセミコロン(;
)で終わります。Javaは「大文字と小文字を区別する」ため、大文字と小文字は同じではありません。のこんにちは世界プログラムSystem
はじまり、大文字;およびSYSTEM
せん。
メソッドは、名前付きのステートメントのシーケンスです。このプログラムは、次の名前のメソッドを定義しますmain
:
public static void main(String args)
プログラムが実行されると、main
の最初の文から開始され、最後の文が終了すると終了します。main
の名前と形式は特別です。main
の名前と形式は特別です。main
の名前と形式は特別です。main
の名前後で、複数のメソッドを定義するプログラムが表示されます。
このプログラムはHello
という名前のクラスを定義します。今のところ、クラスはメソッドのコレクションです; これについては後で詳しく説明します。クラスには好きな名前を付けることができますが、大文字で始めるのが一般的です。クラスの名前は、それが入っているファイルの名前と一致しなければならないので、このクラスはHelloという名前のファイルになければなりません。.こんにちは、このクラスの名前を変更することができません。ジャワ。
Javaを使巻きブレース({
および}
)グループのものです。にこんにちは.javaでは、最も外側の中括弧にはクラス定義が含まれ、内側の中括弧にはメソッド定義が含まれています。
二つのスラッシュ(//
)で始まる行は、コードを説明する英語のテキストのビットであるコメントです。Javaが//
を見ると、そこから行の終わりまでのすべてが無視されます。コメントはプログラムの実行には影響しませんが、他のプログラマ(そしてあなたの将来の自己)があなたが何をするのかを理解しやすくします。
1.4Javaプログラムのコンパイル
この本で学ぶプログラミング言語は、高レベル言語であるJavaです。あなたが聞いたことがあるかもしれない他の高レベルの言語には、Python、CおよびC++、PHP、Ruby、およびJavaScriptが含まれます。
実行する前に、高レベル言語のプログラムを”機械語”とも呼ばれる低レベル言語に翻訳する必要があります。この翻訳には時間がかかりますが、これは高レベル言語の小さな欠点です。しかし、高レベル言語には二つの大きな利点があります:
- 高レベルの言語でプログラムする方がはるかに簡単です。プログラムは書くのにかかる時間が短く、読みやすく、正しい可能性が高くなります。
- 高レベル言語は移植性があり、変更がほとんどないかまったくないさまざまな種類のコンピュータで実行できます。低レベルのプログラムは、1種類のコンピュータでのみ実行できます。
二つの種類のプログラムは、高レベル言語を低レベル言語に翻訳します。compilers.An インタプリタは、高レベルのプログラムを読み取り、それを実行します。says.It プログラムを一度に少しずつ処理し、交互に行を読み取り、計算を実行します。図1.2は、インタプリタの構造を示しています。
図1.2:インタプリタ言語の実行方法
対照的に、コンパイラはプログラム全体を読み取り、プログラムの実行を開始する前に完全に変換します。高レベルのプログラムはソースコードと呼ばれます。翻訳されたプログラムは、オブジェクトコード、または実行可能ファイルと呼ばれます。プログラムがコンパイルされると、ソースをさらに翻訳せずに繰り返し実行できますcode.As その結果、コンパイルされたプログラムは、多くの場合、解釈されたプログ
オブジェクトコードは、低レベル言語として、移植性がないことに注意してください。Windowsラップトップ用にコンパイルされた実行可能ファイルをAndroid携帯電話で実行することはできません。example.To マシンの異なるタイプのプログラムを実行し、それが複数のコンパイルする必要がありますtimes.It さまざまな種類のマシンで正しくコンパイルして実行するソースコードを書くのが難しい場合があります。
この問題に対処するために、Javaはコンパイルされ、解釈されます。Javaコンパイラは、ソース-コードを直接実行可能ファイルに変換する代わりに、仮想マシン用のコードを生成します。この”想像上の”マシンは、デスクトップ、ラップトップ、タブレット、携帯電話などに共通の機能を備えています。Javaバイトコードと呼ばれるその言語は、オブジェクトコードのように見え、解釈が簡単で高速です。
その結果、あるマシンでJavaプログラムをコンパイルし、バイトコードを別のマシンに転送し、その他のマシンでバイトコードを実行することができます。図1.3は、開発プロセスのステップを示しています。Javaコンパイラは、次の名前のプログラムですjavac.It 翻訳されます。javaファイルに。結果のバイトコードを格納するクラスファイル。Javaインタプリタは、「Java仮想マシン」(JVM)の略であるjavaという名前の別のプログラムです。
図1.3: Javaプログラムのコンパイルと実行のプロセス。
プログラマーに書き込み開発において、ソースコードのファイルこんにちは.javaとjavacを使用してコンパイルします。エラーがない場合、コンパイラはバイトコードをファイルに保存しますHello.class.To プログラムを実行すると、プログラマはjavaを使用してバイトコードを解釈します。その後、プログラムの結果が画面に表示されます。
複雑に見えるかもしれませんが、これらの手順はほとんどの開発環境で自動化されています。通常、プログラムをコンパイルして解釈するには、ボタンを押すか、単一のコマンドを入力するだけです。一方、バックグラウンドで何が起こっているのかを知ることが重要なので、何か問題が発生した場合は、それが何であるかを把握することができま
1.5二つのメッセージの表示
main
メソッドには、好きなだけステートメントを入れることができます。たとえば、複数の行の出力を表示するには:
この例も示しているように、行の最後にコメントを置くだけでなく、行にコメントを置くことができます。
引用符で囲まれたフレーズは、メモリ内で一緒に張られた一連の文字が含まれているため、文字列と呼ばれます。文字は、文字、数字、句読点、記号、スペース、タブなどにすることができます。
System.out.println
は、次の行の先頭に移動する改行と呼ばれる特殊文字を追加します。最後に改行が必要ない場合は、代わりにprint
を使用できますprintln
:
この例では、最初の文は改行を追加しないため、出力は単一行に表示されます:
さよなら、残酷な世界
最初の文字列の最後にスペースがあり、出力にはcruelという単語の直前に表示されます。
1.6ソースコードの書式設定
Javaソースコードでは、いくつかのスペースが必要です。たとえば、単語の間に少なくとも1つのスペースが必要なので、このプログラムは合法ではありません:
publicclassGoodbye{publicstaticvoidmain(String args){システム。出ろprint(“Goodbye,”);システム。出ろprintln(”残酷な世界”); }}
しかし、他のほとんどのスペースはオプションです。たとえば、このプログラムは合法です:
改行はオプションです。too.So 私たちはこれを書くことができます:
それはまだ動作しますが、プログラムはますます読みにくくなっています。改行とスペースは、プログラムを視覚的に整理するために重要であり、プログラムを理解しやすくし、エラーが発生したときにエラーを見つけやすくします。
多くのエディタは、一貫したインデントと改行でソースコードを自動的にフォーマットします。たとえば、DrJava(付録A.1を参照)では、すべてのテキストを選択し(Ctrl+A)、Tabキーを押すことでコードをインデントできます。
多くのソフトウェア開発を行う組織は、通常、ソースコードの書式設定方法について厳格なガイドラインを持っています。たとえば、Googleはオープンソースプロジェクトで使用するためのJavaコーディング標準を公開しています:https://google.github.io/styleguide/javaguide.html。
これらのガイドラインは、まだ見ていない言語機能を参照しているため、おそらく今は理解していないでしょう。しかし、あなたはこの本を読んで定期的にそれらを参照することをお勧めします。
1.7エスケープシーケンスの使用
一行のコードだけで複数行の出力を表示することができます。改行を配置する場所をJavaに指示するだけです:
の出力は、各終改行文字:
こんにちは!どう?近ごろ。
各\n
は、エスケープシーケンス、または単一の文字を表すソースコードの二つの文字です。(バックスラッシュを使用すると、文字列をエスケープして特殊文字を書き込むことができます。)\n
とHow
の間にスペースがないことに注意してください。そこにスペースを追加すると、2行目の先頭にスペースがあります。
\n
改行 \t
タブ \"
二重引用符 \
バックスラッシュ 表1.1:一般的なエスケープシーケンス
Javaには合計8つのエスケープシーケンスがあり、最も一般的に使用される4つのエスケープシーケンスを表1.1に示します。たとえば、文字列の中に引用符を記述するには、円記号でエスケープする必要があります:
システム。出ろprintln(“と彼女は言った\”こんにちは!\”私に。”);
の成果は以下の通りである:
彼女は言った”こんにちは!”私には。
1.8 コンピュータサイエンスとは何ですか?
私たちの主な目標は、コンピュータ科学者のように考える方法を教えることであるため、この本は意図的にJava言語に関するいくつかの詳細(他のエスケー計算を理解できることは、コードを書く方法を学ぶよりもはるかに価値があります。
Java自体についてもっと学ぶことに興味があるなら、Oracleはそのウェブサイト(https://thinkjava.org/tutorial)で公式のチュートリアルセットを維持しています。”Java言語の学習”の下にある”言語の基本”チュートリアルは、開始するのに適した場所です。
プログラムを書く上で最も興味深い側面の一つは、特に複数の解決策がある場合に、特定の問題を解決する方法を決定することです。たとえば、数字のリストをソートする方法は数多くあり、それぞれの方法にはその方法がありますadvantages.In 与えられた状況に対してどの方法が最善であるかを決定するためには、解を形式的に記述し分析するための技術が必要です。
アルゴリズムは、問題を解決する方法を指定する一連のステップです。いくつかのアルゴリズムは、他のものよりも高速であり、いくつかは、コンピュータのメモリ内のより少ないスペースを使用しています。コンピュータサイエンスは、アルゴリズムの科学であり、その発見とanalysis.As あなたが前に解決していない問題のためのアルゴリズムを開発することを学ぶ、あなたはコンピュータ科学者のように考えることを学ぶでしょう。
アルゴリズムの設計とコードの記述は困難であり、エラーが発生しやすい。歴史的な理由から、プログラミングエラーはバグと呼ばれ、それらを追跡して修正するプロセスが呼び出されますdebugging.As あなたはプログラムをデバッグすることを学び、新しい問題解決スキルを開発します。予期しないエラーが発生したときに創造的に考える必要があります。
それはイライラすることができますが、デバッグは、コンピュータの知的豊かな挑戦的な、そして興味深い部分ですscience.In いくつかの方法では、デバッグは探偵の仕事のようなものです。あなたは手がかりに直面している、とあなたが見る結果につながったプロセスやイベントを推測する必要があります。プログラムを修正し、そのパフォーマンスを向上させる方法を考えることは、時には新しいアルゴリズムの発見につながることさえあります。
1.9デバッグプログラム
この本をコンピュータの前で読んで、例を試してみることをお勧めします。多くの例は、DrJavaのInteractionsペインで直接実行できます(付録A.2を参照)。しかし、コードをソースファイルに入れると、バリエーションを試す方が簡単になります。
新しい機能を試しているときはいつでも、間違いを犯すようにしてください。例えば、こんにちは世界プログラムとそのままにした場合、引用符?あなたが両方を除外した場合はどうなりますか?もしprintln
のスペルが間違っていたらどうなりますか?これらの種類の実験は、あなたが読んだことを覚えておくのに役立ちます。あなたはどのようなエラーメッセージを学ぶので、彼らはまた、デバッmean.It 後で誤ってミスをするよりも、今、意図的にミスをする方が良いです。
デバッグは実験的な科学のようなものです:何が間違っているのか考えたら、プログラムを変更してもう一度試してみてください。あなたの仮説が正しければ、修正の結果を予測することができ、作業プログラムに一歩近づくことができます。あなたの仮説が間違っていた場合は、新しい仮説を考え出す必要があります。
プログラミングとデバッグは手をつないで行く必要があります。たくさんのコードを書いてから、すべてが機能するまで試行錯誤のデバッグを実行しないでください。代わりに、何かを行うプログラムから始めて、小さな変更を行い、プログラムがあなたが望むことをするまで、あなたが行くようにそれらをデバッそうすれば、あなたは常に作業プログラムを持つことになり、エラーを隔離することはより簡単になります。
この原理の良い例は、Linuxオペレーティングシステムであり、何百万行もの行が含まれています。code.It Linus TorvaldsがIntel80386チップを探索するために使用した簡単なプログラムとして始まりました。LinuxユーザーズガイドのLarry Greenfieldによると、「Linusの初期のプロジェクトの1つは、AAAAとBBBBの印刷を切り替えるプログラムでした。これは後にLinuxに進化しました。”
最後に、プログラミングは時々強い感情を引き出します。あなたが困難なバグで苦労している場合は、怒っている、落胆している、または恥ずかしいと感じるかもしれません。あなたは一人ではなく、事実上すべてのプログラマが同様の経験をしていることを覚えておいてください。友人に手を差し伸べると質問をすることを躊躇しないでください!
1.10語彙
本を通して、私たちは最初に使用するときに各用語を定義しようとしますit.At 各章の終わりには、新しい用語とその定義が出現順に含まれています。あなたはこの語彙を学ぶいくつかの時間を費やす場合は、次の章を読んで簡単に時間を持つことになります。
問題解決:問題を定式化し、解決策を見つけ、解決策を表現するプロセス。 ハードウェア:Cpu、RAM、ハードディスクなどのコンピュータの電子部品および機械部品。 プロセッサ: 基本的な算術および論理のような簡単な命令を行うコンピュータチップ。 メモリ:コンピュータの電源が入っている限り、データを格納する回路。ハードディスクやフラッシュのような永続的な記憶装置と混同しないように。 プログラム:コンピュータ上でタスクを実行する方法を指定する一連の命令。”ソフトウェア”とも呼ばれます。 プログラミング:実行可能なコンピュータプログラムの作成への問題解決の適用。 statement:アルゴリズムの1つのステップを指定するプログラムの一部。 print statement:出力を画面に表示させるステートメント。 方法: ステートメントの名前付きシーケンス。 クラス:今のところ、関連するメソッドのコレクション。(あなたはそれにもっとたくさんあることを後で見るでしょう。)コメント:プログラムに関する情報が含まれているが、プログラムの実行時には効果がないプログラムの一部。 高レベル言語:人間が読み書きしやすいように設計されたプログラミング言語。 低レベル言語:コンピュータの実行が容易になるように設計されたプログラミング言語。「機械語」とも呼ばれます。 ポータブル:複数の種類のコンピュータ上で実行するプログラムの能力。 解釈: プログラムを一度に1行ずつ翻訳し、対応する命令をすぐに実行することによって、高レベル言語でプログラムを実行する。 コンパイル:後の実行の準備のために、高レベル言語のプログラムを低レベル言語に一度にすべて翻訳します。 ソースコード:コンパイルされる前の高レベル言語のプログラム。 オブジェクトコード:プログラムを翻訳した後のコンパイラの出力。 実行可能ファイル:特定のハードウェア上で実行可能なオブジェクトコードの別の名前です。 仮想マシン:実マシンのエミュレーション。 JVMは、コンピュータがJavaプログラムを実行できるようにします。 バイトコード:Javaプログラムに使用される特別な種類のオブジェクトコード。バイトコードはオブジェクトコードに似ていますが、高レベル言語のように移植性があります。 文字列:文字のシーケンス;テキストの主なデータ型。 改行:テキストの行の終わりを示す特殊文字。「行末」、「行末」(EOL)、または「改行」とも呼ばれます。 エスケープシーケンス:文字列内で使用されたときに特殊文字を表すコードのシーケンス。 アルゴリズム:コンピュータの有無にかかわらず、問題を解決するための手順または式。 コンピュータサイエンス: 計算とその応用への科学的かつ実用的なアプローチ。 バグ:プログラムのエラー。 デバッグ:エラーを検出して削除するプロセス。
1.11演習
各章の最後には、学んだことを使ってできる演習が含まれています。私たちは、少なくともすべての問題を試みることをお勧めします。それについて読むことによってだけプログラムすることを学ぶことができない;練習しなければならない。
Javaプログラムをコンパイルして実行する前に、いくつかのツールをダウンロードしてインストールする必要があります。多くの良い選択肢がありますが、初心者に適した「統合開発環境」(IDE)であるDrJavaをお勧めします。
この章のコードは、Thinkjavacode2のch01ディレクトリにあります。ページを参照してください。?? リポジトリをダウンロードする方法の手順については。演習を開始する前に、例をコンパイルして実行することをお勧めします。
コンピュータ科学者は、一般的な英語の意味以外の何かを意味するために一般的な英語の単語を使用する迷惑な習慣を持っています。たとえば、英語では、文とコメントは同じものですが、プログラムでは異なります。
- コンピュータの専門用語では、ステートメントとコメントの違いは何ですか?
- プログラムが移植可能であると言うのはどういう意味ですか?
- 一般的な英語では、compileという言葉はどういう意味ですか?
- 実行可能ファイルとは何ですか? なぜその言葉が名詞として使われているのですか?
各章の最後にある語彙セクションは、コンピュータサイエンスにおいて特別な意味を持つ単語やフレーズを強調することを目的としています。よく知られた単語を見るとき、意味するものを知っていると仮定してはいけない!
他に何かをする前に、Javaプログラムをコンパイルして実行する方法を見つけてください。一部の環境では、セクション1.3の例と同様のサンプルプログラムが提供されています。
- 型のこんにちは世界プログラムをコンパイルや実行します。
- を追加しprint文を表示する第二メッセージの後にHello,World!.機知に富んだ何かを言う、あなたはどうですか?.プログラムを再度コンパイルして実行します。
- プログラムにコメントを(任意の場所で)追加し、再コンパイルして再度実行します。新しいコメントは結果に影響を与えてはなりません。
この演習は些細なように見えるかもしれませんが、それは私たちが働くプログラムの多くの出発点ですwith.To 自信を持ってデバッグ、あなたのプログラミング環境に自信を持っている必要があります。
いくつかの環境では、どのプログラムが実行されているかを追跡するのは簡単です。誤って別のプログラムを実行している間に、あるプログラムをデバッグしようとしている可能性があります。Print文を追加(および変更)することは、見ているプログラムが実行しているプログラムであることを確認する簡単な方法です。
コンパイラが生成するエラーメッセージを見るために、考えることができるだけ多くのエラーをコミットすることをお勧めします。コンパイラが何が間違っているのかを正確に伝えることがあり、あなたがしなければならないのはそれを修正することだけです。しかし、時にはエラーメッセージが誤解を招くことがあります。時間が経つにつれて、コンパイラを信頼できるとき、そして自分で物事を把握しなければならないときの感覚を発達させるでしょう。
はじめにこんにちは世界プログラムを試しを。各変更を行った後、プログラムをコンパイルし、エラーメッセージ(存在する場合)を読み取り、エラーを修正します。
- 開いている中括弧のいずれかを削除します。
- 閉じた中括弧のいずれかを削除します。
-
main
の代わりにmian
と書いてください。 - 単語
static
を削除します。 - 単語
public
を削除します。 - 単語
System
を削除します。 -
println
をPrintln
に置き換えます。 -
println
をprint
に置き換えます。 - 括弧を一つ削除します。
- 括弧を追加します。