Java

2022年12月13日

Java等の備忘録。

目次

Java

プログラミング言語。
・Google三大言語(Java,C++,Python)の一つ。
・基本的にどんな環境でも使える。

JRE

Java実行環境。
・この環境が有れば、WindowsでもMacでも実行出来る。

JDK

Java開発環境。
・この中にJREも入っている。

Pleiades

統合開発環境。

Eclipse(イクリプス)

Pleiadesと日本語化プラグイン等をまとめたパッケージ。

https://mergedoc.osdn.jp/

・Javaのイクリプスを入れた方が良い(多言語も対応出来るULtimateはやめとけ)。
・C:\pleiades\2022-09\eclipseの中にexeがあるのでそのショートカットをデスクトップへ。
・C:\pleiades\2022-09\javaの中に6.7.8.11.17のフォルダがある。
・17がジャカルタJavaと言われている。
・8の時代が長かった(今回やるのは11、tomcatは9)。

Javaを直で触る準備(eclipseしか使わなければ不要)

C:\pleiades\2022-09\java\11\binの中のjava.exeとjavac.exeのパスを通す。

①虫メガネからシステム環境変数の編集→環境変数→下に新規作成でJAVA_HOMEを作る。
JAVA_HOME
C:\pleiades\2022-09\java\11

②Path→編集→新規作成で下記を入力。
%JAVA_HOME%\bin

(追記)
家のPCで試すが

エラー画面

色々試すががうまくいかず・・・
下記サイトを参考にする。

https://qiita.com/TongChang/items/2e3d560368461e1fc846

結局、C:\Windows\System32にjava.exeは入っていなかったが、
PATHの設定の順番を変更(System32より上にJAVA_HOMEを上げる事)で解決。

コマンドプロンプトで各バージョン確認

java --version
javac --version

javaファイル動かす

①javaファイルが入っているフォルダでcmd呼び出す
②javac 〇〇.java(コンパイルすると〇〇.classが出来る)
③java 〇〇で実行出来る。

VScodeでjava触る

①フォルダーをVScodeで開く。
②〇〇.Javaを右クリックして統合ターミナルで開く。
下の画面にコマンドプロンプト的なターミナルが開くので後はcmdと同じ。

ターミナルがshift-jisで、コードをUTF-8でかいて文字化けしたら・・・

javac 〇〇.java -encoding UTF-8
java 〇〇でOK

もしくは、VScode右下のボタンで保存形式を変更。

リテラル

コード中の数値や文字列等の直に示したデータの事。

Javaでのプログラム開発

①ソースコードの作成
②コンパイル
③実行

ソースコード

人が読める状態のプログラム。

ソースファイル

ソースコードを書いたファイル(.java)

コンパイル

ソースファイルをクラスファイルに変換。

クラスファイル

バイトコードに変換されたもの。

バイトコード

コンピュータが読むコード。

コンパイラ

コンパイルをするソフト。

インタプリタ

JVMを使ってバイトコードをマシン後に変換しCPUに送る。

JVM(Java Virtual Machine)

インタプリンタ内部にあるしくみ。

ブロック

カッコで囲まれた部分

クラスブロック・・・クラス部分(外枠)
メソッドブロック・・・メソッド部分(中枠)

クラス名

プラグラムの名前。大文字のアルファベットで始める。

ファイル名

クラス名.java

Javaプログラムの書き始め

public class クラス名 {
 public static void main (String[] args) {
  ブロック;
 }
}

コメント

/* 複数行 */
// 一行

変数宣言

型 変数名;

int

普通の整数のデータ型
・小数入れるとエラー。

金額の計算に使ってはいけないデータ型

floatやdoubleは×。

char型とString型

char = '〇'; // 一文字を'で囲む
String = "〇〇〇〇"; // 文字列を"で囲む

Jshell

Javaコードのプロトタイプを作成するための対話型ツール。
・cmdでjshellで開始、/exitで終わり。

変数の初期化

型 変数名 = 代入するデータ;

定数の宣言

final 型 定数名 = 初期値;

・変更不可

ローカルのclassファイルをgithubへpushしない方法

①ローカルフォルダ側に「.gitignore」ファイルを作成する。
②テラパッド等で①を開き下記を入力。

# classファイルは除外
*.class

③ローカルフォルダからGit Bashを開き下記コマンドを入力。

// インデックスの中身を全部削除(クラスも管理対象になっているので)。
git rm -r --cached .

// インデックスに追加
git add .

// ローカルレポジトリにコミット
git commit -m "class files deleted."

// リモートレポジトリにプッシュ
git push origin main

式(expression)

例)a = b +2

オペランド(operand)

例)aやbや2

演算子(operator)

例)+とか=

リテラルはデータ型を持っている

リテラル(コード内の具体的な値)はデータ型を持っている
intやlongやdouble等。

整数リテラルに応用記法

整数リテラル(値)の先頭に下記をつけると…
0x・・・16進数
0・・・8進数
0b・・・2進数

例)
int a = 0x11; // 16進数の11は、17
int b = 0b0011; // 2進数の11は、3

,の代わりに_を任意の所に入れていい
例)
long p = 1_000_000

エスケープシーケンス

「"」や「’」などを文字として表示する為につかう文字。
例)
\" // ダブルクォーテーション
\’ // シングルクォーテーション
\\ // エンマーク
\n // 改行

workspace

Eclipse(統合開発環境)はworkspaceを使って管理する。
workspaceの中にプロジェクトがある。

Eclipseの初期設定

①Cドライブにworkspace群用のフォルダを作る。
②①の中にworkspaceのフォルダを作る。
③Eclipseを立ち上げて②を指定して起動を押す。
④ウィンドウ→設定→Java→インストール済みのJRE→java11→適用。
⑤一般→外観→色とフォント→基本→テキストフォント→ミリカフォントへ変更。

・新規Javaプロジェクト作成でプロジェクト名をつけて作成する。
・Javaを作ってコンパイルして出来るclassファイルはbinフォルダへ出力される。
・javaファイル自体はsrcフォルダへ。

Eclipseの使い方

①srcを右クリック→新規→パッケージ→名前を変更→完了
・パッケージはフォルダみたいなもの。
・名前は小文字。

②上記のパッケージを右クリック→新規→クラス→名前を入力→public static~をチェック→完了

・パッケージ・エクスプローラーは必要な物だけ表示。
・プロジェクト・エクスプローラーは他のフォルダとかも表示(あまり見ないらしい)。

・ctrl+mで全画面ON/OFF(カーソルで選択されている所が)。
・各画面はビューと言う。
・ビューを閉じてしまったら、上部のウィンドウのビューの表示から再表示可。

・sysoutを入力してctrl+スペースで、System.out.println()が表示される。
・ctrl+sで保存すると、自動的にコンパイルされる。
・自動的にコンパイルされない時は、プロジェクト・エクスプローラーからclassファイルを選択して、上部のプロジェクトからクリーンを実行。

出力方法は、下記2つ。
A、コード画面をクリックし上の緑の再生ボタンを押すと左下コンソール画面に出力。
B、左上のjavaファイルを選択し右クリックで実行(javaアプリを選択)で出力。

・コード画面の一番上に「package パッケージ名;」が表示されている(消さない)。

・自宅に持ち帰る時は、ワークスペースのフォルダ毎コピー。又は下記。

エクスポート

①プロジェクトを右クリック
②エクスポート
③一般
④ファイルシステム
⑤binのチェック外す
⑥参照で出力先指定
⑦完了

インポート(設定毎エクスポートしている場合)

①インポート
②一般
③既存プロジェクトをワークスペースへで次へ
④参照でエクスポートしたフォルダを指定
⑤プロジェクトをワークスペースにコピーにチェック
⑥完了

評価(evaluation)

式に従って計算処理をする事を式の評価と呼ぶ。

・++ – は他の演算子と使わない。
(オペランドの位置(前後)により+1や-1されるタイミングが違う為)

a = 2;
System.out.println(++a +100); // 出力は103(aに1足して、100足してから出力)

b = 2;
System.out.println(b++ +100); // 主力は102(bに100足して出力してから、b+1)
System.out.println(b); // 出力は3

データ型の大小関係

byte<short<int<long<float<double

代入時の自動型変換

小さな型の値を大きな型の値に代入する時、自動的に大きな型に変換される。
・逆はエラー。
・但し、強制的な型変換は可能(キャスト演算子)。

例)
int a = (int)1.2
a = 1
この場合、小数切り捨て。

演算時の自動型変換

大きな型に統一されてから演算される。

System.out.print()

改行せずに出力。

Math.max(a,b)

// 大きい方が代入。
int c = Math.max(a,b);

Integer.parseInt(数字の文字列)

// 文字列を数値に変換
int c = Integer.parseInt("123")

Random().nextInt(最大値)

// 最大値未満のランダムな数値を代入。
int c = new java.util.Random().nextInt(10)
・10未満のランダムな数字

System.in(キーボードからの入力)

標準入力(キーボードの事)。
・Systemはクラス。
・inはプロパティ。

// キーボードから1行の文字列の入力を受け付ける
String 変数 = new java.util.Scanner(System.in).nextLine();

// キーボードから1つの整数を入力を受け付ける
int 変数 = new java.util.Scanner(System.in).nextInt();

System.out

標準出力。

if文

// a=1なら処理A、じゃないなら処理B
public class Main {
 public static void main(String[] args) {
  int a = 1;
  if (a == 1) {
   処理A;
  } else {
   処理B;
  }
 }
}

while文

// dがtrueなら処理を繰返す
public class Main {
 public static void main(String[] args) {
  boolean d = true;
  while (d == true) {
   処理;
  }
 }
}

制御構文

if文やwhile文みたいな制御構造を表す文。

// 条件式とブロックで構成。
if(条件式){
  ブロック
} else{
  ブロック
}

スコープ

変数が利用可能な場所の範囲。
・ブロック内で宣言した変数は外側で使用不可。

等しいを表現する関係演算子

==
・但し(ユーザーが入力した)文字列の比較で「==」は不可。
・int型はデータ型、string型はクラス。

ユーザーが入力した文字列の比較

(ユーザーが入力した文字列を代入した)変数.equals(“文字列")

論理演算子

&&・・・かつ
||・・・または

否定演算子

!・・・~でないならば

短絡評価

&&の時に前半がfalseならば後半の条件式は無視。

switch文

// 変数fが1ならば処理a、2ならば処理b…
public class Main {
 public static void main(String[] args) {
  int f = new java.util.Random().nextInt(3) + 1;
  switch(fortune) {
  case 1:
   処理a;
   break;
  case 2:
   処理b;
   break;
  case 3:
   処理c;
   break;
  }
 }
}

breakを入れないと次の処理に入

.gitignore

workspaceをGitHubにアップする際に不要なファイルを上げない設定ファイル。
・テキストドキュメント。
・ファイル名に拡張子無いっぽい。
・Git による追跡から特定のファイルを除外する為の設定を書き込む。
・「#」はコメント、「*.」でそのファイルを省き、「!」は必要な物。

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

# Eclipse added by(先生)
/.metadata/
/Servers/
.settings/
build/
bin/
.classpath
.project
META-INF/

# necessary
!jstl-api-1.2.jar
!jstl-impl-1.2.jar

# emacs
*~

# VSCode
.vscode/
.code-workspace

# Mac
.DS_Store

GitHubからworkspaceをCloneするやり方

~Sourcetreeを使う場合~
①GitHubのレポジトリのCodeをコピー。
②Sourcetreeの上部の+からCloneを選択。
③一番上に①のコピーを貼り付ける。
④保存先は参照から指定(その画面でフォルダを作って)。
⑤eclipseを起動し④のフォルダを指定。
⑥ウィンドウ→設定→Java→~済みのJRE→Java11を選択(授業と合わす為)。
⑦左上(パッケージ・エクスプローラー)からJavaプロジェクトを選択。
⑧実行環境JREの使用が「Java11」になっている事を確認。
⑨プロジェクト名を入力(srcフォルダが入っているフォルダ名)。
⑩完了。

~Git Bashでやる場合~
クローンを入れたいフォルダ内でGit Bashを開き下記コマンドを入れる。

git clone URL(Git Hubでコピーしたアドレス)

↑URLの後に、スペース入れて好きなファイル名入れるとそのファイル名でフォルダが出来る。
後は、⑤以降同じ(.gitignoreで必要最低限のファイルで構成されている為、Javaプロジェクトから作成でやるとアップ時に省いたファイルも復旧される)。

(追記)
何故か家では、エラーが出たので結局Java17を指定。

workspaceを持ち帰る方法

保存方法は2つ有る。
・エクスポート
・GitHab

workspaceの切替

①ファイル
②workspace切替
③その他
④フォルダ指定
⑤起動

Eclipseの設定のエクスポート

①ファイル→エクスポート
②一般→設定を選択→次へ
③出力先を指定して完了
・拡張子edfのファイルが出来る。

パッケージ・エクスプローラー内をフラット表示

①右上の…リーダーをクリック
②パッケージプレゼンテーションから選択する

while文

while構文

while (条件式) {
  ブロック;
}

do-while構文

do {
  ブロック;
} while (条件式);

ファイル名変更

javaファイルを右クリック→リファクタリング→名前の変更
・何か出てきてもOK押してけば大丈夫。
・Eclipseの管理下になっているフォルダを整理する時はEclipse上で行う。

for文

他の言語と同様。

for(初期化処理; 繰返し条件; 繰返し時処理){
 ブロック;
}

例)
for(int i = 0; i < 5; i++){
 ブロック;
}

break文

繰返しを中断。

for(条件式){
 if(条件式){
   break;
 }
}

continue文

特定の周だけ(次の処理行かずに)中断して、次の周へ。

for(条件式A){
 if(条件式B){
  continue;
 }
 処理
}

三項条件演算子

条件式がtrueならa、falseならb。

(条件式 ? a : b);

データ構造(data structure)

一定のルールに従ってデータを格納する形式。

配列

同一種類の複数データを並び順で格納するデータ構造。

要素(element)

配列の中の連続した箱の一つ。

添え字(index)

各要素の番号。
・0始まり。

配列の宣言

データ型[] 配列変数名

配列の作成手順

①配列を宣言。
②データ型と要素の個数を用意。
③①で宣言した配列に②を代入。

配列は自動的に初期化される

int等の数値型は0
boolean型はfalse
String型はnull

例外(exception)

実行中に~Exceptionというエラーが起きる事。
・ArrayIndexOutOfBoundsException

配列の省略記法

データ型[] 配列名 = {値, 値,・・・};

for文で配列を回す

for(int i = 0; i < 配列名.length; i++) {
  ブロック;
}

他人のリポジトリをコピーする

①GidHubログイン後、右上の検索欄で相手の名前/リポジトリ名を検索。
②Fork(落としてくる)。
・落してくる物と同名のリポジトリが既に有る場合は、既存のリポジトリ名を要変更。

拡張for文

配列の要素を1つずつ取り出すfor文。

for(データ型 変数名 :配列名){
 処理(出力)
}

・配列を全部処理する。

参照型と基本型

変数は参照型と基本型が有る。
・参照型は(実体の)アドレスが入っている。
・基本型はそこに実体が入っている。

基本型(primitive types)
byte
short
int
long
float
double
char
boolean

参照型(reference type)
String
・頭が大文字

配列変数は参照している

int[] a = new int[i]

int型の配列aに右辺で作った配列の先頭要素のアドレスが代入。

ガベージコレクション

参照されなくなったメモリ領域を自動解放する機能。
・Javaでは常に動いている。

参照を切る

配列=null
・配列変数名に入っている住所をnull。

lengthとlength()

配列変数名.length…配列の要素数を取得
文字列変数名.length()…文字列の文字数をカウント
・()ついているからメソッド。

NullPointerException

nullが入っている配列変数を使うと発生する例外(エラー)。

2次元配列

1次元配列(行)に列が加わった配列。
・2次元以上は多次元配列。

2次元配列の宣言

データ型[][] 配列名 = new データ型[行数][列数];

2次元配列の要素利用

配列名[][]

メソッドの定義

メソッド(プログラムを部品化した最小単位)を作成する事。

public static 戻り値の型 メソッド名() { // 重要事項の表明
 メソッドブロック; // 処理内容
}

・別のメソッドを上下どこに定義しても、mainメソッドから動く。
・メソッド名は処理内容がわかる様に英単語で…。

メソッドの呼び出し

メソッド名(引数リスト);

引数(ひきすう。argument)

メソッド呼出し時に渡す事の出来る値。
・複数の引数を渡す事も可。

public static void main(String[] args) {
    メソッド名(1, 5);
}

public static void メソッド名(int x, int y) {
    処理;
}

・渡す値を「実引数」、受け取る変数を「仮引数」。

ローカル変数

メソッド内で宣言した変数。
・同名の変数でも、メソッドの内と外では別物。

戻り値

呼出し元に返す値の事。

return文

メソッド内の「return 戻り値;」の行。
・リターン文の後に処理を書いても実行されない。

void

何も戻さない時の指定。

メソッドの呼出し、戻り値を受取る

型 変数名 = メソッド名(引数リスト);

オーバーロード(多重定義)

同名メソッドを定義する事。
・異なる仮引数の型であれば定義可。
・仮引数の個数が違っても定義可。
・シグネチャが重複しない場合のみ許される。

シグネチャ(signature)

メソッド宣言に記述するメソッドの情報(メソッド名、引数の型と個数)。
メソッド名(型 引数,…)

gidのコマンドのおさらい(最新版をアップロード)

①git add.
②git commit -m"メッセージ"
③git push origin main

gidのコマンドおさらい(最新版をダウンロード)

①「.git」ファイルが有るフォルダ内の空白でGit Bashを開く。
②git fetch(最新版が無いか確認)
③git status(最新の状態を確認)
④git pull(最新の状態に更新)

配列が引数の時

アドレス情報のみ渡している。

参照渡し(call by reference)

引数としてアドレスを渡す事。

値渡し(call by value)

値そのものが渡される呼出し。

戻す値の型

メソッドの定義で宣言する。

戻り値の受取り方法

代入演算子(=)を使用する。

戻り値が配列の時

アドレス情報のみ戻している。

コマンドライン引数(command line argument)

Javaプログラム起動時の追加情報の事。

コマンドライン引数を利用したJavaプログラムの起動

java プログラム名 引数リスト
・引数リストは半角スペースで区切って入力。

部品化

1つのプログラムを複数の部品に分ける事。

二つ以上の.javaをコンパイルする時のコマンド

jabac *.java

Javaプログラムの完成品

複数のクラスファイルの集合体。
・実行する時のコマンドは「java クラス名」。
・実行時に指定するクラス名はmainメソッドが含まれているクラス。

JAR(Java ARchive)

複数のクラスファイルを1つにまとめるファイル形式。
・ZIPみたいなアーカイブファイル。

パッケージ(package)

大量のクラスを管理する為に分けるグループ。
・ソースコードn先頭にpackage文を記述。

package パッケージ名;

デフォルトパッケージ(無名パッケージ)

どのパッケージにも所属していないパッケージ。

完全限定クラス名(完全修飾クラス名)

パッケージ名を頭につけた完全なクラス名。
略してFQCN(full qualified class name)。

import パッケージ名.クラス名;(import文)

FQCN入力の手間を省く為の宣言。
・先頭のpackageの後に記述。

パッケージ時のjava起動時のコマンド

java FQCN名

クラスローダー(class loader)

JVM内部の機構。
・FQCN指定時、該当するクラスファイルを検索して利用可能にする役割。

クラスパス(classpath)

クラスローダーがクラスファイルを探す際に見るべきフォルダの場所。
・あらかじめ1つ以上指定。


・3つの指定方法がある。
A、java -cp URL指定(起動時にコマンドで指定)
B、OSの環境変数に登録
C、無指定(通常はコマンドが実行されたフォルダがクラスパスになる)


・指定の対象は3つある。
1.フォルダの場所
2.JARファイルやZIPファイル
3.複数フォルダと上記2の組み合わせ

名前の衝突

内容違いの別クラスの同名を取り合う事。

名前空間

使用可能な名前の総量。
・違うパッケージであれば同名OK。

API(Application Programming Interface)

Javaに初めから標準でついているクラス群。
・「java.」や「javax.」で始まるパッケージ名が通常。
・「java.lang」パッケージに属するクラスは自動的にインポート。
・APIのクラスは「APIリファレンス」で調べられる。

手続き型プログラミング

プログラムの先頭から順番に命令を考えて書く方法。

オブジェクト指向

ソフトウェア開発時の部品化の考え方。
・メリットは、楽して良い物を作れる。
・現実世界をマネて仮想世界で再現。
・クラスを定義して、オブジェクトを生成。

オブジェクト指向言語

オブジェクト指向のプログラムが作りやすくした言語(Java)。

オブジェクト指向の3大機能

継承、多態性、カプセル化。

インスタンス

金型(クラス)から生み出された実体。
・オブジェクトは曖昧なので。

クラス図

設計内容を上から一覧で書く設計図のルール。
・UML(世界共通の定義)で定められた図の一つ。

フィールド(field)

クラスブロック内で宣言された変数。

定数フィールド

フィールドの先頭にfinalを付けて定数化したやつ。
・大文字で書く。

this

自分自身のインスタンスを意味した変数。

メンバ(member)

同class内のフィールドやメソッドの総称。
・クラス名の頭だけ大文字、フィールド名とメソッド名の頭は小文字。

クラス型(class type)

クラスを定義する事で利用可になる型。
・インスタンスは通常、クラス型変数に入れて使う(同名インスタンスから識別する為)。

インスタンスの生成

クラス名 変数名 = new クラス名();

フィールドへの値の代入

変数名.フィールド名 = 値;

メソッドの呼出し

変数名.メソッド名();

ヒープ(heap)

Java実行時にJVMがメモリ領域を使って準備する物。
・ヒープの中に確保されたメモリ領域の一部がインスタンス。

参照

インスタンスの住所。

参照型

クラス型や配列型の総称。

参照(アドレス)の解決

変数から番地情報を取出して、その番地にアクセスする(JVMの動作)。

インスタンスの独立性

同クラスから作った異なるインスタンスは互いに影響しない事。

has-aの関係

あるクラスがフィールドで別のクラスを利用する関係。

String型

・クラス型。
・import文不要(同パッケージ内のクラス利用時にimport文が不要なjava.langパッケージに宣言されてい為)。
・二重引用符で文字列を囲めばインスタンスを生成して利用可。

String s1 = "abc";
String s2 = s1; // 配列やクラス同様にs1のアドレスが代入
s2 = "XXX"; // s2は、二重引用符で生成された"XXX"のアドレスが代入!!
System.out.println(s1); // "abc"が出力

コンストラクタ(constructor)

クラスがnewされた時に自動実行されるメソッド。
・フィールドの下に書く。
・JVMが自動実行(開発者が呼び出せない)。

public class クラス名 {
 フィールド
 public クラス名() {
  自動実行の処理内容;
 }
}

・複数のコンストラクタが定義されていた場合は、引数の有無など一致する物が1つだけ動作する。

デフォルトコンストラクタ

引数も処理内容も無いコンストラクタ。
・全てのクラスは1つ以上コンストラクタが必要で、無い場合はデフォルトコンストラクタがコンパイル時に自動で追加される。

this(引数);

同一クラス内の別コンストラクタの呼出しをJVMに依頼する構文。

継承

類似したクラスをサクッと作る機能。
・継承したクラスは(下記の構文で)差分だけ入力。
・元のクラス内の変更時は、元のクラスだけ変更すれば連動する。

public class クラス名 extends 元のクラス名{
親クラス(元のクラス)との差分
}

継承関係

親クラスと子クラスの関係。
・子から親や→を引く(クラス図)。
・孫や曾孫クラスもある。

多重継承

複数のクラスを親として1つのクラスを定義する事。
・Javaでは許可されていない。
・許可されている他言語もある。

オーバーライド(override)

親クラスのメンバ(フィールドとメソッドの総称)を子クラス側で上書きする事。

継承出来ないクラス

宣言時にfinalがついているクラス。

オーバーライド禁止のメソッド

宣言時にfinalがついているメソッド。

継承で作ったクラスのインスタンス

二重(多重)構造になっている。
・外側に子、内部に親。
・メソッドは外側から対応する(無ければ内部を探す)。
・孫なら三重構造。

親インスタンスのフィールド(or メソッド)を利用

super.フィールド名

super.メソッド名(引数)

・孫が親部分に直接アクセス出来ない。
・自分自身がthis、親へはsuper。

super(引数);

親クラスのコンストラクタの呼出し。
・未記入の場合、コンパイラで自動的に挿入されている。

newする時に引数を与える書き方の方が楽。

newの後に各項目を数行使って代入していくよりは・・。

継承はコンストラクタを引き継げない。

コンストラクタは各クラス固有の物。

is-aの原則

子クラスは親クラスの一種である(子 is a 親)。
・原則が成立しなければ、楽が出来るからといって継承してはいけない。
・子は何かに「特化」し、親は「凡化」(ふわっとしてる)。

継承ツリー

継承関係を表す図。

char型は「'」で囲む。

char型は1文字だけ代入出来る型。

抽象メソッド(abstract method)

詳細未定のメソッド。
・abstract(アブストラクト。抽象的)がついたメソッド。

public abstract 戻り値の型 メソッド名(引数リスト);

抽象メソッドを含むクラスの宣言

抽象メソッドを含むクラスは必ずabstract付きのクラスにしなければならない。

public abstract class クラス名{
 フィールド等
 public abstract 戻り値の型 メソッド名(引数リスト); // 抽象メソッド
}

・抽象クラスは、newでインスタンス化が禁止。
・抽象メッソドが無くても、抽象クラスは出来る。

実装(implements)

未定だったメソッドの内容を確定させる事。
・必ずしも子クラスでオーバーライドする必要は無く、孫以降でもOK。

インタフェース(interface)

処理内容を書かず後からメソッドの実装をして使用するための物。
・インターフェース内のメソッドは全て抽象メソッド
・基本的にフィールドが1つも無い。

public interface インタフェース名{
 public abstract 型 メソッド名();
}

・public abstract省略可。
・複数のインタフェースを親とする多重継承はOK(処理内容未定の為、自由)。
・複数の子クラスに共通のメソッド群実装を強制出来る
・あるクラスがインタフェースを実装すると定めたメソッドを持つことが保証される。

implements(インタフェースの実装)

インタフェースを継承して子クラスを定義する場合に使う。

public class クラス名 implements インタフェース名{
 実装部分
}

・オーバーライドして実装し未定メソッドを確定する。

インタフェースの多重継承

public class クラス名 implements 親インタフェース名, 親インタフェース名,・・・{
 実装部分
}

インタフェースの継承(処理未確定)

既存のインタフェースを継承して新たなインタフェースを作る時。

public interface クラス名 extends 親インタフェース名{
 抽象メソッド追加
 (親インタフェースの抽象メソッドも継承)
}

・一から作らなくて楽。

異種ならimplements

クラスやインタフェース同士の継承extends

両方使ったクラス定義(extendsとimplements)

public class クラス名 extends 親クラス implements 親インタフェース, 親インタ・・・{
 親クラスから継承した抽象メソッドを実装等
 親インターフェースから継承した抽象メソッドを実装
}

Eclipseのコマンド

ctrl + M
アクティブビュー等を最大化(戻す)。

ctrl + shift + F
eclipceのフォーマットに整える。

多態性

あるものをざっくり捉える事。

・オブジェクト指向プログラミングの3大機能の1つ。
・継承でis-aの関係が成立していれば、インスタンスを親クラス型の変数に代入可能。
・親クラス型変数に代入すると、そのインスタンスは曖昧に捉える事になる。
メソッドの利用の可否は、箱の型で決まる。
メソッドの動きは、中身の型で決まる。
・異なる複数のインスタンスをざっくり捉えてまとめて処理可(配列・引数等)。
・まとめて処理しても、個々で定義されているクラスは動作する。

ダウンキャスト

曖昧な型に入っている中身を厳密な型に代入するキャスト。

キャスト演算子

強制的な型変換をコンパイラにさせる。

ClassCastException

不正な代入時に出るエラー。

instanceof演算子

安全にキャスト出来るか判定する。

変数 instanceof 型名

・代入可能ならtrue

Eclipseでアプリ作る時の初期設定

新規プロジェクト→srcの中にパッケージ作成
・実行環境JREをjavaSE-11を指定。

アクセス制御

情報へのアクセスや動作の実施を誰に許可するか制限する事。

カプセル化

アクセス修飾子を使ってフィールド等へのアクセスを制限する。
・フィールドを殻(メソッド)で保護する感じ。

アクセス修飾子

宣言時に記述する事でアクセス制御可能になる。

private…自分自身のクラスのみ許可
package private(何も書かない)…同パッケージ内のクラスに許可
protected…同パッケージ内 or 継承した子クラスに許可
public…全てのクラスに許可

・privateでも、同クラスのメソッド経由すれば(this.~で)読書き可。

アクセス修飾の定石

クラス…public
フィールド…private
メソッド…public

・フィールドは、メソッド経由でアクセス。

getter

フィールドの中身を呼出し元に返すだけのメソッド。

public フィールドの型
getフィールド名(){
 return this.フィールド名;
}

setter

フィールドに値を代入するだけのメソッド。

public void
setフィールド名(
変数名){
 this.フィールド名 = 変数名;
}

アクセサ

getter と setterの総称。

getter と setterのメリット

Read OnlyやWrite Onlyのフィールドを作れる。
・getterだけにすれば、読み込みだけ可。

②フィールドの名前変更時の更新箇所が少ない
・他のコードはgetterやsetter経由なので。

③フィールドのアクセスを検査できる
・setter経由時にif文で検査出来る(trueなら書込みさせる)。
・throw new IllegalArgumentExceptionでエラーをだして強制停止。

package private

・別パッケージから見えない感じ。
・クラスの名前とソースファイル名は違ってOK。
・1つのソースファイルに複数クラス宣言可。
・但し、publicは1ファイルに付き一つだけ。
・publicは無くてもOK。

不具合

現実世界と仮想世界が食い違う事。
・現実世界同様に仮想世界を再現するのがオブジェクト指向。
・現実と矛盾しないクラスで組み立てれば、矛盾しないプログラムが出来る(それがカプセル化の狙い)。

toString()

オブジェクトをテキストで表すための文字列を返す。
lang.Objectクラスで定義されているメソッド。
・デバッグ目的で使われているメソッドと考えればいいらしい。
・System.out.println()は、渡されたオブジェクトのtoString()を利用して出力。

暗黙の継承

クラス定義時に親クラス未指定であれば、lang.Objectを親クラスと見なされる

Objectクラス

全ての先祖のクラス。
・先祖のメリットは下記2点。
①全ての先祖の為、多態性が利用できる(なんでもざっくり捉えられる)。
全てのクラスが持つべきメソッドを定義出来る。

Object型の変数

あらゆる参照型のインスタンスを格納出来る。
・基本データ型(int等)の情報は格納不可。

等値と等価

等値==)・・・同一の存在。同じアドレスならtrue。

等価equals)・・・同じ内容。アドレスは関係ない

toString()とequals()

オーバーライド(設定を)する必要があればする。
・クラスは何をもって同じとみなすか、を設定(equals)。

静的メンバ

staticがついたフィールドやメソッド。

静的フィールド(static field)

・フィールド変数の実体をクラス側で共有される(PTで財布を共有的な)。
・全インスタンスにフィールド変数の分身を用意(各自財布を持ち中身は共有)。
・インスタンスを作らなくても共有の箱は利用可(実体なくても財布は使える)。
・静的フィールドは、クラス変数とも言う(クラス側に実体が有るので)。

静的フィールドへのアクセス

クラス名(又はインスタンス変数名).静的フィールド名

public static final コンビネーション

変化しない定数を各インスタンスで共有する為に利用。

静的メソッド(又はクラスメソッド)

staticが付いているメソッド。

・メソッド自体がクラスに属する(newしなくていい)。
・インスタンスにメソッドの分身が作られる。
インスタンスを作ってなくても呼び出せる

静的メソッド内部では静的メンバしか使えない
スタティック(静的)メソッドから呼べるメソッドはスタティックメソッドだけ

静的メソッドの呼出し

クラス名.メソッド名();

インスタンス変数名.メソッド名();

static インポート文

あるクラスの静的メンバをインポート。

import static パッケージ名.クラス名.静的メンバ名;

文字列処理(テキスト処理)

文字列の情報を処理する方法の総称。

文字列調査

equals()…内容が等しいか調べる。
equalsIgnoreCase()…大文字小文字区別せず等しいか調べる。
length()…文字列を調べる。
isEmpty()…空文字(0か)を調べる。

・空文字とnullは違う。

文字列検索

contains()…文字列を含むか
startsWith()…文字列で始まるか
endsWith()…文字列で終わるか
indexOf()…文字(列)が最初に登場する位置を調べる。
lastIndexOf()…文字(列)が後ろから検索して最初に登場する位置を調べる。

・文字列の先頭を0。

文字列を切り出す

charAt()…指定位置の1文字を切り出す
substring(始まり, 終わり)…指定位置から始まる文字列を任意の長さだけ切り出す

文字列を変換

toLowerCase()…大文字を小文字に変換
toUpperCase()…小文字を大文字に変換
trim()…前後の空白除去(全角スペースは除去されない
replace(始まり, 終わり)…文字列を置換える

文字列の連結

連結は、+演算子よりStringBuilderクラスでやる方が早い。
・+演算子は連結の度にnewしている。

StringBuilderクラス

文字列を連続して連結する時に早いクラス。
・appendメソッドでバッファに追加する文字列を貯め最後に1回だけtoString()で連結
可変なクラス。

不変なクラス

インスタンス化後に内容が変化しない様に設計されたクラス。

matchesメソッド

条件に一致しているか判定。

文字列の変数.matches("正規表現で文字列パターン");

パターンマッチング

パターンの形式にマッチしているか照合処理する事。

正規表現

いくつかの文字列を一つの形式で表現するための表現方法。

通常の文字・・・同じ文字ならtrue(大文字小文字は別物。
.(ピリオド)・・・任意の1文字。
* ・・・直前の文字の0回以上の繰返し。
.* ・・・全ての文字列OK(任意の文字列を0回以上繰返し)。
{n} ・・・直前の文字をn回繰返し。
{n,} ・・・直前の文字をn回以上繰返し。
{n,m} ・・・直前の文字をn回以上m回以下繰返し。
? ・・・直前の文字を0~1回繰返し。
+ ・・・直前の文字を1回以上繰返し。
[文字] ・・・カッコ内の文字どれか。
[a-z] ・・・アルファベット小文字のどれか。
¥d ・・・数字([0-9]と同じ)
¥w ・・・英字・数字・アンダーバー([a-zA-Z_0-9]と同じ)
¥s ・・・空白文字(スペース、タブ文字、改行文字など)
^ ・・・先頭
$ ・・・末尾

splitメソッド

文字列を複数に分割出来るStringクラスのメソッド。

// 正規表現パターンとマッチする場所で文字列を分割して配列に代入。
配列変数名 = 文字列の変数.split("正規表現パターン");

replaceALLメソッド

文字列中で一致した箇所を置換えるメソッド。

// 文字列内でパターンに該当する所をbに置換える。
変数名 = 文字列の変数名.replaceALL("正規表現パターン","置換える文字b");

メソッドチェーン

自身への参照を返すメソッドを連続して呼出す方法。

format()

Stringクラスで準備されている、文字列を整形する為の静的メソッド。

// 書式指定の文字列に、第2引数以降の値をいれていった物を代入。
文字列の変数 = String.format(書式指定文字列,第2引数以降,…);

書式指定文字列

文字列のひな形。

プレースホルダ

書式指定文字列内の%記号部分(%dや%s等)。

書式を指定して画面に表示

System.out.printf(書式文字列,パラメータ…);

可変長引数

必要に応じて何個も引数を渡すことが出来る仕組み(printf()とか)。

エポック

基準日時(1970年1月1日0時0分0秒)。

日時情報

Javaの日時情報を表す形式は4つある。

long型の数値(エポックから経過したミリ秒)
Date型のインスタンス(内部はlong値、一目でわかる形式)
6つのint型(年月日時分秒を個別で人間が入力する時に使う形式)
String型のインスタンス(人間が読みやすい形式)

Date d = new Date();

現在日時を持つDateインスタンスの生成。

Date d = new Date(long値);

指定辞典の日時を持つDateインスタンスの生成。

Calendarクラス

Date型とint値の相互変換用に準備されているクラス
・java.util.Calendar。
・月は0始まり(0~11)。

6つのint値からDateインスタンスを生成

Calendar c = Calender.getInstance();
c.set(年,月,日,時,分,秒);     // 又は、c.set(Calendar.Year等, 値);
Date d = c.getTime();

Dateインスタンスから6つのint値を生成

Calender c = Calendar.getInstance();
c.setTime(d);
int year = c.get(Calendar.YEAE);
// 以下、月・日・時・分・秒も同様。

SimpleDateFormatクラス

Date型と文字列型の相互変換用に準備されているクラス。
・java.text.SimpleDateFormat。

StringからDateインスタンスを生成

SimpleDateFormat f = new SimpleDateFormat(書式文字列);
Date d = f.parse(文字列);

DateインスタンスからStringを生成

SimpleDateFormat f = new SimpleDateFormat(書式文字列);
String s = f.format(d);

DateやCalendarの代表的な問題等

古参のAPIで、下記の問題が有る。
・月が0始まりでややこい。
・並列処理時にインスタンスが壊れる事がある。

又、機能的限界がある。
・最小がミリ秒単位。
・日常利用する曖昧な日時や時間の幅を表せない。

Java.timeパッケージ

java8から追加された日時関連のクラス群。

Instantクラス

エポックからの経過時間をナノ秒数で格納。

・旧来のAPIのDate的な役割。

ZonedDateTimeクラス

Calenderクラスの後継的なクラス。

java.time.chrono.JapaneseDateクラス

和暦を扱える。

タイムゾーン

ZonedDateTimeクラスに含まれている情報。
・Asia/Tokyo等の文字列で表現。

LocalDateTimeクラス

日常的に使う日時情報を格納する為には、最適なクラス。

・タイムゾーン情報だけ格納出来ない。
・ZonedDateTimeからタイムゾーン情報を削った物。

Durationクラス

短い間隔を表す時に使う(時・分・秒)。

Periodクラス

日数ベースの期間に使う。

文字列⇔日付オブジェクト

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Birthday {
 public static void main(String[] args) throws ParseException {
   String birth = "2006/06/21";
		
   // 文字列を日付オブジェクトに変換する
   SimpleDateFormat
sdf = new SimpleDateFormat("yyyy/MM/dd");
   Date birthday = sdf.parse(birth);
		
   // 日付オブジェクトを文字列に戻す
   String birthText = sdf.format(birthday);
 }
}

// Time APIを使うと…
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Birthday {
 public static void main(String[] args){
   String birth = "2006/06/21";
		
   DateTimeFormatter
dtf = DeteTimeFormatter.ofPattern("yyyy/MM/dd");
   // 文字列を日付オブジェクトに変換する
   LocalDate birthday = LocalDate.parse(birth, dtf);

   // 日付オブジェクトを文字列に戻す
   String birthText = birthday.format(dtf);
 }
}

リスト

順序をつけて並べて格納するデータ構造。

セット

集合のデータ構造。

マップ

ペアで対応付けて格納するデータ構造。

コレクションフレームワーク

データをまとめて格納する入れ物クラス群(リスト、セット、マップ)。
・インスタンスでない物は格納不可。

ArrayList

コレクションクラスの一種。
・import文を記述。
・配列と違い、サイズ指定は不要(随時追加可)。

ジェネリクス

ArrayList記述時の<>記号を使ったJava文法の一種。

ラッパークラス

基本データ型の情報を中身に保持する為の8つのクラス。

オートボクシング(オートアンボクシング)

ラッパークラスと基本データ型を相互に自動変換する機能。

ArrayListの宣言

ArrayList<インスタンスの型名> 変数名 = new ArrayList<インスタンスの型名>();

右辺の型名は省略可能(この時の<>をダイヤモンド演算子と言う)

要素を順に取出す方法(for文,拡張for文,イテレータ)

// for文
for(int i = 0; i < リスト変数.size(); i++) {
 System.out.println(リスト変数.get(i));
}

// 拡張for文
for(要素の型 要素の変数 : リスト変数) {
 System.out.println(要素の変数);
}

// イテレータ(+ while文)
Iterator<要素の型>
it = リスト変数.iterator();
while (it.hasNext()) {
 要素の型
変数 = it.next();
 System.out.println(変数);
}

イテレータ

コレクションクラスの中身を順に取出す為の道具。
・箱を指している矢印みたいな物。
・その矢印が横に進んで行く感じ。

箱箱箱

イテレータの取得

Iterator<要素の型>
it = リスト変数.iterator();

LinkedList

連結リストと呼ばれる構造。
・LinkedListの方が、要素の挿入や削除が早い(変更後の番号の玉突きが無い為)。
・ArrayListの方が、要素の位置取得が早い(番号が有るので頭から数えない為)。

左辺はListだけでいい

List<> 変数 = new ArrayList<>();

・どっちのリストでも対応出来る為。

集合(セット)

要素の重複も順序も無いデータ構造。

・値が重複すると無視される。
・要素を取出す際の順序不明。

順序が保障されるセット

LinkedHashSet・・・値を格納した順に整列。
TreeSet・・・自然順で整列。

・自然順とは、クラス固有の順序(Stringなら辞書順)。

マップ

キーと値のペアで格納するデータ構造。
・値の重複はOK。
・キーの重複はダメ。

HashMapのインスタンス化

Map<キーの型, 値の型> マップ変数 = new HashMap<キーの型, 値の型>();

・右辺の型は省略可。

Mapのメソッド

// 格納(上書き)
Map.put(キー, 値);

// 取得
Map.get(キー);

// 削除
Map.remove(キー);

マップに格納された情報を1つずつ取出す

for(キーの型 key : マップ変数.keySet()) {
 値の型 value = マップ変数.get(key);
 処理;
}

コレクションのネスト

コレクションクラスの中に、要素として別のコレクションを格納する事。

Hash系コレクションに独自のクラスを格納する時、
equals()やhashCode()をオーバーライドする必要有り。

型推論

右辺に合わせて型を合わす。

var 変数 = 値;

下記はエラー。
・右辺が無い。
・nullを代入。
・型を省略した配列の初期化。

又、コレクションの宣言に使うとシンプルになる。

Map<キーの型, 値の型> マップ変数 = new HashMap<キーの型, 値の型>();
↓
var map = new HashMap<キーの型, 値の型>();

不具合

プログラムが想定通りに動かない事。

syntax error

文法エラー。
・セミコロン忘れ。
・変数名間違い。
・privateメソッドを外部から呼出す。

runtime error

実行時エラー。文法は正しいが、実行中にエラーがおこる。
・配列の範囲外要素へのアクセス。
・0での割り算。
・存在しないファイルのオープン。

logic error

論理エラー。実行結果が想定内容と違う(1+1が4とか)。

例外的状況(例外)

想定外の事態。

例外処理

例外時の対策実施。

例外処理の基本パターン

try {
 通常時、実行される処理;
} catch(例外クラス e){
 例外時、実行される処理;
}

例外クラス

発生した例外を区別する為の各状況を表すクラス。

Error系例外(回復の見込みがない致命的な状況)

Exception系例外(対処を考える必要がある状況)

RuntimeException系例外(必ずしも想定しなくてもいい状況)

チェック例外

例外発生時の対策が用意されているかコンパイル時にチェックされる例外。
Exception系例外の事。

スタックトレース

JVMがプログラムのメソッドを、どのような順序で呼出しどこで例外がでたかの記録。

try-catch-finally構文

try {
 通常時、実行される処理;
} catch(例外クラス e){
 例外時、実行される処理;
} finally{
 例外の有無に関わらず実行させる処理;
}

try-with-resources構文

finallyを記述しなくても自動的にcloseされる構文(java7から可能)。

try (closeによる後片付けが必要な変数の宣言){
 通常時、実行される処理;
} catch(例外クラス 変数名){
 例外時、実行される処理;
}

・宣言する変数はAutoCloseableを実装している必要有り。

例外の伝播

例外はキャッチされるまで呼出し元まで処理をたらい回し。

スロー宣言

チェック例外をキャッチせずに、呼出し元へ伝播させてよくなる宣言
(=try-catch文がなくてもコンパイルエラーにならなくなる)。

・スロー宣言した側は、例外のキャッチ義務が無くなる。
・スロー宣言しているメソッドを呼出す側は、義務が生じる。

アクセス修飾 戻り値 メソッド名(引数リスト) throws 例外クラス1,… {
 メソッドの処理内容
}

throw new 例外クラス名(“エラーメッセージ");

例外的状況が発生した事をJVMに報告する構文。
・この報告を例外を「投げる」又は「送出する」と表現。

toString()

自分自身の内容の文字列表現を返す。

toLowerCase()

入力された文字を小文字に変換する(小文字はそのまま)。

// 例 入力された文字を…
String 変数 = new Scanner(System.in).nextLine().toLowerCase();

Eclipseで作ったコードをコマンドアプリ化する方法

1.プロジェクトを右クリックをエクスポート。
2.java→実行可能JARファイル→次へ。
3.起動構成を指定(実行時の画面一番上のクラス名と番号をみて)。
4.エクスポート先は適当に指定して完了

・完了後に何か出てきてもOK数回押したらいい。
・エクスポートしたファイルがあるフォルダ内でcmdを起動。
・このファイルを使うには、javaランタイム?のインストールが必要。

java -jar ファイル名.jar

cmdでjarファイルを実行するコマンド。

/** + エンター

複数行コメント。

/**
 * 〇〇クラス(抽象クラス)
 * このクラスをもとに、〇クラス、〇〇クラスを作成する。
 * 
 * URL
 * 
 * @author ユーザー名
 *
 */

/**
 * 〇〇の1人を乱数によって決め、
 * その1人を〇〇するメソッド。
 * 
 * @param cList -- 〇〇軍団(A, B, C)
 */

Ctrl + Shift + B

ブレークポイントをはる。

デバッグ

1.Eclipseで調べたい行の左側をダブルクリック
(又は、Ctrl + Shift + B)。

2.デバッグ(虫アイコン)をクリック。

3.(デバッグ実行が開始し)ブレークポイントの所で処理が止まる。

・ステップオーバーで次の行へ行く。

Scannerの書き方

// AとBは同じ

// A
name = new Scanner(System.in).nextLine();

// B
Scanner scan = new Scanner(System.in);
person.name = scan.nextLine();

Java

Posted by ippei