第1章 Java
1.1 Javaとは1995年、Sun Microsystems 社から公表されたプログラミング言語である。
（Sun Microsystems 社は 2010年に Oracle Corporation に吸収合併された。）文法は、C 言語と似ているが、互換性はない。（一方、 C++ 言語は C 言語の拡張として設計された。）C++ と同様、言語 であるが、C++ に比べてシンプルな仕様になっている。 なお、(ECMAScript) とは文法は似ているが、それ以外の関係はなく全く別の言語であるので注意する必要がある。
Q 1.1.1 次の文章のうち、正しいものに○、誤っているものに×をつけよ。
1.

Java の文法は C 言語に似ており、Java のコンパイラーは C 言語のソースファイルをコンパイルすることも可能となっている。

2.

Java はオブジェクト指向言語であるが、C++ 言語との互換性は持っていない。

3.

Web ブラウザー上でインタプリター方式で実行する Java プログラムのことを JavaScript と呼ぶ。

1.2 Java の特徴Java は、誕生当時は Web ページにアニメーションとインタラクティブ性をもたらすための仕組みとして、世に広まった。
WWW の基本的な応答
クライアント（ローカル）

アプレットを使った場合の応答
サーバー（リモート）

We b ブラウザー
要求
アクション

表⽰

応答

クライアント（ローカル）

We b サーバー

サーバー（リモート）

We b ブラウザー
要求
アクション
アプレット

表⽰

We b サーバー

応答

HTML だけを用いて書かれた Web 文書の場合は、ユーザーがマウスをクリックするなどのアクションがあると、ブラウザーはそのアクションを遠隔地のWWW サーバーに伝え、その応答を待って新しい表示をする必要がある。
Java を使っている場合は、アプレット (applet) と呼ばれる Java のプログラムがHTML から参照されており、サーバーからブラウザーへダウンロードして実行される。するとユーザーのアクションに対して、ブラウザーの中で実行されていオブジェクト指向言語 第 1 章 p.1

るアプレットが即時に反応することができる。こうして、インタラクティブ性の高いページを記述することが可能になった。
Java の情報のページ
https://www.oracle.com/java/technologies/ （Java の本家）
このように、アプレットと呼ばれる Java のプログラムはネットワークを通じて別のコンピューターに移動して実行されることになる。このような使い方をするためには安全性と可搬性 という特徴が重要になる。

安全性
これは、簡単にいえばアプレットを使って他人のコンピューターに悪戯をすることができない、ということである。もし、Web ページに任意のプログラムを埋め込んでブラウザー上で実行させることができれば、ハードディスク中のデータを消去してしまうなどのイタズラが簡単に行なえる。
安全性を保障するためには、まずプログラムにファイル操作などをさせない、などの制限を課する必要があるが、C のような言語では、ポインター（アドレス）演算や無制限な型変換などの仕組みを通じて、悪意のあるプログラマーが抜け道を作ることができ、言語処理系の設計でこれを防ぐのは容易ではない。
Java はポインター演算を明示的に提供せず、型変換をきちんとチェックするなど、このような抜け道がないよう設計されている。このような設計は安全性だ
けではなく、プログラムのバグを未然に防ぐためにも有用である。
注: 2017 年にリリースされた Java 9 から、Java アプレットをブラウザーで実行するための Java ブラウザープラグインが deprecated（非推奨）とされた。基本的には、Java の処理系や基本ライブラリーが適切に設計されていれば、アプレットは安全に実行できるはずなのだが、 Java の脆弱性（不具合）をついた不正アプレットが多く現れ対処しきれなくなったため、と考えられる。 こうして Java アプレットは、その役割を終えた。

可搬性
Web ページに埋め込まれるということは、さまざまな機種のコンピューターで実行される可能性があるということである。つまり、Java のアプレットに機種依存性があってはいけない。

を用いる実行方式ではプログラムが機械語に翻訳されるため、機種依存性は避けられない。一方、を用いる方式では、各機種毎にインタプリターを実装するだけで良いが、効率が犠牲になる。このため、Java では
Java のプログラムは Java コンパイラーによってという方法をとる。
(Java Virtual Machine, Java仮想機械) という仮想 CPU のコードに翻訳される。この仮想コードを各 CPU 上の JVM エミュレーター（一種のインタプリター）が解釈・実行する。

オブジェクト指向言語 第 1 章 p.2

コンパイラー⽅式

インタプリター⽅式

ソースファイル

ソースファイルコンパイル（翻訳）CPU

オブジェクトファイル

インタプリター

CPU

CPU

中間コード⽅式
ソースファイル

コンパイル
（翻訳）

JITコンパイラー⽅式
ソースファイル

中間コード

中間コード

CPU

J ITコンパイル（実⾏時翻訳）

オブジェクト
ファイル

仮想CPU

CPU

コンパイル
（翻訳）

CPU

CPU

この方法は Java プログラムを直接インタプリターで解釈・実行するよりは高速である。しかし、現在では JVM コードをより高速に実行するために Just-InTime (JIT) コンパイラー というものを用いて、JVM コードを実行しながら各CPU の機械語へ翻訳する、という方法を用いる。
また、グラフィックスやネットワーク、スレッドに関する標準ライブラリーを持つことも、それまでのプログラミング言語にはなかった重要な特徴である。
このように当初、Java はアプレットを作成するための言語として広まった。しかし、現在では、インタラクティブな Web ページを作成するためのブラウザー
側の仕組みとしては、インタプリター方式の JavaScript などが主流となって、Java アプレットは使用されなくなっている。一方で Java の安全性・可搬性などの性質は、他の分野のアプリケーションでも役に立つため、現在はむしろアプレット以外のアプリケーション（例えば WWW サーバー側で動作してウェブページなどを動的に生成するサーブレット (Servlet) などのプログラム）を作成するために、広く用いられるようになってきている。しかし、オブジェクト指向など Java のさまざまな特徴を理解するためには、グラフィカルユーザーインターフェイス (GUI, Graphical User Interface) のプログラムは現在でも良い教材である。
WWW サーバー側プログラム用のプログラミング言語としては、Perl, PHP,Python, Ruby なども有名だが、これらは動的型付けを採用している。つまり、実行時まで型エラーは検出しない。Java はこれらと違い静的型付けを採用している。つまり、実行前（コンパイル時）に型エラーを検出する。一般に静的型付けは大規模で信頼性が必要とされるシステムの記述に適している。最近の言語では Go 言語も静的型付けを採用している。
Q 1.2.1 Java の中間言語を実行する仮想 CPU をアルファベット 3 文字の略称で何と呼ぶか？
答:
Q 1.2.2 次の文章のうち、正しいものに○、誤っているものに×をつけよ。

オブジェクト指向言語 第 1 章 p.3

1.

Java は動的な型付けを採用し、コンパイル時には型のチェックは行わない。

2.

Java は安全性を高めるために、ポインター演算を明示的にプログラマーに提供していない。

3.

Java は可搬性と効率を両立するために、純粋なコンパイラー方式でもインタプリター方式でもなく中間言語方式をとる。

Q 1.2.3 Web サーバー上で動作し、Web ページなどを動的に生成するなどの処理を行う Java のプログラム及びその仕様の名前を一つ挙げよ。
答:

1.3 オブジェクト指向プログラミング
Java はオブジェクト指向プログラミング (Object-Oriented Programming, OOP)
言語である。

言語 ・言語 ・言語 ・オブジェクト指向言語 などと、プログラミング言語を分類することがあるが、このような言語の分類は、主にプログラミングパラダイム（プログラミング言語が備える部品化の仕組み）に基づいている。
オブジェクト指向言語に限った話ではないが、プログラムの部品を設計することは、単に利用することよりも格段に難しい。まずは、自分で独自のプログラム部品を設計するよりも、オブジェクト指向という仕組みのおかげで豊富に用意された Java の部品群を利用することを学ぶことが必要であろう。この節では、まず、オブジェクト指向言語が用意する部品を利用するために必要な用語を紹介する。
オブジェクト指向 (object-oriented) とは簡単に言えば、従来の手続きを中心としたプログラム部品（サブルーチン、関数） の利用に加えて、データを中心とした部品（）の利用を支援することである。関数（サブルーチン）はいくつかの手続きをまとめて一つの部品としたものだが、オブジェクトは、いくつかのデータ（関数も含む）をまとめて一つの部品としたものである。
関数・サブルーチン

オブジェクト

代入文, 繰り返し文, 条件判断文

整数, 実数, 文字列
関数・サブルーチン（メソッド）… などの手続きをひとまとめにしたもの… などのデータをひとまとめにしたもの

実際には、プログラム部品として提供されるのは、オブジェクトそのものではなく、オブジェクトの雛型とでもいうべき(class) である。クラスは、そこから生成されるオブジェクトが（具体的なデータ （つまり、1 とか 3.14）でオブジェクト指向言語 第 1 章 p.4

はなく）どのような名前と型の構成要素を持つか、のみを指定したものである。クラスを具体化（instantiate — つまり、x という名前の int 型の構成要素は 1 で、y という名前の float 型の要素は、3.14 などと定めること）したものがオブジェクトである。このとき、このオブジェクトはもとのクラスの（instance, 具体例）である、という。
オブジェクトを構成している個々の構成要素を(field) あるいはインスタンス 変数 (instance variable)、メンバー (member)、という。ただし、関数型の要素は(method) と呼ぶのが普通である。オブジェクトのメソッドを起動することを、擬人的にオブジェクトにメッセージ (message) を送る、と表現することがある。
正確に言えば、メソッドについてはインスタンスごとにコードを定義するのではなく、クラスごとにコードを定義する（ようになっているオブジェクト指向言語が多い）。ただし、メソッドから参照されるフィールドはインスタンス毎に異なるものである。オブジェクトは各フィールドのデータの他に、どのクラスに属しているか、という情報を持っていて、それによって適切なメソッドのコードが起動される。
複数のオブジェクトがフィールドに内部状態を保持し、互いにメッセージを交換して、その内部状態を変更していく、というのがオブジェクト指向のプログ
ラムの実行のイメージである。
従来型言語では、部品の再利用方法は、既存の部品を関数・サブルーチンとして呼び出すだけだったが、オブジェクト指向言語では、それに加えて既存の部品（つまりクラス）に少しだけ機能を追加したり、一部を置き換えたりする（、インヘリタンス、 inheritance）、という形の再利用の方法が可能になる。手続き型言語ではプログラムの“幹”の部分を変えて“枝”の部分だけを再利用することができたが、オブジェクト指向言語では、“枝”の部分を変えて“幹”の部分を再利用することもできるのである。

手続き型言語のイメージ

オブジェクト指向言語のイメージ（赤色が再利用できる部分）
最近のソフトウェアではユーザーインタフェースの部分（“枝”の部分）が重要であることが多いので、オブジェクト指向という考え方が特に必要となってきている。オブジェクト指向言語は GUI 部品（ボタンやテキストフィールドなど）のような特定の用途の多種のデータ型が必要とされるプログラミングに適している。

オブジェクト指向言語 第 1 章 p.5

Q 1.3.1 オブジェクト指向言語で、プログラムの基本部品となる、オブジェクトの雛型のことを何と呼ぶか？
答:
Q 1.3.2 オブジェクト指向言語で、クラスに少しだけ機能を追加したり、一部を置き換えたりして新しいクラスを定義することを何というか？
答:

キーワード:
Java, C, C++, JavaScript, オブジェクト指向、アプレット、中間言語方式、JIT コ
ンパイラー、サーブレット、オブジェクト、クラス、インスタンス、フィールド（インスタンス変数）、メソッド、継承

オブジェクト指向言語 第 1 章 p.6