Java入門メモ


# Javaの分類

* JavaSE

Javaのスタンダード版、簡単なゲームやデスクトップアプリの開発に使われる、基礎の基礎。

* JavaME

携帯や小型電気などの開発に使われる。今ほとんど死んでる

* JavaEE

Webなどの開発に使われる。Javaといったら、この版のことさしてるのが多いでしょ。

# JDK、JRE、JVM

* JDK(Jvav Development Kit)
中身は開発用に必要なツールキット及びJRE,JVMが含まれてる。

* JRE(Java Runtime Enviroment)
javaを動かす環境のことです

* JVM(Java Virtual Machine)
JavaはMACでもWindowsでも動けるのはJVMがあるから。例えば、hello.javaをコンパイルすると、`java.class`が生成されますね。OSの環境依存しないように実行できるのはJVMというJavaの仮想マシンで実行するからだ。つまりOSの違いがJVMにより吸収されちゃう。

この図を見たら理解できるでしょ！
![r5compiler01_03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/97cb8dfd-4fb1-e933-bc1f-04140d380d01.gif)


* JDK,JRE,JVM関係

![JDK_JRE_JVM-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/2fb8007e-c678-9694-2e60-3fdf54d58bba.jpeg)

# JDK インストール

以下の記事はとってもわかりやすいのでここには省略します

https://eng-entrance.com/java-install-jdk-windows

注意したいのは環境変数の設定

* システム環境変数新規作成

```shell
変数名：JAVA_HOME
変数値：{JDKのインストールパス}
```
![](https://eng-entrance.com/wp-content/uploads/2016/09/step-15.jpg)

* システム環境変数Path編集

```shell
%JAVA_HOME%¥bin   →　　追加
または
{JDKのインストールパス}¥bin   →　　追加

%JAVA_HOME%¥jre¥bin   →　　追加
または
{JDKのインストールパス}¥jre¥bin   →　　追加

```

# Java仕組み

https://www3.cuc.ac.jp/~miyata/classes/prg1/02/2way.html

# Javaのキーワード（予約語、定数）

https://java-reference.com/java_basic_keyword.html

# データ型

https://eng-entrance.com/java-vaiable-datatype

https://eng-entrance.com/java-var-change

# 統合開発環境(IDEA)ツール

昔Eclipseがほとんどでしたが、今は段々[IntelliJIDEA](https://www.jetbrains.com/ja-jp/idea/)を使うようになった気がします。
個人的には、コードの補完がEclipseより優れるところですかね。
例えば：
psvmを入力したらpublic static void mainのメソッド作ってくれるとか、
soutを入力したら、 System.out.printlnに補完してくれるなど。

### ツールアイコンの表示

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/cfe9bd55-197e-963d-321e-df0d190d970d.png)
### 注釈
以下三種類がある

```java
// 一行のみ注釈   

/*　
複数行注釈
複数行注釈
 */

/**
 * JavcDoc　
 * @author maekawa
 * @version 1.0
 * @param int 金額
 */
```
### コンパイルファイル確認

プロジェクト構造の設定を変更するには、ツールバーの歯車アイコン をクリックか（Ctrl+Alt+Shift+S）で開くことができます。
コンパイル出力先を確認できる。

### コンパイルファイル実行の注意点
 
実行できた。

```shell
C:\Users\maekawa\Demo\hello\src>javac HelloWorld.java

C:\Users\maekawa\Demo\hello\src>java HelloWorld
Hello

C:\Users\maekawa\Demo\hello\src>
```

↓なんと実行できません

```shell
C:\Users\maekawa\Demo\hello\src\com\maekawa\base>javac Happy.java

C:\Users\maekawa\Demo\hello\src\com\maekawa\base>java Happy
エラー: メイン・クラスHappyを検出およびロードできませんでした
原因: java.lang.NoClassDefFoundError: com/maekawa/base/Happy (wrong name: Happy)
```

修正↓
パッケージが作成された場合に、srcの階層から実行しないとダメみたいです。
エンコードが必要な場合には`javac -encoding UTF-8 xxx.java`となります。

```shell
C:\Users\maekawa\Demo\hello\src\com\maekawa\base>javac -encoding UTF-8 Happy.java

C:\Users\maekawa\Demo\hello\src\com\maekawa\base>cd ../../..

C:\Users\maekawa\Demo\hello\src>java com.maekawa.base.Happy
気持ちいいね
```

##　よく使うショートカット

https://pleiades.io/help/idea/mastering-keyboard-shortcuts.html

`Alt+Enter` 警告を直してくれる
`Ctrl+Alt+L` コード整形

# ドキュメント検索

「jdk api ドキュメント」と検索するといっぱい出ます。ダウンロードでもオンラインでも確認できます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/58f3d8de-9c91-767f-2017-22d0b5a50154.png)

# staticメソッド

* 違うクラス間メソッドの使用

メソッドを呼ぶのにstaticありとなし二種類がある。普通staticなしの方法を使います。

```java:happy.java
package com.maekawa.base;

public class Happy {
    public static void main(String[] args) {

        //Peopleクラスのdreamメソッド使用
        People.dream();
        //Peopleクラスのspeechメソッド使用
        People method = new People();
        method.speech();
    }
}
```

```java:People.java
package com.maekawa.base;

public class People {

    //staticありメソッド
    public static void dream() {
        System.out.println("Staticあり");
    }

    //staticなしメソッド
    public void speech() {
        System.out.println("Staticなし");
    }
}
```
* 同じクラス内メソッドの使用

全部staticなしのメソッドの場合、そのまま呼ぶ

```java:happy.java
public class Happy {
    public static void main(String[] args) {
    }
    // aもbもstaticなしのメソッド
    public void a(){
        // メソッド直接呼べる
       b();
    }
    public void b(){

    }
}
```

全部staticありのメソッドの場合、そのまま呼ぶ

```java:happy.java
public class Happy {
    public static void main(String[] args) {
    }
    // aもbもstaticなしのメソッド
    public static void a(){
        // メソッド直接呼べる
       b();
    }
    public static void b(){

    }
}
``` 

呼ばれるメソッドなし、呼ぶメソッドはありの場合にエラー

```java:happy.java
public class Happy {
    public static void main(String[] args) {
    }
    // aもbもstaticなしのメソッド
    public static void a(){
        // エラー発生　
       b();
    }
    public void b(){

    }
}
``` 
↑このエラーを解消する方法

```java
        new Happy().b();
```

# よく使うクラス

| クラス | ポイント| 目的 |
|:--------:|--------|:--------|
| Scanner |  | 標準力取得 |
| Obeject　| hashcode(),toString(),clone(),getClass(),<br>getClass(),notify(),wait(),equals() |  |
| Math|  | 演算 |
| Random|  | ランダムな数字生成、例えばUUID|
| File|  | ファイルの作成、確認、修正、削除など|
| Date| Date、SimeDateFormat、Calendar | |
| String| final | |
| StringBuffer| append() |  |
| StringBuilder| |  |


[Scannerクラス](https://techacademy.jp/magazine/19080)


# 継承

## 目的
コードを簡易化して、重複なメソッドを書かないようにするため。

[参考記事](https://www.javadrive.jp/start/extends/)

<font color="Red">すべてのクラスはObjectクラスを継承してる（実際に隠されて見えないだけ）<font>

例：以下の二つのクラス、水飲むというメソッドは重複してます。

```java
class People{
  //水飲む
  public void drink(){
    System.out.println("水飲む");
  }
}

class Student{
  //水飲む
  public void drink(){
    System.out.println("水飲む");
  }
  //勉強する
  public void study(){
    System.out.println("勉強する");
  }
}
```

## 親クラスの変数やメソッドの呼び方

`オブジェクト.変数名やメソッド名`

```java
//メインクラス、一つのプロジェクトにmainクラス一つのみ
class ctest11{
  public static void main(String args[]){
    Student student = new Student();

    //変数の呼び方
    student.age = 10;
    //メソッドの呼び方
    student.drink();
 
  }
}

//親クラス
class People{
  int age = 34;
  //水飲む
  public void drink(){
    System.out.println("水飲む");
  }
}

//子クラス
class Student{
  //勉強する
  public void study(){
    System.out.println("勉強する");
  }
}
```

# CollectionとMap学習ポイント

https://www.itsenka.com/contents/development/java/collection.html

![HashMap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/232f3cff-3313-ae8a-0c11-44e8508a6f40.jpeg)

# IOについて（入出力）

https://www.techscore.com/tech/Java/JavaSE/IO/index/

# AWTとswing

swingはAWTの前身みたいなもの

https://it-kyujin.jp/article/detail/806/