今日から携わるJava

Javaを勉強して必要なことのまとめ

#Eclipseショートカットキー

■ 補完(Ctrl + Space)
（sysout）　System.out.println();
（syso）　System.out.println();
（main）　public static void main(String[] args) {}

■ ローカル変数を宣言（Ctrl + 2 → L）
new ArrayList();　→　ArrayList arrayList = new ArrayList();

■ その他のショートカット
ソースコードのフォーマット（Ctrl + Shift + F）
コメントアウト(Ctrl + /)
クイックフィックス(Ctrl + 1)
１行移動、１行コピー(Alt + ↓↑、Ctrl + Alt + ↓↑)
１行削除(Ctrl + D)
メソッドの抽出(Alt + Shift + M)
呼び出し階層を開く(Ctrl + Alt + H)
宣言を開く(Ctrl + クリック)
型を開く(Ctrl + Shift + T)

#プログラムの書き方
スッキリわかるJava入門を読んだ自分用のまとめ
https://sukkiri.jp/books/sukkiri_java3

▼クラスブロック＋メインブロック

```Main.java
public class Main {
	public static void main(String[] args) {

	}
}
```

##メインブロック内の記述

```Main.java
System.out.println("こんにちは");「こんにちは」と表示させる
System.out.println("二重引用符（¥"）");「二重引用符（"）」と表示させる

int age;//変数宣言（ageという箱を用意）
age = 20;//変数age 代入　20
int age = 20;//変数 ageを20で初期化
age = 32;//変数ageに再代入
final double Pi = 3.14;//定数として円周率を宣言

//：データ型（整数）
byte glasses = 2;//所持するメガネの数
short age = 20;//年齢
int salary = 180000;//給与金額
long worldPeople = 6900000000L;//世界の人口
//データ型（少数）
float weight = 56;//体重
double pi = 3.14;//円周率
//データ型（真偽値）
boolean isError = true;//trueかfalse
//データ型（文字、文字列）
char initial = F;//イニシャル１文字
String name = Haru;//名前

int m = Math.max(①,②);//数字を比較して大きい方を代入
int n = Interger.parseInt(①);文字列を数字に変換
int r = new java.util.Random().nextInt(①);//乱数を発生（最大①まで）
String s = new java.util.Scanner(System.in).nextLine();キーボードから文字入力
int i = new java.util.Scanner(System.in).nextInt();キーボードから整数入力
```

#分岐

```Main.java
//if
if (tenki == true) {
	System.out.println("晴れです");
}else {
	System.out.println("雨です");
}

//switch
int lucky = new java.util.Random().nextInt(3)+1;
System.out.println(lucky);
switch (lucky) {
case 1:
	System.out.println("大吉です");
	break;
case 2:
	System.out.println("吉です");
	break;
case 3:
	System.out.println("凶です");
}

//繰り返し処理の中断 break文
//今回だけ中断して次の周へ continue文

//論理演算子 &&（かつ）、||（または）
```

#繰り返し

```Main.java
for (int i = 0; i < 10; i++) {
　　ブロック	
}

while (i < 100) {
　　ブロック
}

do {
	if (i % 3 == 0) {
		System.out.println(i);
	}
	i++;
} while (i < 100);
```

#配列

```Main.java
int[] score;//int型の要素を代入できる配列変数scoreを用意
score = new int[5];int型の要素を5つ作成してscoreに代入

score.length//配列の要素数の取得

int[] scores1 = new int[] {1,2,3};//省略法1
int[] scores2 = {1,2,3};//省略法2

for (要素の型 変数名:配列変数名){//拡張for文
}

//例
int[] moneyList = {1,2,3};
for(int i=0; i < moneyList.length; i++) {
	System.out.println(moneyList[i]);
}
for(int m : moneyList) {
	System.out.println(m);
}
```

#メソッド

```Main.java
//メソッドの定義
public static 戻り値の型 メソッド名(引数リスト) {
	メソッドが呼び出されたときに実行される具体的な処理
}

public static void hello() {//helloメソッド、voidは戻り値がなしのときに使用
	System.out.println("こんにちは");
}
hello();//helloメソッドを呼び出す

//例
public static void main(String[] args) {
	introduceOneself();
}
public static void introduceOneself() {
	String name = "はる";
	int age = 6;
	double height = 110.5;
	char zodiac = '午';
	System.out.println(name);
	System.out.println(age);
	System.out.println(height);
	System.out.println(zodiac);
}

//例（オーバーロード）
public static void main(String[] args) {
	String address = "hoge@hogehoho.hoge";
	String text = "メールの本文";
	email(address,text);
}
public static void email(String address, String text) {
	System.out.println(address + "に、以下のメールを送りました");
	System.out.println("件名：無題");
	System.out.println("本文：" + text);
}
public static void email(String title, String address, String text) {
	System.out.println(address + "に、以下のメールを送りました");
	System.out.println("件名：" + title);
	System.out.println("本文：" + text);
}

//例（三角形の面積）
public static void main(String[] args) {
	double triangleArea = calcTriangleArea(10.0,5.0);
	System.out.println(triangleArea);
}
public static double calcTriangleArea(double bottom, double height) {
	double area = bottom * height / 2;
	return area;
}
```

▼参考：メソッドの使い方
https://www.javadrive.jp/start/method/index1.html

#複数クラスを用いた開発

```Calc.java
public class Calc {
	public static void main(String[] args) {
		int a = 10; int b = 2;
		int total = CalcLogic.tasu(a, b);
		int delta = CalcLogic.hiku(a, b);
		System.out.println("足すと" + total + "、引くと" + delta);
	}
}
```

```CalcLogic.java
public class CalcLogic {
	public static void main(String[] args) {
		public static int tasu(int a, int b) {
			return (a + b);
		}
		public static int hiku(int a, int b) {
			return (a - b);
		}
	}
}
```

#インスタンスとクラス
オブジェクト指向

```Main.java
public class Main {
	public static void main(String[] args) {
		Cleric c = new Cleric();
		c.name = "聖職者";
		c.SelfAid();
		c.pray(3);
	}
}
```

```Cleric.java
import java.util.Random;

public class Cleric {
	String name;
	int hp = 50;
	final int MAX_HP = 50;
	int mp = 10;
	final int MAX_MP = 10;

	public void SelfAid() {
		System.out.println(this.name + "は、セルフエイドを唱えた");
		this.hp = this.MAX_HP;
		this.mp -= 5;
		System.out.println("HPが最大まで回復した");
	}

	public int pray(int sec) {
		System.out.println(this.name + "は" + sec + "秒間天に祈った！");

		int recover = new Random().nextInt(3) + sec;

		int recoverActual = Math.min(this.MAX_MP - this.mp, recover);

		this.mp += recoverActual;
		System.out.println("MPが回復した" + recoverActual);
		return recoverActual;
	}
}
```

#様々なクラス機構
コンストラクタの条件
・メソッド名がクラス名と完全に等しい
・メソッド宣言に戻り値が記述されていない（voidもダメ）

```
public class クラス名 {
	クラス名() {
		自動的に実行する処理
	}
}
```

コンストラクタの特例
クラスに1つもコンストラクタが定義されていない場合に限って、「引数なし、処理内容なし」のコンストラクタがコンパイル時に自動的に追加される

```Thief.java
public class Thief {
	String name;
	int hp;
	int mp;

	//new Thief("ハルタ", 40, 5)でインスタンス化する場合の記述
	public Thief(String name, int hp, int mp) {
		this.name = name;
		this.hp = hp;
		this.mp = mp;
	}
	//new Thief("ハルタ", 40)でインスタンス化する場合の記述（MPは5で初期化）
	public Thief(String name, int hp) {
		this(name, hp, 5);
	}
	//new Thief("ハルタ")でインスタンス化する場合の記述（HPは40,MPは5で初期化）
	public Thief(String name) {
		this(name, 40);
	}

	//new Thief()ではインスタンス化できないようにする（名前の無いThiefは存在させない）
}

```

上記のThiefクラスを利用したプログラム

```Main.java
public class Main {
	public static void heal(int hp) {
		hp += 10;
	}
	public static void heal(Thief thief) {
		thief.hp += 10;
	}
	public static void main(String[] args) {
		int baseHp  = 25;
		Thief t = new Thief("ハルタ", baseHp);
		System.out.println(baseHp + "：" + t.hp);
		heal(baseHp);
		heal(t);
		System.out.println(baseHp + "：" + t.hp);
	}

	//実行結果
//	25：25（引数がint型の場合、変数baseHpの値が引数hpにコピーされる値渡しのため）
//	25：35（引数がクラス型の場合、変数tが示すアドレスが引数thiefにコピーされる参照渡しにより、t.hpとthief.hpはメモリの同じ場所を指すことになるため）
}
```

#継承

```Matango.java
//キノコモンスターのクラスを作成
public class Matango {
	int hp = 50;
	char suffix;
	public Matango(char suffix) {
		this.suffix = suffix;
	}
	public void attack(Hero h) {
		System.out.println("キノコの攻撃 " + this.suffix);
		System.out.println("10のダメージ");
		h.hp -= 10;
	}
}
```

```PoisonMatango.java
public class PoisonMatango extends Matango {
	int poisonCount = 5;
	public PoisonMatango(char suffix) {
		super(suffix);
	}
	public void attack(Hero h) {
		super.attack(h);
		if (this.poisonCount > 0) {
			System.out.println("さらに胞子をばらまいた");
			int dmg = h.hp / 5;
			h.hp -= dmg;
			System.out.println(dmg + "ポイントのダメージ");
			this.poisonCount--;
		}
	}
}
```

```Hero.java
public class Hero {
	String name;
	int hp = 150;
	public Hero(String name) {
		this.name = name;
		System.out.println("名前は" + this.name + "、体力は " + this.hp);
	}
}
```

```Main.java
public class Main {
	public static void main(String[] args) {
		Hero h = new Hero("ヒロタ");
		Hero h2 = new Hero("ヒロタ2");

		Matango m1 = new Matango('A');
		m1.appear();
		m1.attack(h);

		PoisonMatango pm1 = new PoisonMatango('A');
		pm1.appear();
		pm1.attack(h2);
	}
}
```