Javaプログラミング基礎

  • リテラル ... ソースコードに直接書き込んだ値やその表記のこと
  • 整数リテラルの間にアンダースコアを入れることができる 100 = 1_00
  • パッケージに属さないクラスは自動的に無名パッケージに属させられる
  • staticインポート ... staticなフィールドやメソッドを省略表記する(import static pk名.class名.オブジェクト名)
  • エントリーポイント ... 処理を始めるためのメソッド
  • 文字リテラルは'', 文字列リテラルは""
  • プリミティブ型にnullは不可
  • 命名規則に「_」と「$」は使える
  • シグニチャ ... メソッド名と引数のリストのセット
  • intとIntegerは別物。後者はラッパークラス。
  • _は①記号の前に着けられない②接頭末尾には付けられない。
  • a = 数字++ は aに数字が代入されてから加算。
  • booleanに><は使えない
  • コンスタンスプール ... 文字列リテラルはメモリの再利用されている
  • ifelse初荷の一行のみネスト(多重階層の場合は、そのスコープ全体をネスト)。
  • switch文の条件値は(整数、文字、enumのみ。)
  • switch文のdefaultなどの順番は特にルールはない。(一般的には一番後ろ)
  • 基本データ型変数
    • プリミティブ型変数
    • 値型変数
  • 参照型変数
    • イミュータブル変数 ... 変更できない変数、String, LocalDate, LocalDateTime
    • ミュータブル変数 ... 変更できる変数、上記以外
if (num == 100)  
    statements  
elseif  
    statements  
else  
if(num = 10)  
    statements  
else  
if(num = 10)  
    statements  
graph LR  
    byte-->short  
    short-->int  
    char-->int  
    int-->long  
    long-->float  
    float-->double  

配列

  • 添え字 ... インデックス
  • ダイヤモンド演算子
  • int testarray = new int[2]{1,2} はエラー。
  • int e[]; e = {} もエラー。
  • nullはリテラル
  • int t = new int[][1]; はエラー。逆はおk。
  • int[] a, int a[], int[] a[], int[][] a[]でもok。
  • 宣言部の左にはインデックス(添字)は入れられない
  • int[][] a[]; や int[] a[];もあり。

繰り返し

  • break ラベル名 ... ラベル名: のところに移動
  • for(初期値)のところは複数の型指定はできない
  • forに複数かけるのは初期値と更新値の所for(int i, j, i<?, i++, j++)
  • forの更新値のところはメソッドもかける
  • forは条件式のところは省略可能

クラス

  • クラス内のstaticメンバはクラス内の非スタティックメンバ(インスタンスメンバ)には直接アクセスできない。インスタンス化してアクセスする。
  • staticイニシャライザ ... クラスファイルがロードされたタイミングで実行されるブロック(インスタンス化、main()よりも前)

public class Foo{  
    static {  
        System.out.println("Fooクラス:staticイニシャライザ");  
    }  
    Foo(){  
        System.out.println("Fooクラス:コンストラクタ");  
        }  
}  

public class Main{  
    static{  
        System.out.println("Sample5_9クラス:staticイニシャライザ");  
    }  
    public static void main(String[] args){  
        System.out.println("Sample5_9クラス:main()メソッド");  
        Foo f = new Foo();  
    }  
}  
  • ガベージコレクタへの入れ方 ... ①nullを入れる ②参照変数をほかのオブジェクトに割り当てる ③finalizeメソッド

  • 参照型の変数は、メソッドの引数に変数入れて中身を変えると、元の変数の中身ごと書き換わる。(arrayなど)
     値型は、メソッドの引数に入れて中身を入れても、モノと変数の中身は下記クラス内、

  • javaの標準パッケージ

パッケージ名 説明 主なクラス
java.lang Javaの基本動作を提供しているパッケージ。import文不要。 String, Math, Integer
java.io ファイルからのデータ読み込みなど、入出力関連の機能を提供するパッケージ File, PrintWriter, BufferedWriter
java.net
javax.net
ソケットアプリケーションなどネットワークアプリケーションを作成するためのクラスを提供するパッケージ Socket, ServerSocket, URL
java.util 複数のオブジェクトを1つにまとめて管理することができるクラスや、国際化、日付操作等のユーティリティクラスを提供するパッケージ HashSet, ArrayList, Vector
java.text テキスト文字列、日付、数値など構文解析や書式化を行うパッケージ DateFormat, NumberFormat, MessageFormat
  • 可変長引数は ①複数引数がある場合は、最後の引数に記載すること②違う型の可変長引数を同時に定義することはできない(あたりまえ)
public void method(String string, int... args){}  
  • returnはreturn;のような使い方もできる。(呼び出し元に制御を戻す)
  • 実行されないことが明確なコードがある場合、コンパイルエラー。
  • static領域とヒープ領域
  • staticなフィールドは、① クラス名.フィールド名 ②インスタンス名.フィールド名 の2つで操作できる。

    ②は、各インスタンスのフィールドにアクセスしている訳でなく、staticなフィールドにアクセスしている。つまり①と同じ。
  • staticメンバからは基本staticメンバにしかアクセスできない。
to \ from staticメンバ インスタンスメンバ
staticメンバ アクセス可 アクセス可
インスタンスメンバ インスタンス化
したらアクセス可
アクセス可
  • オーバーロードの条件 ... 引数の数、型、条件のいずれかが異なること。
  • 引数に入れた値が複数のオーバーロードのどれに当たるのかわからない場合もエラーになる
  • 初期化ブロック ... コンストラクタよりも前に実行したい処理を記載する
public class Test{  
    {  
        // 初期化ブロック  
    }  
}  
  • デフォルトコンストラクタは、引数如何関わらず何かしらコンストラクタが定義されているとエラーになる。
  • コンストラクタ内の別コンストラクタ呼び出しは初めの行に記載する。
  • メソッドの引数にプリミティブ型を指定した場合、コピーが渡される。そのため、中で値を変えても、呼び出し元は変わらない。

継承とポリモフィズム

  • 親クラスと子クラス = スーパークラスとサブクラス
  • スーパークラスは、暗黙的にobjectクラスをextendsしている
  • オーバーライドのルール
種類 オーバーライドの定義ルール
アクセス修飾子 スーパークラスと同じか、それより公開範囲が広い
戻り値 スーパークラスと同じか、そのサブクラス
メソッド名、引数リスト スーパークラスと同じ名前、同じ引数のみ
  • final修飾子
修飾対象 どうなるか
変数 定数化
メソッド サブクラス側でそのメソッドをオーバーライドできなくなる
クラス そのクラスをもとにサブクラスを作成できなくなる
  • this.変数名 ... 自オブジェクトが持つ変数名(インスタンス変数)
  • コンストラクタ内でthis() ... 自クラス内の別のコンストラクタを呼び出し可能(但し、コンストラクタの先頭に記入)
  • super.メソッド ... 親クラスのメソッドを明示的に呼び出し
  • super() ... 親クラスのコンストラクタを明示的に呼び出し
  • 親クラスが抽象クラスでサブクラスが抽象クラスの場合、サブクラスは必ずしもオーバーライドする必要はない
  • インターフェースはvoidメソッドを定義すると、暗黙的にpublicとabstractがつく。
  • インターフェースは多態実装が可能(implement a, b)
    また、多重継承も可能(interfaceA > interface B > interfaceC)
     その場合、実装クラスは一番上から下のインターフェースまですべて実装する必要がある。
  • Autoboxing ... 基本データ型からラッパークラスへの自動変換のこと。逆はUnboxing
    • ラッパークラス ... 基本データ型(int等)の値をラップ(=包み込む)してオブジェクトとして利用できるようにするクラス(Int)
  • サブクラスはスーパークラスのコンストラクタとprivateメンバは引き継げない。
  • オーバーライドは、引数が同じであり、戻り値が同じかサブクラスであること。
  • A a = new B();でBがAのサブクラスの場合、Aクラスに記載されているメンバ名のメンバしか使うことができない。
  • アップキャスト(子クラスから親クラスへキャスト) ↔ ダウンキャスト

JavaAPIの利用

  • Java.lang.objectクラス
  • Listの実装クラスはどれもnullを許容する
  • LocalDate.parse()の結果をdatetimeformatはできない。
メソッド名 説明
boolean equals(Object obj) 自オブジェクトとobjを比較
final Class<?> getClass() このオブジェクトの実行時クラスを返す
int hashCode() オブジェクトのハッシュコード値を返す
String toString() オブジェクトの文字列表現を返す
  • DateandTimeAPI
クラス名 説明
LocalDate 日付を表す不変オブジェクト。of(), now(), parse(), plus〇〇等。
LocalTime 時間を表す不変オブジェクト。of(), parse()等。
LocalDateTime 日付/時間を表す不変オブジェクト。of(), parse()等。
Period 期間を扱う
DateTimeFormatter 日付/時間の出力及びフォーマットを行う。ISO_DATE,ISO_TIME,ISO_DATE_TIMEのフォーマッタがある。
  • SE8で導入された関数型インターフェース
インターフェース 抽象メソッド 概要
Function<T,R> R apply(T t) 実装メソッドは引数としてTを受け取り結果としてRを返す
Consumer void accept(T t) 実装メソッドは引数としてTを受け取り結果を返さない
Predicate boolean tests(T t) 実装するメソッドは引数としてTを受け取りboolean値を結果として返す
Supplier T get() 実装するメソッドは何も引数として受け取らず、結果としてTを返す
UnaryOperator T apply(T t) 実装するメソッドは、引数としてTを受け取り、結果としてTを返すものになる。Functionを拡張したもの。
  • String型の初期化は1. new String("")と""とString.valueOf("")がある。またimmutable(不変)なオブジェクト。
  • String型のsubstringやdeleteなどの(startindex, lastindex)の考え方は、startindex ~ lastindex-1 と考えたほうが良い。
  • trimは" "のほかに、タブや改行文字も省く。
  • replaceでは引数に指定した文字をそのまま置き換えるが、replaceAllでは引数に指定した文字を正規表現と見なして置き換える。
  • 参照を持たないString型でも連結することができる
  • StringBuilderはデフォルトで保持している文字列 + 16文字分のバッファを持っている
  • StringBuilder.capacity ... StringBuilderの容量を返す
  • StringBuilderにはプリミティブ型、String, Char配列, オブジェクト型を追加できる
  • replaceは、(start, end, char)と指定している場合、start~end-1の文字をすべて消したうえで、charを1字挿入するイメージ。
  • ラムダ式(匿名関数)内の変数は、外で既に定義されているものは使えない。また外の変数を使用する場合、finalである物しか使えない。
  • localdatetime, lodaldateクラスはイミュータブル。timeのof,parseの指定は分と秒は省略可
  • javaのlistに対するremoveは要素は消せるものの、カーソル位置は変わらない謎仕様なの注意。イテレータを使うのが定石らしい。

  • サブクラスは親クラスのコンストラクタを引き継げない、という表現に関して

    • 確かに引き継ぐ(@Override)はできない、が、利用はできる(強制的にする)
      子クラスのコンストラクタで暗黙的にsuper()が挿入される。
    • https://www.sejuku.net/blog/20896
    • superで呼び出すことはできるが、親クラス名()で呼び出すことはできない、というイメージで。
  • stringbuilderのequalsメソッドはobject.equalsを呼び出している ... 参照先しか比較しない(インスタンスが同じかどうかレベルで比較する)
  • LocalDateTimeはイミュータブルなクラスなので変更できない。
    • javaはほとんどミュータブルなクラス。
  • ラムダ式
    • () -> {} の()には(name)と(String name)の書き方がある
    • {}を省略する場合は、1文だけで記述し、なおかつreturnは書いてはいけない。
  • 時刻の差を取り扱うのはduration, 日にちの差を取り扱うのはperiod

例外クラス

  • 例外はDBエラーや環境外エラーなど、例外処理が必須のchecked例外と、実行中のプログラム内で発生するunchecked例外に分けられる。

  • throwable ... 例外クラスのルート。ErrorクラスとExceptionクラスに分けられる

  • Error ... unchecked例外。このサブクラスも同様。
クラス 概要 発生/checkedか/検査か
Error 実行環境のトラブルなど、プログラムからは対処しようのないエラー 実行時
unchecked例外
非検査項目
AssertionError assert分を使用しているときにboolean式でfalseが帰る
OutOfMemoryError メモリ容量不足、ヒープ領域が一杯
StackOverflowError 再起過多、スタック領域の不足
NoClassDefFoundError コンパイル時に存在したクラスが見つからない
ExceptionInInitializerError staticイニシャライザを処理している間に例外が発生
Exception - RuntimeException 例外処理を記述したかどうかをコンパイラが検査しない例外 実行時
unchecked例外
非検査項目
ArithmeticException ゼロ割等、不能演算が指示された
IllegalArgumentException 利用される側のオブジェクトが不正な引数を受取った
NumberFormatException parselntメソッドが変換形式に合わない引数を受取った
IndexOutOfBoundsException 配列や文字列、コレクションの範囲外アクセス
ArrayIndexOutOfBoundsException 配列の範囲外アクセス
StringlndexOutOfBoundsException 文字列の範囲外アクセス
NullPointerException オブジェクト参照がnullの状態で、インスタンスにアクセスする。
DateTimeException java.time.LocalDateクラスのエラー
ClassCastException 継承関係や実現関係にない型に互換性のないクラスをキャスト
IlegalStateException 呼び出し元が利用するための準備が終わっていない
Exeption - 上記以外 例外処理を記述したかどうかをコンパイラが検査する例外 コンパイル時
checked例外
検査項目
IOException 入出力を行い場合に発生
FileNotFoundException ファイルがない
ClassNotFoundException クラスファイルが見つからない
SQLException データベース操作時に発生した例外
  • throw ... throw()を文として書くことで、例外を発生させることができる。
  • throws ... throws Exception名() をメソッド定義の後ろに記載することで、例外内容を定義することができる。
  • try, catch, finnalyの順番は崩せない。
  • finallyブロック内は、try、catchにreturnが書かれていたとしても実行される。finallyにもreturnが書かれていた場合、try,catchのreturnの後上書きされる。
  • trycatchはネストされていた場合、最も近いネストが実行される。ただしfinallyに関しては、外側のものもすべて実行される。
  • エラーと例外
    • エラー(errorクラス) ... 実行環境のトラブルなど、プログラムからは対処しようのない事態。
      outofmemoryerror,stackoverflowerrorなどerrorがつく。
    • 例外(Exceptionクラス)  ... プログラムが対処できる以下の2つに分かれる。
  • 検査例外と非検査例外 ... 非検査例外はtrycatchを強制されない。
    • 検査例外()  ... 例外処理を記述したかどうかをコンパイラが検査する例外。プログラムを正しく書いても防げないという認識で。
      IOException, SQLException, ClassNotFoundError
    • 非検査例外(RuntimeExceptioin) ... 例外処理を記述したかどうかをコンパイラが検査しない例外。プログラムを正しく書けば別にtrycatchを書かなくてもよい。(多すぎるため書くと可読性が下がる)
      NullPointerException, ArrayIndex...
  • try catchかtry finnaryのどちらか。tryのみは不可。
  • Exceptionクラスを継承しているクラスは、呼び出し元がtry^catchでcatchするか、throwsを投げるかいずれかの実装をしないとコンパイルエラーになる
  • 文法的に間違っているものはコンパイルエラー
  • 実行時に判明するものは実行時エラー
  • throwsは例外が発生した場合、呼び出し元に例外処理を投げることができ
  • mainメソッドでthrowsをつけると投げっぱなしになる(つまりExceptionやErrorをつけると、エラーが出なくなるわろた)

勉強の仕方(自分は6日で取りました)

前提
流れ
No. 概要 詳細 期間
1 紫本を軽く読む 紫本をスラーっと読んで文法の復習をする(練習問題は解かない)
長くて1日それ以上かかるのであれば文法書からやったほうがいいです。
4h
2 黒本の問題を解く 解き方は
①まず章ごとにスラーっと問題を解く
②合ってた問題も含めて全て答え合わせをする。(まぐれを防ぐため)
間違えた問題のみ、1日後,3日後(,6,10,,)に解く
24h
3 模擬試験を解く 黒本の総合問題1 ⇒ 黒本の総合問題2 ⇒ 紫本の総合問題を解く 12h