Java Silver 1章 Javaの基礎


コンパイルと実行

// ソースに複数のクラスがあれば複数のクラスファイルが作製される
class Foo {}

// JavaではPublicクラスはファイルと同名
public class Main{
  public static void main(String[] args){
    System.out.println("Hi!!");
  }
}

// ソースファイル→クラスファイル(コンパイル)→実行(JVM:Java Virtual Machine上で実行)
// この学習ではWindowsOSにあるJVM.ver11を VScode Editerで参照してターミナル(PowerShell)で実行している。

インタプリタ言語のPHP、JSと違いソースファイルをコンパイラして各クラスファイルを作製
実行環境の差をJVM(Java Virtual Machine)が埋めてくれる。

1億回ループさせた時の実行時間の差

public class Loop {
    public static void main(String[] args){
        int result = 0;
        long start = System.currentTimeMillis();
        for(int i = 0; i < 10000000; i++){
            result += 1;
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start) + "ms");
    }
}
// 1億回足し算をするコードを実行する場合
// インタプリタ(1行づつ翻訳:PHP、JS、Rubyなど) ターミナルで -xオプション →821mm秒
// コンパイラ(機械語に一旦翻訳)  クラスファイルを作り実行    →31mm秒

main()メソッド

mainメソッドはJavaでは特別なメソッドで記述は必ず
Public static void main(String[] arg){...}  
(今のところ意味不明)
プログラムの実行開始位置となる。

コンパイルエラーと実行時エラーのイメージ

コンパイルエラー:英語でいう単語や文法の間違い
実行時エラー  :単語や文法はあってるが言ってる内容がおかしい

PacageとImport

package com.se;
// PHPにおけるNamespaceと同じような概念
// ファイルを置くディレクトリーも分け、物理的に区別する感じ
class Foo{
    void print(){
        System.out.println("package sample");
    }
}
class Main{
    public static void main(String[] args){
        Foo f = new Foo();
        f.print();
    }
}

PHPのNamespaceに似ている
Javaではフォルダとファイル構造でも区別する。おもしろい。

パッケージファイルをコンパイルする時は、パッケージ階層の一番上のディレクトリで実行
-d オプションで com\se\Foo.class と com\se\Main.classが作製される。

Import

Import宣言をする場合とパッケージ名まで含めた完全なクラス名を指定する場合がある

Importする側

package com.se;

// 他パッケージを参照するにはImportを使用
import com.se.ren.Foo;

public class Main {
    public static void main(String[] arg){
        Foo f = new Foo();
        f.print();
    }
}

Importされる側

package com.se.ren;

// 外部クラスからアクセスできるのはPublic修飾子が付いたクラスと
public class Foo {
    // Public修飾子が付いたメソッドのみ。
    public void print(){
        System.out.print("Foo#print()");
    }
}

ファイル名とPublicクラス名は同一

クラスライブラリ

便利な機能を提供してれるクラスの集まり

PHPではWebサイト作製に特化したライブラリが多かった。
Composerで管理していたがJavaはどうか…

Pacage化されているので使用する時はImport文を宣言

一章の感想

メソッド定義が必ずクラス内でなければいけない所がオブジェクト指向っぽい。

JSやPHPではメソッドも変数も好きに宣言できてたが、その分ごちゃごちゃになりやすかった。

必要なパーツはクラス名を付けて管理して使うときはクラスを明示して使う。

参考文献:Javaプログラマ Silver SE11.山本道子