パパの勉強部屋

勉強の記録をつけています。Java、ネットワーク、Excel、etc.

スッキリわかるJava入門 第6章 複数のクラスを用いた開発②

第6章 複数のクラスを用いた開発②

Java API

javaコマンドに特殊なオプションを指定してHelloWorldプログラムを実行。
java -verbose:class HelloWorld
  • 348行の「Loaded ~.~.~」が表示される。(環境によるが)
  • HelloWorldプログラムが動作するためにJVMに読み込まれたクラスのFQCN
  • 1つのクラスが、ほかの347個のクラスと連携して動く、計348クラスからなるプログラム。
  • 347このクラスは、Javaに初めから標準添付されているクラスであり、API(Application Programing Interface)と総称される。
API利用の例(並べ替え)
  • java.utilパッケージのArraysクラスにあるsortメソッドを呼び出している。
  • java.util.ArraysはJavaが標準で提供するAPIの一部である。
  • APIに含まれる3,500個を超えるクラスは、それぞれクラスファイル(Arrays.classなど)の形で、JDKをインストールした際にコンピュータにコピーされている。

public class Main {
  public static void main(String[] args) {
    int[] heights = {172, 149, 152, 191, 155};
    java.util.Arrays.sort(heights);
    for (int h : heights) {
      System.out.println(h);
    }
  }
}

APIで提供されるパッケージ

代表的なAPIパッケージ
  • java.lang Javaに欠かせない、重要なクラス群
  • java.util プログラミングを便利にするさまざまなクラス群
  • java.math 数学に関するクラス群
  • java.net  ネットワーク通信などを行うためのクラス群
  • java.io  ファイル読み書きなど、データを逐次処理するためのクラス群
  • java.langパッケージに属するクラスは頻繁に利用するものが多い。import文を記述せずとも、自動的にインポートされる。
  • 代表的なクラス:System,Integer,Math,Object,String,Runtimeなど
APIリファレンス
  • ①左上のフレーム:調べたいクラスが所属するパッケージ名をクリック
  • ②左下のフレーム:調べたいクラス名をクリック
  • ③右側のフレーム:表示されるクラスの説明を読む

docs.oracle.com
 

クラスが読み込まれるしくみ

  • JVMが必要なクラスファイルを読み込む処理をクラスローディング(class loading)と言う。
  • JVMは起動直後にすべてのクラスを読み込むようなことはしない。使わないクラスまでロードしていたらムダにメモリを消費し、動作も遅くなる。
  • 一部の例外を除いて「必要になった時に、必要なクラスだけ」読み込む。
  • JVMの中でクラスファイルを読み込む仕事をしているのはクラスローダー(class loader)という部分。
  • JVMがクラスローダーに対して「Calc」クラスを利用するから読み込んで利用可能にしなさい」と指示を出す。クラスローダーはコンピュータのハードディスクの中にあるCalc.classを読み込む。JVMは使いたいクラス名を指定しているだけであって、クラスファイルがハードディスクのどこのフォルダにあるのかを一切指定していない。
  • クラスローダーはクラスパス(classpath)というヒント情報をを使うことで、極めて高速に目的のクラスファイルを探し出す。クラスパスとは「クラスローダーがクラスファイルを探す際に、見に行くべきフォルダの場所」のこと。

  

クラスパスの指定方法

方法1:起動時にjavaコマンドで指定する。
  • javaコマンドでJVMを起動する際に -cp オプション または -classpath オプションで指定する。
  • >java -cp c:\work Calc
方法2:検索場所をOSに登録しておく
  • OSの「環境変数」にクラスパスを登録する。
方法3:特に指定しない
  • 上記1、2の指定が無い場合、デフォルトではjavaコマンドが実行されたフォルダがクラスパスとなる。

クラスパスで指定できる対象

対象1:フォルダの場所
  • クラスファイルが置かれているフォルダの場所(絶対パス)を指定する。
  • 「c:\work」を指定すると、フォルダ内のクラスファイルが検索対象となる。
対象2:クラスファイルが入ったJARファイルやZIPファイル
  • クラスファイルが入っているJARファイルやZIPファイルの場所(絶対パス)を指定する。
対象3:複数のフォルダ、JAR/ZIPファイル、それらの組み合わせ
  • クラスパスとして、複数のフォルダ、JARファイルをデリミタ文字で区切って指定できる。
  • デリミタ文字はWindowsセミコロン(;)、LinuxMacはコロン(:)。

クラスパスに自動的に加わるrt.jar

  • javaコマンドでクラスファイルを実行する際、特に指定しなくてもrt.jar(またはclasses.jar)というファイルがクラスパスに追加される。
  • このファイルはJDKに含まれているもので、Javaをインストールしたフォルダの配下にあるlibフォルダの中に含まれている。
  • zipファイルの展開ツールで展開すると、たくさんのフォルダとクラスファイルがある。膨大な数のAPIクラス群の実体。

javaコマンドの正確な構文

  • >java 起動したいクラスの完全限定クラス名(FQCN
  • >java calcapp.main.Calc

java と javac の引数

  • javaコマンド :「どのソースファイルをコンパイルするか」をファイル名で指定して実行するもの。
  • javacコマンド:「どのクラスのmainメソッドを起動するか」をクラス名(FQCN)で指定して実行するもの。

クラスローダーの動作原則

  • あるパッケージx.y.zに属するクラスCを探す場合、クラスローダーは「クラスパスで指定されたフォルダ\x\y\z\C.class」というファイルを読み込もうとする。
  • 現在のクラスパスを基準場所にしてパッケージ階層に対応したフォルダ階層を作り、その中に必要なクラスファイルを配置しておく必要がある。
  • 例)「c:\work」をクラスパスとする場合

  Calc.class(package calcapp.main) ⇒c:\work\calcapp\main フォルダへ
  CalcLogic.class(package calcapp.logics) ⇒c:\work\calcapp\logics フォルダへ