サブクラスでスーパクラスのコンストラクタが呼び出されてない場合
サブクラスのコンストラクタ呼び出し直後に、暗黙にSuper();が追加されることになり、スーパークラスにはデフォルトコンストラクタが必須になる。(スーパークラスに引数有りのコンストラクタしかない場合)
2009年2月アーカイブ
- publicなクラスはクラス名とファイル名は同じでなければいけない。
- public出ないクラスはファイル名は任意に出来る。
1番内側の繰り返しの先頭に戻る。その際Whileなdの条件式がfalseの場合はWhileのなかの式が実行されない。
Object str = new String("Hello"); if (str instanceOf String) {}→true if (str instanceOf Object) {}→true*javaの全てのクラスはObject型を継承しているので、~ instanceOf Objectはtrueになる。
メソッド
- getInstance()・・・小数点のある数値の書式化を行う、汎用数値フォーマットを作成する
- getNumberInstance()・・・小数点のある数値の書式化を行う、汎用数値フォーマットを作成する
- parse()・・・書式化されたデータを読み込むときに利用。返り値はNumber。
- format()・・・書式化されてないデータを書式化する
優先順位
四則演算>比較(==)>代入(=)
|演算子
両辺にboolean式を指定する。じゃないと、コンパイルエラー。
ex.
if((i == ++j) | (i++ == j)) { ←i++の後置演算はintが返るためコンパイルエラー
}
カレントフォルダを直下に移動しないでjavaコマンドを使う方法
パッケージ名~クラス名までフル指定する
ex. java org.abc.Smaple
-classpathまたは-cp・・・クラスパスの設定
-d・・・パッケージに対応するディレクトリを作成する
-D・・・システムプロパティを設定する。指定時にスペースをいれない
必ず一番最初にかく。importよりも先!
ソート方法のみ定義したクラスを作れる
メソッド
int compare(T o1, T o2)・・・これをオーバーライドする。第二引数にたいしてcompareToすると降順になる。
昇順の場合
import java.util.*;
class SortMethod implements Comparetor{
public int compare(Employee emp1,Employee emp2) {
retrun emp1.getId().compareTo(emp2.getId());
}
}
メソッド
compareTo()・・・戻り値がせいの値だった場合後ろとみなされる。
idの昇順の例
class Employee implements Comparable{
int id;
//省略
public int compareTo(Employee o) {
retrurn id. - o.id; //idの昇順
}
}
メソッド
- revese()・・・listないの要素を逆順に並べかえる。listがコピーされていた場合、オリジナルのlistもリバースされるので注意。
- sort()・・・引数のlistに変更したオブジェクトはComparableインターフェースを実装している必要がある。実装して無いとコンパイルエラー。違うクラスの混ざったソートは指定しない限り、実行時エラー。自作クラスの場合はComparableインターフェースのint compareTo(T o)を実装し、ソート順序を定義する必要があるので注意。ソート順はスペース、大文字、小文字の順にソートされる。詳しくはこちら
- binarySerch()・・・(引数2つの場合)第1引数のlistから、第2引数を検索し、そのインデックスを返す。検索対象が見つからなかったときは「-index-1」(indexは挿入されているべきインデックス)が返される。
(引数3つの場合))第1引数のlistから、第2引数オブジェクトを検索し、第3引数はソート順序をしてする。ただし、第3引数のソートはあらかじめ行われていないと「-1」が返る。また同じソート(方法)を使用しないと正しい結果がでない。
配列を操作するクラス。
メソッド
asList()・・・指定した配列をListに変換する。コピー元と同じ順序で内容をコピーする
Sort()・・・配列は自然順序で並べ替えられる
System.out,println(obj);上記の場合、暗黙的にtoString()が呼ばれる。
- 左辺と右辺は原則同じ型でないといけない。しかし片方しか指定していなくても、警告は出るがコンパイルは通る。違う型だと文法的にNG(継承関係にあってもNG)。ただし左辺にワイルドカードが入る場合はOK.
- クラスの宣言ではワイルドカードが使えないので、Tを使って表現する
Set<Integer>の入ったリストを作る場合の書き方
List> list =new ArrayList >();
多態性とジェネリックス記法(ワイルドカード)
- extends クラス名>・・・そのクラスとサブクラスを許可。クラス名のかわりにインタフェース名もextndsで可能。ただしこれを利用して作成された変数に要素を追加するとコンパイルエラー
- super クラス名>・・・そのクラスとスーパークラスを許可
- >・・・どのクラスも許可。ただしこれを利用して作成された変数に要素を追加するとコンパイルエラー
スレッドとジェネリックス
writeメソッドの引数になるのは直列化可能なオブジェクトだけ。直列化可能なオブジェクトとはserializableインターフェースを実装したクラスのオブジェクトの事。その為以下のような書き方になる。
void write(List extends Srializable> list) {・・・}
独自のジェネリックスメソッド記法
構文例
publicvoid func (T t) {};
引数にはextendsを利用して型の範囲を指定できない。
ジェネリックスを使用しないリストの場合
ジェネリックスを使用しない場合、取り出したオブジェクトの型はObject型になる
List list = new ArrayList()
for {Animal a: list} { ←ここでコンパイルエラー
・・・}
定義
public int hashCode()
規則
- equals()で2つのオブジェクトが等価とされた場合、どちらのオブジェクトでhashCode()が呼ばれても、結果は同じ整数値にならなければならない。
- equals()で2つのオブジェクトが非等価の場合、どちらのオブジェクトでhashCode()が呼ばれても、結果は同じ整数値になってもかまわない。
- equals()をオーバーライドしたら、hashCode()もオーバーライドする必要がある。この規則を守らなくてもコンパイルエラーにはならない。
- equals()で等価とされても、一度アプリを終了したら同じ整数値が返されるとはかぎらない
equalsメソッドをオーバーライドしない場合
ObjectクラスのhashCode()が呼ばれる。
注意
transient(一時変数、直列化しない変数)は直列化復元された時、hashコードが変わることがあるので使用しないほうが良い。
定義
public boolean equals(Object obj)
==との違い
==は同じ参照かを比較する
equals()は意味的に同じかを比較する
オーバーライド
クラスでequals()をオーバーライドしないと、Objectクラスのequalsが呼ばれ、==と同じ意味になる
注意
transient(一時変数、直列化しない変数)は直列化復元された時、hashコードが変わることがあるので使用しないほうが良い。
Mapのキーになるクラスはequals()とhashCode()をオーバーライドしないと想定した結果にならないので注意。
Hashtable
- 同期化しているキー値をもnullは不可。
HashMap
- キーをハッシュコードにより管理
- キーにnullは1つだけ許す。
- 値のnullは重複可
- 同期化してない
- equals()とhashCode()をオーバーライドしてない時、既に同じキーが登録されていたら、新しい値に書き換えられてしまう。
- LinkedHashMap
- 順序つきのHashMap
- 要素同士が双方向にリンクしている
SortedMap(マーカー)
- TreeMap
- ソート済みのMap
- ソートはキーが昇順に並べ替えられる。つまり順序が決まっている
HashSet
- ハッシュコードで要素を管理
- 要素の重複は認めず。(ハッシュが同じで、equals()の結果が同じものは2つ登録できない)
- 順序を問わない場合に使用(つまりソートしない)
- LinkedHashSet
- 順序つきのHashSet
- 要素同士がリンクしている
- hashCode()がオーバーライドされていないと、同じ要素を追加した時に、ObjectのhashCode()が呼ばれ別のオブジェクトと判断される。その為、同じようそのものが登録できてしまうので注意
SortedSet(マーカー)
- TreeSet
- ソート済みのSet
LinkedList
- 要素同士が双方向にリンクしている
- 挿入や削除が高速
- 同期化してない
- キューの機能も持つ
PriorityQueue
- 要素に順序あり
- 作成時に引数に指定された順序規則によって整列する。引数無しの場合は自然順。
- 優先度の高いものから処理
- 同期化してない
共通メソッド
メソッド
- offer()・・・引数にしてしたオブジェクトをキューに追加
- peek()・・・キューの先頭にあるオブジェクトを返す
- poll()・・・キューの先頭のオブジェクトを取得して、キューから削除する。何もキューから無くなったらnullを返す。
ArrayList
- ランダムアクセスを実装している。
- 反復処理の速度が速い
- 同期化してない
Vector
- ランダムアクセスを実装している。
- 同期化している
- 古いクラス
LinkedList
- 要素同士が双方向にリンクしている
- 挿入や削除が高速
- 同期化してない
- キューの機能も持つ
- コレクションに対して順番にアクセス(リニアアクセス)を提供
- 拡張For文のカッコ内には利用不可
List, Map,Set , Queueの構造
List
- インデックスで値を管理
- 値は重複可能
- 順序有り
Map
- キーと値を組み合わせて管理
- キーの重複は不可。値は重複可。
- 順序なし
Set
- 重複のないオブジェクトを管理
- 順序無し
Queue
- 待ち行列として管理(プリンタのキューみたいな感じ)
- 値は重複可能
- 順序有り
命名規則
定義(インターフェース)・・・単数形 ex.Collection
実装(クラス)・・・複数形 ex.Collections
集約関係
あるオブジェクトが別のオブジェクトを1部分として所有する関係。=has-a関係=part-of関係
以下のようなものもhas-a
public intarfacace TestA()
public class TestB {
private TestA a; ←ここで実装はしてないが、この書き方はOK
}
- Object型に基本データ型を参照させようとした場合、オートボクシングでコンパイルエラーにはならない
- String型のデータはInteger型に自動変換できない、コンパイルエラー。*コマンドライン引数などで注意
- final修飾子がついているものはオーバーライドできない.
- 引数の情報がまったく同じでないとコンパイルエラー。
JVMがargsオブジェクトを作成するので、ヌルポにはならない。
- 引数の型、個数、並びが一致するメソッドは同一クラス内に複数定義できない。
- 返り値は一致している必要がある。
- アクセス修飾子は何でもかまわない。
メソッド
- run()・・・実行するスレッドの処理を行う。publicで定義されているのでオーバーライド時注意。runメソッドが始まると優先順位の高いスレッドが出来ても終了まで続行、その後スレッドも終了する。
- start()・・・スレッドを実行可能な待機状態にする
*一度実行したスレッドを再び実行することはできない。以下は実行時エラー。
t.start();
t.start();
- sleap()・・・実行中のスレッドを指定したミリ秒一時停止にする。なお時間指定必須。要try~catch文
- yield()・・・現在実行中のスレッドを休止させ、他のスレッドを実行可能にする。
- join()・・・スレッドが終了するまで、他のスレッドを待機させる。要try~catch文
*synchronizedブロックを抜けるとロックが解除されて、実行可能になる
static変数にアクセスする複数スレッドの場合
メソッドの途中でスレッドが切り替わる可能性もある。ので、static変数が中途半端に変更されているタイミングもある。
同じオブジェクトを参照しているスレッドの場合
以下のようなケース
A a = new A();
new thread(a).start();
new thread(a).start();
この場合staticな変数の場合と同じで、両方のスレッドが同じaオブジェクトを参照している。
匿名クラス内でのRunnableインターフェースの実装
public static void main (String args[]) {
Runnnable r = new Runnble() { ←匿名クラス内ではインターフェースだがNewできてしまう。
public void run() {
・・・
}
};
}
同期化
- syncronized(a) {・・・}というブロックではオブジェクトaに対してロックがかかる。文字列を追加する順番などに便利。staticな感じになる。
- syncronizedメソッドでは参照しているオブジェクトのロックフラグを取得する。同じオブジェクトを参照しているスレッドが二つあった時、スレッドaがフラグを取得したらaのrun()が終了するまでスレッドbはフラグを取得できない。
- syncronized() {・・・}の()にはオブジェクトを指定しないとコンパイルエラー。基本データ型はNG。this()この場合そのクラスの指定はOK。
syncronized(A.class) {・・・} という感じで利用
メソッド
- wait()・・・指定した時間が経過するまで待機させる。オブジェクトはロックされている必要がある(synchronizedブロック内かsynchronizedメソッド以外で利用すると実行時エラーになる)。例外処理必須。
- notify()・・・wait()で待機中スレッドを1つ再開する。オブジェクトはロックされている必要がある
- notifyAll()・・・wait()で待機中スレッドを1つ再開する。オブジェクトはロックされている必要がある
- equals()・・・==(同じオブジェクトを参照しているか)と同じ意味。
書式化して文字列を返すメソッド。
- booleanに浮動少数や文字列など、nullとfalse以外のものが入るとtrueになる。警告は出ない。
- 浮動少数てfにnullを指定すると警告が出るが実行可能。nullが表示
空文字列(デフォルト)を区切りにして文字列などを分解できる。
分割されたデータをトークンという。
トークンは適切な基本データ型で取り出される
メソッド
- 次のトークンがあるかないか、どんな型でもをチェック・・・hasNext()
- 次のトークンをInt型として読み取る。読み取った型がintでなければ実行時エラー・・・nextInt()
- 次のトークンがint型であることをチェックする・・・hasNextInt()
- 区切り文字をセット・・・useDelimiter()
Macherクラス
booleanを返すもの
- 入力シーケンスの全体とマッチング・・・mathes()
- パターンとマッチする次の部分のシーケンスを探す・・・find()
それ以外の返すもの
- パターンが見つかった開始位置を返す・・・start()
- パターンとマッチした文字列を返す・・・group()
明日の日付を作る場合
- 今日の日付を取得 Date d = new Date();
- 日付を追加する為のCalenderオブジェクトc生成。抽象クラスなのでgetinstance()でつくる。
- 日付操作のためDateクラスのオブジェクトをCalenderクラスに代入 c.srtTime(d);
- 日付を追加。2で作ったCarenderオブジェクトに日付を足す c.add(Carender.DATE,1)
- 日付をフォーマットする場合はDateFormatクラスのformat()を利用する。ただしformat()クラスは引数の型がdateなのでdに代入する。 d = c.getTime();
- 日付書式にロケールを設定する DateFormat df = DateFormat.getDateInstance(DateFormt.LONG, Locale.ITAlY);
- フォーマットする df = format(d);
指定した日付をDateFormatで読み込む場合
DateFormat.parse()を利用。formatと逆の動きをする
- SerializableなクラスがSerializableでないメンバ変数を持っていた場合、読み書きしようとすると読み書きのメソッドで実行時エラー(NotSerializableException)が起こる。
- 集約されているクラスも直列化される
- スーパークラスが直列化可能な場合は、サブクラスも可能。
直列化されないもの
- transient・・・直列化しないことを指定する。
- static・・・直列化されない
- スーパークラスが直列化可能でなく、サブクラスがSerializableを実装してない場合
直列不可スーパークラスと直列化可スーパークラスを持つサブクラスの直列化読み書きの場合
- 書き込み時・・・直列化の不可のスーパークラスの値は保存されない。
- 読みこみ時・・・直列不可スーパークラスの値はコンストラクタが呼び出され、その値がセットされる。transient指定の時はnullになる。
メソッド
write()・・・引数に入れた文字を書き込む。改行しない。
newRine()・・・改行を入れる
存在しないメソッド
writeLine(), print(), println()
入力
- ファイルオブジェクトを作成する・・・Fileクラス
- ファイルオブジェクトを引数にして、作成できるストリーム・・・FileReaderクラス(1文字ずつ読み込む)
- FileReader(かReader)を引数にして、作成できるストリーム・・・BufferedReaderクラス(文字をバッファリングする)
メソッド
list()・・・ディレクトリにあるファイルおよびディレクトリを文字配列で返す
File(path, FilenName)・・・指定したパス+ファイル名でファイルオブジェクトを作成
exsits・・・ファイルの存在を確認する。
staticなメンバ変数
File.separator・・・環境に依存した区切り文字を追加
- 参照内容は不変。つまり文字列連結などをすると、オリジナルの参照は捨てて、新しい連結された文字列を参照する。
- String型のメソッドなどで操作しても、操作した結果を代入しなければ、オリジナルの文字は変更されない。
- mainメソッドのローカル変数と各メソッドの変数はコピーされ、各メソッドの変数は参照するものが変化する。
- +演算子で文字列を追加できるのはStringだけ。StringBufferなどはコンパイルエラーになる。
int == double(doubleに変換される)
Integer==double(doubleに変換される)
Integer i1 = 10; の場合
intデータを自動的にラッパークラスに変換して、代入できる
Integer型
==・・・同じオブジェクトを参照しているjか
.equals・・・同じint型の値を含むかどうか。意味的に同じならOK。
AutoBoxingの効果
ラッパークラスが自動生成される場合、メモリの効率化のため同じオブジェクトを参照する場合がある。以下の場合。
- true、false
- -128~127の整数
- \u0000~\u007fの文字
初期値
参照型の初期値はnull。null値であるラッパークラスを基本データ型似変換するとヌルポ(実行時エラー)が発生する。
文字列をラッパークラスに変換するメソッド
不変条件、メソッドの事後条件、ロックステータス事前条件などをチェックするのに利用できる。
デバッグ時のみ有効。
構文
- assert 条件式;
- aseert 条件式 : 出力する式;
falseの場合は出力する式を表示し、そこでAssertionErrorが発生しプログラム終了する
コマンドラインでのスイッチ
- 有効化・・・-ea
- 無効化・・・-da
指定の順序はあとのものが有効。ただし範囲を狭める指定(ex. -ea;\:クラス名)がある場合はそちらが有効になる
例外をスローするメソッドを定義する場合は、宣言末端に throws 例外が必要。無いとコンパイルエラー。ただしRuntimeExceptionの場合はthrowsしなくてもいい。
try-catch文
- catchブロックは書かなくてもコンパイルエラーにはならない。ただし例外が起きた場合実行時エラー
- catchブロックでは例外の順序に注意。スーパークラスのexeptionがサブクラスのexceptionより先に定義されていると到達不能コードでコンパイルエラー
- finalyブロックは例外が発生しても、しなくても実行される
式の順序
ex.
for (i = 0; i < 3; i++) {
//iを表示
}
- iを0に初期化
- i<3か条件式をチェック(ここでfalseの場合は終了)
- iを表示
- iに1を足す
- 2に戻る(falseの場合はfor終了)
- 2番目の条件式を書かない→無限ループ
- 2番目の条件式を書かない。かつそのFor文のなかに処理がある→到達不能コードがある場合コンパイルエラー
ジェネリックスと拡張For文
Objectクラスはサブクラスに暗黙的にキャストできない。
List
String型を判定しようとするとコンパイルエラー。
&&・・・左オペランドがfalseだった時、評価終了
||・・・左オペランドがtrueだった時、評価終了
条件式
条件式の部分にはboolean型以外の結果を返すものを入れてはだめ。コンパイルエラーになる。
=(代入)なので注意。
- mein文とかクラスに1つだけあるあるメソッド。
- staticメソッドから同クラスのインスタンス変数、インスタンスメソッドにアクセスできない。インスタンスが存在しないと、インスタンス変数なども存在しえないから。インスタンスを生成してからならアクセスできる。
- staticメソッドないでthisキーワードは使用不可。コンパイルエラー
静的インポート
staticメンバだけをインポートしたい時に使う
- import static パッケージ名.クラス名.staticメンバ;
- import static パッケージ名.クラス名.*;
Arrays(配列を操作する実装)はあるがArray(定義=インターフェース)は存在しない。
配列は下記のとおり明示的に領域を確保する必要がある。確保されていない配列にアクセスしようとするとヌルポになる。領域を確保するのはコンパイル時でなく実行時なので、コンパイルエラーにならない。
ex.
String s[] = null;
s[0] = "Hello";
作り方
- NEWする方法
- 初期値を入れてしまう方法
- データ型 変数名[] = new データ型[] {値1,値2};
ex. float f[] = new float[] {1f, 2f};
*右辺にデータを設定する場合は、要素数を記述できない - データ型 変数名[] = {値1,値2};
ex. float f[] = {1f, 2f};
データ型 変数名[] = new データ型[要素数]
ex. float f[] = new float[3]
使い方
代入する時
当たり前だが宣言した型で代入すること
多次元配列
String s[][] = {{"1","2"},{"3","4","5"},{"6"}}の場合
1次元目が{"1","2"},{"3","4","5"},{"6"}の3つ
ex. s[1][2] ・・・{"3","4","5"}の"5"になる
s[0][2] ・・・定義されていないので、実行時エラー
*配列は0から始まるので注意
拡張for文で使う時
a[] = {1,2,3 };
for (int val: a) {} ←「a[]」と書かないことに注意
宣言
[修飾子] enum 列挙型名 {
要素1、要素2、要素3.・・・
}
利用する時
クラス名.列挙型データ名.データ値
クラス内に定義できるが、メソッド内には定義できない
static変数とも言う。
インスタンスがなくても。クラス名.static変数名でアクセス可。ただし、別パッケージだとpublicなどが必要。
クラスのオブジェクト全体で共有される。
計算時に注意
- メソッド内で局所的に利用される変数。メソッドのブロック内で利用されるブロック変数もこの1種。
- staticは指定できない。
- 暗幕的に初期化できないので明示的に初期値を設定する必要がある。
下に行くほど制限が強くなる
- public・・・どこのクラスからでもOK
- protected・・・同じパッケージか、そのサブクラスからしか呼び出せない。パッケージが違ってもアクセスできるが、インスタンスを生成できない。
- なし・・・同じパッケージ内ならOK
- private・・・そのクラス内のみOK
基本的に実装をもたないabstractメソッドをもつクラス。
実装していてもabstractをメソッドにつけてなければOK。
- abstractクラスにabstractメソッドがなくてもかまわない。
- abstractメソッドにfinalをつけてもコンパイルは通る。意味はないが・・・
クラス内のクラス。
- 外側のクラスのprivateな変数にもアクセス可能
- static変数、staticメソッド、staticクラスの宣言は不可。abstract、finalのみ可能。
ローカルクラス・・・メソッドやブロック内で宣言されたクラス。アクセス修飾子やstaticは指定不可。
継承関係にあるもの
is-a関係=kind-of関係
*インタフェースのとその実装クラスもis-aになる。
継承は1つしか出来ないから、extendsキーワードのあとは1つしか指定できない。
継承してても、親クラスのprivateなメンバ変数にはサブクラスからアクセスできない。
コンストラクタ
- 継承しているとき、サブクラスにもスーパークラスにも引数なしコンストラクタがないと、コンパイルエラー。サブクラスがNewされるとき、スーパーのデフォルトコンストラクタが必要だから。
- サブクラスはスーパークラスのコンストラクタを継承できない。コンパイルエラーになる。
インターフェースで暗黙的に
メソッド・・・public abstract void method();と同じ
変数・・・public static final 実装してもインターフェース内の変数は変更できない。=定数。初期値を設定しないとコンパイルエラー
インターフェースのメソッドは全てオーバーライドする必要がある。もしオーバーライドされてないものがあると、コンパイルエラー。
implementされてるクラスにオーバーライドされてないものがあるときは、クラスをabstractにすればコンパイル通る。
String・・・null
public static String str; public static void main(String args[]) { System.out.println(str); ←の結果はコマンドラインでnullと表示される }
floatに変換OKなもの
- 整数リテラル・・・-1,1、0xb(16進数の11)。規定値はint型
- 文字リテラル・・・'1 '(char型)
浮動少数リテラルだがfloatに変換NGなもの
- 浮動少数リテラル・・・3e-2。浮動少数リテラルはdubbleだから(float)もしくはFをつけてキャストすること
NGなもの
- 文字列リテラル・・・"1"
0~65535
負はだめ
クラス名、変数名の命名規則
1文字目OK・・・英字、$、_(アンスコ)
2文字目以降OK・・・数字
いけそうでダメなもの・・・%
final
末端のクラスを意味する。このクラスを継承して、サブクラスはつくれない
- 予約語・・・基本データ型、メソッドなどの修飾子(publicとか)
- 非予約語・・・クラス名
