■クラス
クラスにはフィールド(変数)とメソッドを含められる
メンバはフィールドとメソッドを言う
メソッドに戻り値を設定すると、呼び出し元に情報を返すことができる
戻り値のないメソッドではvoidを指定する
クラスの中にフィールドはメソッドの中でなくその前に書く、メソッド内の変数はローカル変数になる
Car car2 = new Car(); クラス名 オブジェクト名 = new コンストラクタ名(引数);
■カプセル化データを一纏めにしメンバを保護する
privateを指定すると、クラスの外からメンバにアクセスできない
publicを指定すると、クラスの外からメンバにアクセスできる
protectedを指定すると、同パッケージと別パッケージのサブクラスからアクセスできる
無指定は、同パッケージからアクセスできる
※finalはオーバーライドできなくする
■オーバーロード(重複呼出)によるポリモーフィズム多態性
同クラス内のメソッドを同じ名前で複数定義し、呼出しの引数がアレの場合だと処理はコレとメソッド名で纏められる
引数の型・個数は異なるようにする必要がある、引数の順番の違いも別のメソッドにできる
◎オーバロードとなる=void sampleMeth(int a,String b), void sampleMeth(String a,int b)
戻り値の型を変えただけではオーバーロードにならない、どちらで処理するか判断できずエラーになる
×オーバロードとならない=void sampleMeth(int a), int sampleMeth(int a)
自動的に引数に応じたメソッドが処理される
■コンストラクタ
コンストラクタ名はクラス名と同じである必要がある、戻り値はない
オブジェクトを作成するときに自動的に処理される、初期値を設定する目的がある
コンストラクタもオーバーロードさせることができる、引数の違いで処理を変えられる
引数のないコンストラクタをデフォルトコンストラクタと言う
this()を使うと別のOverLoadするコンストラクタを呼び出せる、重複したOLの箇所を纏められる、this()は必ず先頭
publicやprivateを設定でき、OLでアクセスするConstrctを制限でき、引数ありのConstrctのみpublicに等できる
■オブジェクト変数/メソッドとクラス変数/メソッド
インスタンス毎に値が違うのがインスタンス変数で、共有し同じなのがクラス変数
クラス変数、クラスメソッドにはstaticを付ける、オブジェクト間で共有されている obj.varでなくclass.varで使用する
クラスメソッド内ではそのクラスのインスタンス変数/メソッドは使えない、objの生成なしでも呼出ができる class.meth()で使用
インスタンスメソッドは、そのクラスのインスタンス変数/メソッドを使える obj.meth()で使用
インスタンス変数はコンストラクタで設定されたインスタンスに対する操作/データ
オブジェクトごとに値があるインスタンス変数、オブジェクトが作成されると値を代入できる
インスタンスメソッドはオブジェクトが作成されないとアクセスできない
this.はインスタンスメソッド内で使える、クラスメソッドではオブジェクトがなくても呼び出せるため
メソッド内だけで使用され呼出し毎に初期化されるような変数をローカル変数
フィールドにfinalを付けると値を変更できない定数constantになる、static final int NUM = 1;
■クラス型の変数(対義語は基本型の変数)
クラス型の変数にオブジェクトを代入しても、コピーではなく同一objを指す。1つのobjを複数の変数で扱うことがある
クラス型の変数にnullを代入すると、objは破棄され、メモリが解放される(ガベージコレクション)
オブジェクトが破棄されるときにはfinalize()というメソッドが呼び出される、GCはJavaが判断するのでタイミングは管理できない
メソッドの引数にクラス型(参照渡し):呼び出し先と元が指すのは同じobj
メソッドの引数に基本型(値渡し):コピーが渡され、呼び出し先と元では異なるものになる
■継承
サブクラスのオブジェクトを作成時にスーパークラスの引数の無いコンストラクタ or サブクラスのコンストラクタ内で引数を明示したスーパークラスのコンストラクタ、super(n,m)が実行される(明示したスーパークラスのコンストラクタを呼び出した場合は、スーパークラスのデフォルトコンストラクタは呼び出されない、そのデフォルトコンストラクタ内でthis()しておく必要がある)、super()はコンストラクタの必ず先頭、super()とthis()は同時に記述できない
スーパークラスのprivateメンバーにはサブクラスからはアクセスできない、protected以上が必要
具象クラスになるには全てのメソッドを定義する必要がある
全てのメソッドを実装できない場合は抽象クラスになる
finalを付けると拡張できない、final class Car{
多重継承できないので親は一つ、サブクラスはスーパークラスを一つしか持てない、複数の場合はinterfaceを使う
スーパークラスを指定しない場合はObjectクラスを暗に親に持っている、なのでobj.toString()やobj.equals()などが使える
継承の階層は何階層でも継承できる
メンバは継承されprotected以上であれば子から直接使用できる、car.gas(クラス名.変数名)でなくgasで可、privateの場合はsetter/getterでアクセスする
継承時にメンバ変数名、メソッド名が重なったら、インスタンス化されたクラスから最も階層が近いスーパークラスのものから繰り上がり探し採用されます。つまり、継承時に既存のメンバ変数、メソッドを変更することが出来ます。
■オーバーライド
オーバーライド(重複継承)はクラス間の継承によるメソッドの上書き、サブクラスのメソッドに同じメソッド名・引数で上書き
親や子から名前を覚えていなくても適切なメソッドを探してくる仕組み
finalをつけたメソッドはオーバーライドされない public final void show(){
スーパークラスの変数を使いサブクラスのobjを生成することもできる、但しサブクラス固有のメソッドは呼び出せない、スーパークラスのobj(インスタンス変数/メソッド)を基本にオーバライドを反映したものを使用できる、クラス変数/メソッドは関係なく使える
逆にスーパークラスのメンバーを使いたいときは、スーパークラスのオブジェクトを生成する、or super.show()
例)Class RaceCar extends Car
Car car1 = new Car(); car1.show(); → Carクラスのshow()
Car car2 = new RaceCar(); car2.show(); → RaceCarクラスのshow() car2.raceShow()は固有なので呼出せない
RaceCar car3 = new RaceCar(); car3.show(); → RaceCarクラスのshow()
RaceCar内 super.show() → Carクラスのshow()
RaceCar内 super.x → Carクラスのフィールドx
■抽象クラス
オブジェクトを作成できない、継承される目的がありテンプレート、未定義のメソッドを持つ
抽象クラスを継承したサブクラスは全ての"未定義の"メソッドを定義しなければならない
これらはサブクラスの見本としての抽象クラスだということを担保している
publicでも可だがpublicにしていても外部から呼び出せないので(抽象クラスはインスタンス化できない)protectedに
フィールドは定数だけでなく変数や処理を定義したメソッドも持てる
abstract class Vehicle{
abstract void show(); ←中身を定義していない抽象メソッドを持てる
abstractはクラスなので多重継承ができない
抽象クラスでは、サブクラスに共通する必要なインスタンス変数を指定できる
抽象クラスでは抽象メソッドだけでなくサブクラスが共通して持つメソッドの中身も定義できる
■インターフェイス
何の機能をサブクラスで持たせているか、クラス間でIFを見れば分かるような仕組み
コンストラクタを持たない、オブジェクトを作成できない
多重実装ができる、class Car implements Engine, Wheel{、CarはEngineとWheel両方のメソッドを全てOverrideして定義が必須
フィールドは全て変更できない定数、public static finalを付けているのと同じ(自動的に付与されるので修飾子を省略できる)、必ず初期化する
メソッドは全て中身を定義しない、abstractを付けているのと同じ(自動的に付与されるので修飾子を省略できる)
IFを実装した具象クラスはIFの全てのメソッドを定義しなければならない(実装できないなら実装クラスでなく抽象クラスとしてabstract宣言しなければならない
IFを継承継承したIFを作れる interface sub extends super1, super2{
■メソッド
宣言例) static final void methName(String[] arg){}
staticはクラスメソッドを表す obj.meth()でなくclass.meth()で使用する
メソッドにも型が必要、voidやintなど
void :戻り値がないという型宣言
引数にも型が必要
voidでなければreturnが必要
ctrl+メソッド呼出をクリック メソッドを記述しているコード表示する
■Getter、Setterの生成
メニュー>ソース>GetterおよびSetterの生成>変数にチェックを入れる、デフォルト
Setter:フィールドに引数の値を設定するメソッド(処理を入れることが多い)
Getter:フィールドの値を取得するメソッド(基本取得するだけ)
アクセッサー:setterとgetterを合わせたものを言う
カプセル化(obj変数のprivate化)ため直接アクセスできないためオブジェクトになるクラスにアクセッサーを付与しインスタンス変数にアクセスする、obj.varでなくobj.getsetVar();
■パッケージ
1クラス1ファイルに分けるのが管理上よいが、そうするとパッケージが必要になってくる
クラスを宣言する前つまり最初にどのパッケージに含まれるか宣言するpackage Pc;
publicをつけたクラスは1ファイルの中に一つだけしか作成できない、そのファイル名はpublicをつけたクラス名と必ず同じにする(公開しているということがファイル名で分かる)
他のパッケージから使用されるにはpublicを付ける、public class Car{、publicを省略した場合は同パッケージからしか使えないクラス
パッケージ.クラス名();で異なるアクセスする、完全クラス名 pc.Car obj = new pc.Car();
import パッケージ名.クラス名; を宣言するとパッケージ名を省略できる import pc.Car; Car obj = new Car();
別パッケージの時publicでないクラスはimportできない、publicでないメソッドは呼出せない
java.langパッケージだけは、インポートしなくてもクラス名だけで使用できる、Stringクラスなど
packageを指定しないファイルのクラス群は[名前のないパッケージ]に含まれると考える
パッケージは階層を作れるが上下関係はなく別々のimportが必要、import java.awt.*; import java.awt.image.*;の複数必要
下の階層のパッケージをサブパッケージという package pa.subpa;
パッケージによって分けられているクラスの集まりを名前空間という
同じクラス名のものをimportしようとすると先に指定した方が採用される
■クラスの修飾子とメンバーの修飾子が違う場合
クラス内部でしか利用すべきでないメソッドはprivateやprotectedにする(同クラスのコンストラクタやメソッドだけで使われる)、mainフローでobj.meth()は使用できない
そもそもpublicでないクラスはimportできない
privateなクラスはない・無指定かpublic
上位従属、クラスが不可視ならそもそもメンバ自体が見えない、クラスの制限はメンバーにも基本的に掛るイメージ
publicでない不可視なクラスのpublicなクラスメソッド(パッケージ外)は、同パッケージ以外から使えない(上位従属)
publicなクラスの無指定メソッドは同パッケージ以外から使えない、クラス/メンバーともにpublicに指定する必要がある
publicクラス内のprivateメソッドは同クラスのコンストラクタやメソッドだけで使われる
privateなコンストラクタはクラス外から使用できない、クラス内のコンストラクタのオーバーロードでのみ使用される、protectedならサブクラスのコンストラクタ内でsuper()で使用できる
---クラス(抽象クラスを含む)・メンバ・コンストラクタ・インターフェイス
無指定 同パッケージからOK
public パッケージ外からOK
---メンバ・コンストラクタは以下も指定できる
private 同クラス内のみOK
protected 同パッケージ&継承したサブクラスからのみOK
---クラス・メンバにはfinalも
final 変更ができない(クラスは継承不可、メソッドはオーバライド不可、変数は定数化)
定数の時は定数名を大文字を推奨、NUM_TIRE
abstractとfinalは両立できない
constractorにfinalを付けられない
■設計
オブジェクトに関する制限は基本的にそのクラスの中に書く(メインフローに記述しない)
クラス、メソッドにはpublicを基本付ける、(そのクラスをインポートできる、メソッドもどこからでも使える、privateメソッドで隠すことも可)
オブジェクト変数は基本的にprivate/protectedにする(そのクラスにフィールドにアクセスできるメソッドを定義しカプセル化する、getter/setterでアクセスする、protectedなら直接アクセスできる)
コンストラクタでメンバーに初期値を設定してあげる
なぜインスタンスが必要なのか?インスタンスを作成する理由は同じクラスから複数のインスタンスを生成するため、全く同じインスタンスを作るのではなく、共通部分を規定している
■オブジェクト指向
abstract/class --<implements>-- (複数)interface --<extends>-- (複数)interface
|
(extends :継承を繰り返し階層を作ることができる)
|
class --<implements>-- (複数)interface
↓
(複数)object
●interface(中身はない)⇒見る-視覚
●abstract⇒人
●class⇒日本人
●class⇒東京都民
●object⇒山田さん、田中さん
■エラーの設計方法の一つ
親クラスを通して細かな制御を子クラスで行う
public class InputEcxeption extends Exception{
protected String message;
public String getMessage() {
return message;
}
}
public class Keta extends InputEcxeption{
public static void ketaEquals(String key, int keyLength, String message)throws Keta{
if(key.length() != keyLength){
Keta obj = new Keta();
obj.message = message + "は" + keyLength + "で入力して下さい";
throw obj;
}
}
}
//メインフロー
try{
String str = br.readLine();
Keta.ketaEquals(str, 2, "分類コード");
}catch(InputEcxeption e){
System.out.print(e.getMessage());
}
エラーの出る処理を纏めてメソッドを作成
try {
orderSet(order);
} catch (NumberFormatException e) {
errPath = "/error/NumberFormatError.html";
} catch (rangeErr e) {
errPath = "/error/InputOrderError.html";
}
private String orderSet(String order) throws rangeErr,NumberFormatException{
//数値を取得
int num = Integer.parseInt(order);
//範囲内の入力かをチェック
if (num > 100 || num < 1){
rangeErr re = new rangeErr();
throw re;
}
return num + "枚<br>\n";
}
class rangeErr extends Exception{
rangeErr(){}
}
■staticのクラス変数の使い方の一つ
インスタンス化コンストラクタ不要なので簡易にハッシュマップnewをして値を保持する
public class AutoNumber {
private static HashMap<String,Integer> map;
public static int getNumber(String key){
if(map == null){
map = new HashMap<String,Integer>();
}
Integer iNum = (Integer)map.get(key);
if(iNum == null){
iNum = new Integer(0);
}
int num = iNum.intValue();
num++;
map.put(key, new Integer(num));
return num;
}
}
■Book型ではなくObject型を渡す、Book型でなくObjectでもBook型でも可、java.lang.Object。
Object クラスが全てのクラスのスーパークラスなので、この型の変数は任意のクラス型の変数を代入できます
public class Check extends InputEcxeption{
public static void checkSerchBook(Object book)throws Check{
if(book == null){
Check obj = new Check();
obj.message = "その書籍番号は登録されていません";
throw obj;
}
}
}
//メインフロー
try{
Book book = (Book)map.get(bookId);
Check.checkSerchBook(book);
}catch(InputEcxeption e){
System.out.print(e.getMessage());
}
■キャストをすればスーパークラスの変数を通したObjでもサブクラス固有のメソッドも呼び出せる
参照している実体はサブクラスからのものでも、変数の型によって見える範囲が異なるだけ。しかし、見えていないだけで、参照先の実体は getMasKo() も持っているので、キャストにより変数の型を変えるだけで利用できるようになる
class TestCastObj {
public static void main(String[] args) {
Ko objKo=new Ko();
Oya objOya=objKo;
objOya.getMsgOya();
//無理 objOya.getMsgKo();
Ko objOyaToKo;=(Ko)objOya;
objOyaToKo.getMsgKo();
}
}
class Oya {
void getMsgOya() {
System.out.println("親クラス。");
}
}
class Ko extends Oya {
void getMsgKo() {
System.out.println("子クラス。");
}
}
■無名クラス
obj = new 継承するクラスorインターフェイス名(){ };
c = new Car(){ public void show(){ --- } };
c.show();
メソッド内で他のクラス/インターフェイスのメソッドを使うものだけオーバーライドして使う。クラスとしてファイルで扱うのではなく、必要なメソッドだけ定義して即席使用にメリットがある
java webアプリケーション プログラミング サーブレット JSP データベース DB ゲーム script ダウンロード sun 入門 講座 vm eclipse アプレット ジャバザハット コンチェ ブーシ クラス メソッド コンストラクタ 実装 スプリクト アプレット オブジェクト 呼び出し 初歩 例外 リシュモン コンパス 入門 プログラミング 言語 スウォッチ 変数 bufferedreader stringbuffer stringtokenizer extends inputstream hashmap javaworld synchronized applet class equals iterator tostring boolean resultset applets constructor javadoc specified implements arraylist interface hashtable arrays documentation jfilechooser 遅い exceptions vector tutorial import
|