【Java基礎】ローカルでJavaファイルを動かす

## 前提
JDKをインストール、PATH通し済み
環境 windows

## 準備
1. Javaファイルを作成し、ローカルの適当な場所に置く
※下記にあるソースをテキストファイルにコピペし、拡張子を`.java`に変更すればOKです
1. コマンドプロンプト開き、ファイルを置いたディレクトに移動（cd）、
（もしくはファイルを置いたディレクトをエクスプローラーで開き、パス入力箇所で`cmd`）
<img width="500" alt="cmd.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/58a23d23-2b55-86aa-f55f-129e8060bf45.png">

<img width="500" alt="cmd開く.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/c459e4db-4ea7-3771-cb43-b8fccda1206a.png">

準備は完了です。
次に実行ですが、今回は２パターン試します。

## 実行
### ①ファイルをコンパイルし、クラス名を指定して実行

はじめにJavaファイルのコンパイル処理と実行を分けて行う方法です。

コマンドプロンプトで`Javac ファイル名.java`を実行します。

<img width="400" alt="javac実行.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/97110aad-be4a-7f7c-c440-59f0e1e608fa.png">

これでコンパイル成功です。
エクスプローラーから確認するとjavaファイルで実装したクラス名（Sampleクラス）の名前のファイルが生成されているのが分かります。

<img width="500" alt="コンパイルされたファイルが生成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/188d7c97-46e1-b6fa-92c4-5f34f938e746.png">

次に`java クラス名`をコマンドで実行します。
<img width="500" alt="Class名で実行した結果.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/4171a3d9-ec92-27c6-66f2-b083b676cd8f.png">

ソースコードに問題がなければ正常に結果が出力されます。
このパターンではコンパイルされたClassファイルを`java`コマンドで実行しています。


### ②ファイル名で実行する（単一ファイルのみ可能）
※Java SE 11以降のみ

こちらでは`javac`コマンドによるコンパイルを行わず、
そのままコマンドで`java ファイル名.java`を実行します

<img width="500" alt="java実行後.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/ae949bfb-98f1-273b-fe5e-2db0c318ddb9.png">

こちらもソースコードに問題がなければ正常に結果が出力されます。

このパターンでは、パターン①のようなClassファイルは生成せずに、
デバイスの**メモリ上**でコンパイルが行われそのまま実行されます。
　
　
上記の中でエラーがでた場合でもエラー文を注意深く読めば、ほぼほぼ解決できると思います。
よくあるのは
 - エンコードエラー
 - importがなく呼び出せないものがある　ex.Listなど
 
基本はコンパイルした時点でエラーを出してくれます。英語が難しくても翻訳したり、そのまま検索すれば解決できるものが多いです！

<hr>

### 今回利用したテストファイル
例）listの５文字以上の文字列の要素を数えるプログラム
```list_test.java
import java.util.List;

class Sample{
     
    public static void main(String[] args){
         
        System.out.println("Hello world!");

        List<String> strList = List.of("abcde", "あいうえ", "アイウエオ", "あい");

        /*
            リストから５文字以上の文字列の要素を数える
            */
        int cntFive = 0;

        // for
        for (int i = 0; i < strList.size(); i++) {
            if (strList.get(i).length() > 4) {
                cntFive++;
            }
        }
        System.out.println("5文字以上の要素の数：" + cntFive);
        cntFive = 0; // 初期化

        // 拡張for文
        for (var str: strList) {
            if (str.length() > 4) {
                cntFive++;
            }
        }
        System.out.println("5文字以上の要素の数：" + cntFive);

        // stream利用
        cntFive = (int) strList.stream().filter(s -> s.length() > 4).count();
        System.out.println("5文字以上の要素の数：" + cntFive);
         
    }
     
}
```


## ■補足

### javacコマンド
> **Javaプログラムが書かれているソースファイル(.javaファイル)を読み込んで、クラスファイル(.classファイル)を生成するツールです。**
>
>ソースファイルからクラスファイルを生成することを、コンパイルするといいます。
>
>つまり、javacコマンドはJavaプログラムのソースファイルをコンパイルするツールです。このようなツールのことを一般にコンパイラと呼びます。Java言語のCompiler(コンパイラ)なので、javacという名前が付いています。

https://atmarkit.itmedia.co.jp/fjava/onepoint/java/jv_jvc.html

<hr>

### Javaプログラムにはクラスが必須
Javaは「オブジェクト」に「振舞い（メソッド）」や「属性（メンバ変数）」を持たせて操作します。
そのオブジェクトのひな形または設計図となるのが「クラス」です。

クラスなしに処理（振舞）を書いても、どれについての振舞なの..?となってしまいます。
逆に「人間」というクラス（インスタンスすればオブジェクト）があれば、「歩く」「食べる」など振る舞いを定義することができます。

今回でいうと`SampleClass`というクラスがあり、`リストの中身を調査して数える`という振る舞いを実装しているイメージです。

参考：

https://kanda-it-school-kensyu.com/java-basic-contents/jb_ch01/jb_0103/


### 単一ファイルのJavaプログラムを実行できる`java`コマンド
>単一ファイルのソースコードプログラムの起動は、JDK 11リリースで導入された新機能の1つです。この機能により、javaインタープリタを使用してJavaソースコードファイルを直接実行できます。ソースコードはメモリ上でコンパイルされ、インタープリタによって実行されます。ディスク上に.classファイルは生成されません。
>
>ただし、この機能は単一のソースファイルにあるコードに限定されます。同じ実行でコンパイルするソースファイルを追加することはできません。
>
>この制限を回避するには、すべてのクラスを同じファイルで定義する必要がありますが、ファイル内のクラスの数に制限はありません。同じソースファイルにある限り、すべてパブリッククラスであるかどうかは関係ありません。
>ソースファイルで宣言された最初のクラスが選択され、メインクラスとして使用されます。mainメソッドをその最初のクラス内に配置する必要があります。順序が重要です。

参考：

https://www.infoq.com/jp/articles/single-file-execution-java11/

## 関連記事

作成次第載せます...zz

## 更新メモ
@shiracamus (しらかみゅ) さんにコメントでご指摘いただき修正いたしました。
・javacによるコンパイル無しでも実行できる
・コンパイル後はclass名で実行可能