カテゴリー
Java

クラスの継承について知ろう

この章ではクラスの継承について説明します。
クラスの継承とは親クラスの他に、もう1つの関連したクラスを作ろうとした時に親クラスのフィールド変数やメソッドを引き継ぐことを言います。
親クラスとは継承の基本となるクラスで、このクラスを基本に他のクラスが親クラスのフィールド変数などを使うことになります。
もう1つの関連したクラスのことを子クラスもしくはサブクラスと言います。
親クラスと同じフィールド変数やメソッドを子クラスで使わなくてはいけない時、同じフィールド変数やメソッドを子クラスで再度記述する必要はありません。
また、子クラスでは独自のフィールド変数やメソッドを追加することもできます。
このように親クラスに使いたいメソッドとフィールド変数があって、さらに子クラスに新たなメソッドやフィールド変数を加えたい時にクラスの継承を使います。
継承の構文は以下の通りです。1 では例を見てみましょう。
次の例は親クラスの「Banksystem.java」です。111111 次の例は「Securities.java」です。11111 結果は以下の通りです。1 ではクラスの継承について説明します。
この例の継承は以下の箇所です。スペースの都合で2行で書いていますが、通常は1行で書きます。1 親クラスがBanksystemクラスで、子クラスがSecuritiesクラスです。
子クラスは親クラスのフィールド変数やメソッドを継承できるので親クラスのメソッドや変数を以下のように使うことができます。1 子クラスのSecuritiesクラスのオブジェクトを作成しているのにも関わらず、setNameメソッドなど親クラスのメソッドを使うことが出来ているのが分かります。
子クラスでは親クラスのフィールド変数やメソッドを使うだけではなく、子クラス独自のフィールド変数やメソッドも作成することが出来ます。
それがcompany変数、companyBanknameメソッド、stockbuyメソッド、stocksellメソッドです。
Securitiesクラスのmainメソッドで以下の通り、子クラスのメソッドとプロパティを実行しています。1

次にオーバーライドについて説明します。
子クラスで改めて親クラスのメソッドやフィールドを書く必要はありませんが、この例では1つだけ親クラスと共通のメソッドを子クラスで書いています。
それはresultメソッドです。11 このように子クラスと親クラスで同じ名前のメソッドを作ることが出来て、子クラスのメソッドでは内容だけ親クラスと違う内容で書くことができます。
これをオーバーライドと言います。
この例では親クラスのresultメソッドの中の1を子クラスのresultメソッドで1に変更しました。
では次に進みます。
親クラスでprivateが付いているフィールド変数やメソッドは子クラスでは使用することはできません。
この例の親クラスのフィールド変数のアクセスレベルにはprotectedが付いていますが、このアクセスレベルをprivateに書き換えると以下の通りになります。1 このようにprivate指定したフィールド変数は次のように子クラスから親クラスのフィールド変数にアクセスすることはできません。1 ですので、この例では以下のようにprotectedを付けて、子クラスでも使えるようにしています。
protectedは子クラスから親クラスのフィールド変数やメソッドにアクセスできることを意味します。1 [補足]
フィールド変数に直接、値を入れるのではなく、メソッドで値をチェックしてから値を入れるのもいいでしょう。
例では以下のようなメソッドでフィールド変数に値を入れています。
ここでは名前に何も入力していない場合は「カラ」と、出力するようになっています。1 また、以下のgetNameメソッドはsetNameメソッドで得たmynameの値を返すためのメソッドです。1 setNameメソッドは値をセットするためのメソッドで、getNameメソッドは値を返すためのメソッドです。
このようにフィールド変数に値をセットしたり、値を返したりするには「値をセットするためのメソッド」「値を返すためのメソッド」と別ける場合が多いです。
値をセットするためのメソッド名は先頭にsetを付け、値を返すためのメソッドは先頭にgetを付けるのが慣習になっています。

もう1つ継承の例を見てみましょう。
次の例は親クラスの「Vehicle.java」です。111 次は継承クラスの「Used.java」です。1111 結果は以下の通りです。1 この例では以下のようにVehicleクラスを継承したusedクラスを作成しています。
class Used extends Car{
}

次に継承におけるコンストラクタの動きについて説明します。1 =>子クラスであるUsedクラスのオブジェクトが作られた時にはまず初めに自動的に親クラスの引数の無いコンストラクタが呼ばれます。
その後に子クラスのコンストラクタが呼ばれることになります。
つまり親クラスに引数のあるコンストラクタだけで、引数の無いコンストラクタが無い場合はエラーになります。
この例では以下の通り、引数の無いコンストラクタも引数のあるコンストラクタも両方書いてあるので問題ありません。1 自動的に親クラスの引数の無いコンストラクタが呼ばれると書きましたが、では親クラスに引数の無いコンストラクタが無い場合にエラーになるのだとしたら、どう対処したらいいでしょうか?
方法は2つありますが、一つ目の方法は先ほど説明した通り、親クラスに引数の無いコンストラクタを作る方法です。
二つ目の方法は子クラスのコンストラクタの中で1を使う方法です。
では例をみてみましょう。
次の例は親クラスの「Vehicle.java」です。11
次の例は子クラスの「Used.java」です。1111 以下の箇所がsuperを使用した箇所です。1 superとは親クラスのことであり、子クラスのインスタンスメソッドやコンストラクタの中で親クラスのフィールド変数、メソッド、コンストラクタに接続することが出来ます。
この例は子クラスのコンストラクタの中で親クラスのコンストラクタを呼び出しています。
super()を使って親クラスのコンストラクタを呼び出す時には、子クラスのコンストラクタの中の1行目に書いてください。1 次の図の通り、superは親クラスのコンストラクタを呼び出して親クラスのフィールド変数に値を代入しています。
「フェラーリ、10、5」は親クラスのフィールド変数に入り、「60000、あり」は子クラスのフィールド変数に入ります。
ですので、コンストラクタの数は5つ必要です。1 super()を使うことで親クラスに引数の無いコンストラクタを書く必要がなくなります。

カテゴリー
Java

クラスについて知ろう

今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆などをつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」「ふるまい」があります。
例えば、鉛筆であれば「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」をメソッドで書くことになります。
その「状態」や「ふるまい」に指示を出すのはオブジェクトです。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
では以下のHairDryerクラスで説明します。
以下の例ではクラスの大まかな事だけを説明します。11 クラスの基本構文は以下の通りです。1 アクセルレベルとはpublicの部分ですが、どのクラスからでも接続出来るクラスを作る場合にpublicにします。
「class クラス名」のようにpublicを付けなかった場合はパッケージ内部からは接続できますが、外部からは接続できないクラスを作ることができます。
パッケージについては「パッケージについて知ろう」で説明します。
クラスに指定できるアクセスレベルは11の2つのみです。

次はフィールド変数について説明します。
クラスの中に書かれた変数をフィールド変数と言います。
フィールド変数の基本構文は以下の通りです。1 先ほどの例の中では以下の部分がフィールド変数です。1 例えば
public int temperature;は温度の設定
public int wind;は風の強さ
public int price;はドライヤーの値段を決めるなどと仕様を決めます。

次はメソッドについて説明します。1 HairDryerクラスのメソッドはshowTemperatureですが、これは温度を表示するメソッドです。
このように必要なメソッドを自身で作成していきます。

次にアクセスレベルについて説明します。
111 HairDryerクラスのフィールド変数やメソッドにはpublicが付いていますので、すべてのクラスでフィールド変数やメソッドを使用することができます。

次はオブジェクトの作成方法について説明します。
先ほど、「状態」や「ふるまい」に指示を出すのはオブジェクトです。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出しますと書きましたが、そのオブジェクトの作り方を説明します。
通常はmainメソッドの中にオブジェクトを作成します。
オブジェクトの基本構文は以下の通りです。
オブジェクト変数名は変数での命名規則に従って、名づけを行います。
このオブジェクトはインスタンスとも呼ばれています。1 ではオブジェクトを作っていきます。
オブジェクトはnew演算子を使って作成しますがHairDryerクラスでは以下のようにオブジェクトを作成しています。
このオブジェクト変数から、様々な指示をフィールド変数やメソッドに出していきます。1 普通の変数は1のように型名を先頭に付けて宣言しますが、オブジェクトを作成する時にはクラス名を先頭に付けて宣言しますので、クラスはクラス型と思ってください。
次はクラスの中のフィールドやメソッドにデータを入れる方法について説明します。
フィールド変数には以下の形式でデータを入れます。1 この例ではオブジェクト変数がmachineなので、1のような形式でデータを入れていきます。
次はHairDryerクラスのメソッドを呼び出す方法について説明します。
以下の構文でメソッドを呼び出します。1 HairDryerクラスのshowTemperatureを呼び出すには1と、記述します。
では実際にクラスの例を見てみましょう。111このプログラムは銀行でのお金の入金や出金のシステムを簡潔に作っています。
1の箇所でGinkou22クラスのオブジェクトを作成していますので、ここから指示を出していきます。
次の箇所でデータを入れています。1 図にすると以下のようにフィールド変数にデータを入れています。1 もう一つフィールド変数にデータを入れる方法がありますので次で紹介します。
それは次のように初めからクラスの中のフィールド変数にデータを入れておくことです。1
では次はメソッドにデータを渡してみましょう。
mainメソッドの中の次の箇所でメソッドにデータを渡しています。1     
具体的には1 という形式で、Ginkou22クラスのメソッドにデータを渡しています。1 このメソッドはインスタンスされてから実行されているのでインスタンスメソッドと呼ばれています。

次はthisの意味について説明します。
プログラムの中にthisと言う文字がありますが、thisはインスタンスメソッド もしくは これから説明するコンストラクタの中で使用され、オブジェクト自身を指します。
例えば使い方はインスタンスメソッドの中でフィールド変数名とローカル変数名が同じ時にフィールド変数を指し示す場合などに使います。1 上の例で説明しますとフィールド変数であるkingakugoukeiとnyuukinメソッドの中の引数が同じ名前ですが、フィールド変数であるkingakugoukeiを指し示すときにthisを使います。
この例のようにフィールド変数とローカル変数の名前が違えば特にthisは付ける必要はありませんが、付けても問題ありません。
では次の箇所の説明に入ります。1 =>このtoStringメソッドはObjectクラス(「クラスについての雑学を知ろう」で説明します)で規定されているメソッドですので、それを自身のクラス(Ginkou22クラス)でオーバーライドして使っています。
オーバーライドとは同じメソッド名のメソッドを「内容を変えて引き継ぐこと」を言います。
toStringメソッドは少し特殊で1で出力するときには1を省略できます。
つまり、例では以下のように書いていますが、1 以下のようにtoString()を付けなくても同じ意味になります。1 結果は以下の通りです。1
次の例に進みますが、クラスを2つに分けています。1つは通常のクラスであるGinkou109で、もう一つはmainメソッド専用のMain190クラスです。
2つのクラスファイルを別々にコンパイルした後に、Main190クラスを実行すると結果が表示されます。
このようにクラスは分けることが出来ます。111 次の例は「Main190.java」です。1 この例では「コンストラクタ」について説明します。
これまでは以下のように1つ1つデータを入れていましたが、銀行のシステムでこの中のどれか1つでもデータを入れ忘れたら大変なことになります。1 しかし、コンストラクタと呼ばれる機能を使うことによって、オブジェクトを作成時に自動的にデータをフィールド変数にセットすることが出来ます。1 コンストラクタには戻り値の型は書きません。
例では以下の箇所がコンストラクタです。1 ではコンストラクタのアクセスレベルの説明を始めます。11
次はコンストラクタを呼び出す方法について説明します。
コンストラクタの呼び出しは以下の通り書きます。1 この例では以下の箇所がコンストラクタの呼び出しの箇所です。1 このように書くことでインスタンスの過程で1000、五十嵐銀行、近藤栄治の各データがそれぞれコンストラクタの111にセットされることになります。1 実はコンストラクタを明示的に作成しない場合はJavaが自動的に引数やデータがカラのコンストラクタを作ってくれます。
例を見てみましょう。111 コンストラクタを書かない時にJavaは引数もデータもない以下のようなコンストラクタを暗黙的に作成します。
この場合のコンストラクタは暗黙的に作られるので、明示的にプログラム上に書くわけではありません。これはデフォルトコンストラクタと呼ばれています。1 例えばこの例では以下のデフォルトコンストラクタが作成されます。1 super()とは親クラスのコンストラクタを呼び出すという意味ですが、次章でクラスの継承を説明するので、その時に詳しく説明します。
次の例ではコンストラクタの注意点について説明します。1111 では説明を始めます。
1のように引数のない形式でオブジェクトを作っているにも関わらず、次のように引数のあるコンストラクタだけを作ってしまうとエラーになります。1 1つでも引数のあるコンストラクタを作ってしまうと、デフォルトコンストラクタが作成されませんので注意してください。
このためにも、引数有りのコンストラクタ作る時には、引数無しのコンストラクタも次のように作ってください。1 では例をみてみましょう。1111 結果は以下の通りです。オブジェクトが2つありますが、具体的な説明は次の例で説明します。1 しかし、上の2つのコンストラクタの書き方は同じことを2回書いているのであまり、いい書き方とは言えません。1 そこで以下の箇所をスマートに書き換える方法について説明します。1 上の例を書き換えると以下のようになります。1 ではこの箇所のthisについて説明します。
this(引数1,引数2…..)と書くことで引数のあるコンストラクタを呼び出すことが出来ます。
thisの中の引数は引数のあるコンストラクタの引数の数や型を合わせてください。
ちなみに今まで使用してきた1とは似ていますが、違うものです。

では次に進みますが、今度は複数のオブジェクトを実行する方法について説明します。
次の例は「Ginkou333.java」です。111 次は「Main2.java」です。1 このようにオブジェクトは何個でも作ることが可能です。
例ではGinkou333クラスのaとbの2つのオブジェクト変数を作成しています。1 1は引数が無いので以下のコンストラクタが適応されます。11 は引数があるので以下のコンストラクタが適応されます。1 結果は次の通りです。1

カテゴリー
Java

班を分けるプログラムを作ろう

このプログラムはユーザーに任意の人数を入力させて、それを元にグループ分けを行うプログラムです。
このプログラムは長くて難しいので、初心者の方は飛ばしていただいて結構です。
では例をみてみましょう。111111111111
流れは以下の通りです。
人数を入力=>人数分の名前を入力=>班数を入力=>班に人を割り当てる。
結果は以下の通りです。1
では詳しく説明していきます。
〇 mainメソッドの外にメンバーを格納するための配列を作成しています。1 mainメソッドの外で宣言する変数や配列はクラス内のどこからでも使用することができます。
staticについては「staticについて知ろう」の章で説明します。

〇以下の箇所では人数を入力させていますが、もし、正しくない数値を入力するとwhileで何回も×が表示されることになります。1 whileの中の条件式にtrueを入れていますが、条件式の中にtrueを入れると無限ループになります。
無限ループとは今までの繰り返し文のように条件式がfalseにならないので、どこまでもループを繰り返します。
無限ループなので、どこかでbreakで抜けなくてはいけません。
MemberNumbersメソッドは正しく人数が入力されているかをチェックするメソッドですが、条件式がtrueであればbreakで抜けることが出来ます。
このようにifの条件式にメソッドを入れることが出来ることを覚えておいてください。
以下のように数字とは関係ないaなどを入力をすると×が出力されます。1 ではMemberNumbersメソッドについて説明します(スペースの都合で仮引数を2行目に書いています)。1 ユーザーに入力させた人数がlineに入っていますので、このlineの値が仮引数の1に渡されます。ユーザーに入力させたものは文字列なのでこれを整数に変換します。
これを行っているのが1です。
1については「if文で星座を判定しよう」で説明しましたので、忘れた方は見直してください。
そして、もちろん0人より多い数が入っていなくてはいけませんので、0より大きい数値が入っているのかを確認するために1を記述しています。
もし、0より大きい数値が入っているのならばTRUEを返し、breakで抜けます。1 そうでないのならばFALSEを返しますので、whileの中のif文はスルーされ1を実行します。さらにwhileの先頭に戻って「人数入力」と出力されます。
正しく入力されないと何度でも「人数入力」と出力されますが、これがwhileで無限ループを使用している理由です。

〇次の箇所では人の名前の入力を行います。1 では説明を始めます。1 この箇所では人数分の配列を作成します。
numbers にはlineの値を整数値に変換した数値が入っています。
そして、for文で1の要素の数だけ回し、名前を入力させます。
そして1の箇所ではisEmptyメソッドを使って、文字列がカラかどうかを確認します。
そしてカラではないならばlineをmembers配列に入れます。
もし空(未入力)であるならば1という形式でmembers配列に入れます。
そして1でカウントアップします。
つまり、無名の人数をカウントしています。
ではさらに詳しくisEmptyメソッドについて説明します。1 isEmptyメソッドは文字列がカラかどうかをチェックするメソッドです。
カラであればTRUE、カラでなければFALSEになります。
この例では否定の「!」が付いていますので、カラではない時にTRUEになります。
ここまでは例えば以下のようになります。1
〇以下の箇所ではグループの人数を入力します。1 GroupNumbersメソッドでグループの人数が正しく入力させているかどうかをチェックします。
正しく人数が入力してあればbreakで抜けます。
ではGroupNumbersメソッドの説明をします(紙面の都合でメソッドの引数を2段目に書いています)。1 引数のlineには班数が入り、 memberNumbersにはメンバーの人数が入ります。
次に以下の箇所を説明します。1 ここでは班数は0より大きく、なお、班数はメンバーの人数と同じか、小さくないといけませんのでこのような条件式にしています。
この条件式に合致していればTRUEになります。

〇以下の箇所ではメンバーをシャッフルしています。
なぜなら、毎回同じ班分けになってしまうと意味が無いからです。
shuffleMembers();
以下のメソッドでメンバーをシャッフルします。1 ここでは30回シャッフルするためにshuffleTimesには30を入力しています。
shuffleTimesの前にfinalが付いていますが、以下のような役割があります。1 次に以下の箇所の説明をします。1 ここではメンバーの人数までの数値をランダムメソッドで変数に入れています。
例えば1が5であれば0から4までがランダムにrndm1とrndm2に入ります。
次に以下の箇所の説明をします。1 ここではランダムに入力されたrndm1や rndm2を元にswapMemberメソッドを呼び出します。1 このswapMemberメソッドは何をしているかと言いますと、例えばaという変数とbという変数を交換しているわけです。
以下の例で説明しますとaとbを交換するのに以下のプログラムでは交換にはなりません。1 つまり、aもbもbの値で上書きされるので6になってしまいます。
aとbを交換するには以下のプログラムを使います。1 aとbを交換するには一時的にどちらかの変数を他の変数に入れておかないといけません。それがtmpです。
この例ではaをtmpに入れています。これによりaの値が上書きされないで済みます。
では例に戻りますが、このswapMemberメソッドのidx1とidx2にはランダムに入力された数が入っていますので、members配列の中の順番を逆にできるわけです。
この作業をshuffleTimesの数である30回行うわけですから、配列の中の順番はかなりランダムに変えることが出来ます。

〇次に以下の箇所の説明をします。1 ここで行いたいことは次の赤枠の箇所です。
結果を出力するのはこの箇所ではありませんが、ここではグループ分けを行っています。1 では具体的に説明をしていきます。1 ここでは班数の分だけgroups配列の要素を作成して、その要素を1で初期化しています。
次は以下の箇所の説明をします。1 この箇所はすべてのメンバーをグループに振り分けています。
「i % groups.length」の箇所はメンバーが4人で班が3だとするとループするごとに以下のように回ります。1 groups[targetIndex]のなかのtargetIndexには0,1,2,0が順番に入るわけです。
つまり、ループするごとに1に該当するメンバーが左辺の1に入ります。
メンバーが4人でグループが3の場合には1周目で例えば1という形式で1に入ります。
2周目では11に入り、
3周目では11に入り、
4周目では1という形式で1に入ります。

〇最後にfor文でgroups変数を出力すると例えば以下のようになります。11 名前を入力しなけれは無名1、無名2と、無名の数だけ表示されます。1

カテゴリー
Java

文字列を操作するメソッドを知ろう

この章では文字列に関するメソッドについて説明します。
先ほどは自身でメソッドを作成しましたが、ここで説明するメソッドはJavaであらかじめ用意されているメソッドです。
Javaのメソッドの仕組みはエクセルの関数の仕組みと意味は同じです。
エクセルをご存知の方はわかると思いますが、例えばエクセル関数にSUMと言う関数が有りますが、この関数は指定した範囲のデータに基づいて足し算を行う関数です。例えば指定した範囲の引数が3,5,7であるならば結果は15です。
SUMには初めから指定した範囲の足し算を行うと言う仕組みが備わっています。
つまり、エクセルの内部機構でSUMの機能は指定した範囲の足し算を行うと言うプログラムがされていると言うことです。
これが関数の意味です。
Javaにはこのように機能が定義されているメソッドが多数ありますので、この章では文字列に関係するメソッドを取り上げたいと思います。
例えば文字列の一部を取り出したり、文字列の長さを計るメソッドです。
次の例ではユーザーに入力させた文字が反対から読んでも同じ文字かどうかを判定するプログラムです。
プログラムの流れは以下の通りです。
〇ユーザーに文字を入力させる
〇入力した文字を反対に並び替える
〇ユーザーが入力した文字と反対に並び替えた文字が同じかどうかを比べる。
では例をみてみましょう。1111 では順番に解説をしていきます。
〇ユーザーに文字を入力させるのですが、ユーザーに入力させるためには以下の記述が必要であることは「if文で星座を判定しよう」で説明しました(BufferedReaderクラスの説明は「キーボードの入力の値を受け取ろう」で説明します)。1 ここではユーザーに入力させた文字をa変数に入れているということを確認してください。
〇次は入力した文字を反対に並び換えます。
入力した文字をcharAtメソッドを使用して、末尾から一文字ずつ取り出して反対文字を作成します。
charAtメソッドは指定した位置にある文字を取り出すメソッドですが、基本構文は以下の通りです。1 例えば「ANA」と入力したとします。
末尾のAを取り出したい場合には1と書きます。
数え方は前から0,1,2…と数えます。1から数えるわけではないので気を付けてください。1 では次の箇所の説明をします。1 charAtのカッコの中の1は文字列の長さを取得しています。1 「ANA」をline.length()で取得すると文字列の長さは3になります。
この例ではfor文で回しているので、iには0から順に数字が入ります。1 文字列の長さから1を引くことで文字列の末尾から順にmoji変数に入れることが出来ます。
moji変数には1文字しか入れないのでデータ型はcharにします。
そして以下のhantai変数にmoji変数の要素をつなげています。
hantai += moji;

〇以下の箇所でユーザーが入力した文字と反対に並び替えた文字が同じかどうかを比べています。
文字列同士を比べているのでequalsを使っています。1 結果は「ANA」と入力したとすると以下のとおり出力されます。1
では次の例を見てみましょう。11 この例は変数mojiが指定した文字で始まっているのか、もしくは指定した文字で終わっているのかを確認するメソッドを使っています。
指定した文字で始まっているのかを調べるメソッドはstartsWithメソッドであり、指定した文字で終わっているのかを調べるにはendsWithメソッドを使います。1 startsWithメソッドの場合は指定した文字で始まっていればRUEを返し、そうでないならばFALSEを返します。
endsWithメソッドの場合は指定した文字で終わっていればTRUEを返し、そうでないならばFALSEを返します。
構文のstartsWithの中の1には整数を入れるのですが、確認したい文字列が1から始まっているのかを調べます。
では説明を始めます。1 =>moji変数はkoから始まっているので、TRUEです。

1 => moji変数はdoから始まっていないので、FALSEです。

1 =>3は「kondou」の前から数えてdの位置です。
doが3の位置から始まっているのかを調べていますので、TRUEです。

1 => moji変数はouで終わっているので、TRUEです。

1 => moji変数はdoで終わっていないので、FALSEです。
例えばこれらのメソッドは以下のように条件式で使います。1 もし、条件式がTRUEであれば、if文を実行して、FALSEであればif文を実行しません。

次はindexOfメソッド、lastIndexOfメソッド、substringメソッド、splitメソッドについて説明します。
では例をみてみましょう。111 初めにindexOfメソッドについて説明します。1 indexOfメソッドは文字列の中で指定した文字列が初めに何番目に現れるかを0から数えた位置番号で返します。
指定した文字列が見つからない場合は「-1」を返します。1 indexOfの第2引数に検索を開始する位置番号がありますが、これは第2引数で指定した位置から検索を始めることを意味します。
初めに第1引数のみを指定した場合の例を見てみましょう。1 =>「”penpenpen”」の中で1が初めに見つかった位置を返すので、0がbに入ります。以下の赤で囲まれている位置に一致するので0を返します。1 次に第1引数と第2引数を指定した場合の例を見てみましょう。1 => indexOfに第2引数がありますが、これは第 2引数で指定した位置から検索を始めることを意味します。
この例では3なので、前から4番目の位置から、指定した「”pen”」のある位置を探して、その位置番号を返します。
つまり、以下の位置から検索を始めるので、結果は3です。1

次はsubstringメソッドについて説明します。1 文字列の中で第1引数に指定した開始位置番号から末尾までの新しい文字列を返します。1 第1引数と第2引数の両方を指定した場合は、第1引数で指定した位置から第2引数で指定した位置から1を引いた位置までの新しい文字列を返します。
初めに第1引数のみを指定した場合の例を見てみましょう。1 =>bには0が入っていますので、先頭から末尾までの文字列を返しますので、結果は1です。
indexOf で位置を確認して、substringで文字列を取り出すケースがよくありますので覚えておいてください。
次の例をみてみましょう。1 substring は bの位置から末尾までの文字列を返すので、結果は1です。
次は第1引数と第2引数を指定した場合の例を見てみましょう。1 第1引数と第2引数の両方を指定した場合は第1引数で指定した位置から第2引数で指定した位置から1を引いた位置までの新しい文字列を返しますので結果は1です。
第2引数は指定した位置から1を引いた位置までなので、eまでではなくて、dまでですので気を付けてください。

次はlastIndexOfメソッドについて説明します。1 lastIndexOfメソッドは文字列の中で指定した文字列が最後に何番目に現れるかを0から数えた位置番号で返します。
指定した文字列が見つからない場合は「-1」を返します。1 lastIndexOfの検索を開始する位置番号はこの指定した位置から先頭に向かって検索を始めることを意味します。
初めに第1引数のみを指定した場合の例を見てみましょう。1 =>「”pen”」が最後に現れる箇所なので、lastIndexOfは6を返します。
bには6が入っているので、substringは「pen」を返します。
次に第1引数と第2引数を指定した場合の例を見てみましょう。
(下の例は先ほどのプログラムにはありません)1 第 2引数は4なので、sの位置から左に検索をかけて、初めに見つかったaの位置を返しますので、結果は3です。1 次はsplitメソッドについて説明します。1 splitメソッドは指定した文字列で分割して、その分割したものを配列で返します。1
「指定した文字列」は「,」なので、これを基準に文字列を分割します。
そして、その分割したものを配列sに入れます。
結果は以下の通りです。
1=>abc
2=>def
3=>g

カテゴリー
Java

メソッドを使って星座プログラムを作ろう

「if文で星座を判定しよう」で星座を出力させるプログラムを書きましたが、これをメソッドを使って書き替えてます。
この章はメソッドの学習ですので、BufferedReaderについては「キーボードの入力の値を受け取ろう」の章で説明します。1111111この例は星座の判定を judgeメソッドに任せています。
このように判定の部分をif文で長く書くのではなく、メソッド化することでコンパクトになりプログラムがすっきり書けます。
少しずつ分解しながら、説明していきます。
〇以下の箇所は「if文で星座を判定しよう」で説明したので、説明は省略します。1

〇メソッドを呼び出しているのは以下の箇所です。
judge(month, birthDay);
judge(month, birthDay);の中のmonthのデータがjudgeメソッドの引数int monthに入り、birthDayのデータがint dayに入ります。1

〇 judgeメソッド内の1の要素は星座名で配列を作成しています。
この配列内の要素は山羊座から順番通りに並んでいます。
決して、適当に並んでいるわけではありません。

〇judgeメソッド内の1には各星座の月の末日を配列に入れています。
judgeメソッド内の1には1月から12月までの末日を配列に入れています。

〇次に以下の箇所の説明をします。1 例えばmonthに1が入り、dayに19が入っているとします。
そうすると1の部分はiが0の時にifの条件式がTRUEになりますので、以下の入れ子のif文の条件式の判定に入ります。1 「day <= day1[i]」の中のdayには19が入り、1周目の1にはday1の0番目の要素である19が入っていますので、条件式はTRUEになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定すると1はFALSEになるので、1の条件式の判定に入ります。
ここで1にはday2の0番目の要素である31が入っていますのでTRUEになり、name には以下の条件に該当する星座が入ります。1 この中のiには1周目では0が入っていますので1で余りを求めると1になりますので1となり、みずがめ座が入ることになります。
1の箇所の説明をしますと例えばmonthが1で、day が23の場合には11になりFALSEになるので、else ifのブロックに入りますが、1月は やぎ座と水瓶座しかなく、やぎ座ではないのならば水瓶座しかないのでnames配列を1つ進めるために1で1を足しています。つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。1

〇もし、judgeメソッドのmonthに100、dayに100などif文の条件式にマッチしないデータを入れるとnameには何も入りません。
そうなった場合にはnameには初期値のカラ文字1が入っているので、if文の条件式にマッチして「間違い」が出力されます。
staticについては「staticについて知ろう」の章で説明します。1

次はmainメソッドの外で変数を宣言するとどうなるかについて説明します。
name変数はmainメソッドの外で宣言しているので、プログラムのどこからでも使用することが出来ます。
このような変数をグローバル変数と言います。
プログラム全体で変数を使いたい場合にはメソッドの外で宣言をしてください。1
これまでメソッド内で使っていた変数はローカル変数と呼ばれています。
ローカル変数とはメソッド内で宣言して、メソッドの中に使用が限定されている変数です。
この例ではname変数を judgeメソッド内で使っているので、mainメソッド内でname変数の値を使うためにはグローバル変数にする必要があります。

〇最後にnameに入った星座を次の箇所で出力します。1 結果の一例は以下の通りです。1

カテゴリー
Java

メソッドについて知ろう

この章ではメソッドについて説明します。
これまでたくさん使ってきたmainメソッドもメソッドの1つなので、mainメソッドの説明から始めます。
これまでmainメソッドは詳しく説明しませんでした。
その理由はプログラムの基礎を理解していないとメソッドの説明はできないからです。
ではmainメソッドについて説明します。
mainメソッドは以下の通り定義します。1 Javaのプログラムはmainメソッドから始まる決まりになっています。
mainは他の名前で代用することができませんので、必ず必要な名前になります。
publicはクラスの外からのアクセスすることができることを意味します。
publicについては「クラスについて知ろう」の章で説明します。
つまり、publicの付いたメソッドはどこからでも利用することが出来ると言うことです。
staticは クラスのオブジェクトを作ることなくアクセスすることができると言う意味です。
staticについては「staticについて知ろう」の章で、オブジェクトについては「クラスについて知ろう」の章で詳しく説明します。
String args[]はコマンドラインで入力した時に、この場所に引数というデータを入れることが出来るのですが、String args[]という形式なので文字列の配列が入ります。
ここはStringしか定義できません。
つまり、int型にしたりはできません。
コマンドライン入力については「コマンドライン入力について知ろう」の章で説明します。
voidはメソッドが戻り値を返す必要が無い時に使います。
voidも戻り値も後で詳しく説明します。
mainメソッドはプログラムの中で最初に実行され、戻り値を返す必要がないので、voidになっています。
mainメソッドは必ず書かなくてはいけないメソッドなので、少し特殊ですが、他にもメソッドは自身で作ることが出来ます。
メソッドとは与えたデータ(引数)に基づいて決められた処理を行い、戻り値を返す機能を持っています。
例えば消費税を自動で計算するメソッドを自分で作りたいとします。
その場合、メソッドは商品金額に消費税率を掛けた処理をして、その結果を返すという機能を持ったメソッドを作ることになります。
もう一例挙げます。
エクセルをご存知の方はわかると思いますが、エクセル関数にSUMと言う関数が有りますが、この関数は指定した範囲のデータに基づいて足し算を行う関数です。
例えば指定した範囲のデータが3,5,7であるならば結果は15です。
このSUM関数のような機能を自身でメソッドに書いていきます。

では実際に例を見てみましょう。
初めにメソッドを使わない例を作成して、メソッドの例と較べます。111 この例は3つの数字の平均を求める記述を行なっていますが、このように何度も同じ処理を書くのは面倒ですし、3つの数字の平均ではなく、3つの数字の合計を求める仕様に変更となったときに、変更点のすべてを書き直さなくてはいけません。
この例はまだ短いプログラムなのでいいですが、これが何百行あった時にすべて書き直すことは大変な作業になります。
このような時にメソッドを使うと便利です。
では、先ほどの例をメソッドを使って書き直します。
111 何度も同じ動きをする文を1つにまとめると言うのがメソッドの役割の一つです。
メソッドを使わない例では3か所あった同じ処理を以下のようなメソッドを使うと1箇所で済みます。
同じ文を何回も書かなくてもいいので、プログラムの可読性が良くなります。1ではメソッドの作り方について説明します。メソッドを作成する基本形は以下の通りです。1 メソッドの基本構文の詳細はこの後すぐに説明しますので今は形だけを覚えておいてください。
スペースの都合で1の部分が2行目に書かれていますが、通常はこの例のようにメソッド名の横に書いてください。
また、1の部分を「仮引数」と言いますが、引数とはメソッド内で使われるデータです。
そして、このメソッドを実行したい時には1 のように記述すればheikinメソッドを呼び出して実行することが出来ます。
つまり、以下の基本構文でメソッド内の内容を実行します。1 引数とはメソッドに渡すデータの事ですが、引数が複数ある場合には1のように1を使って、データ間を区切ります。
このメソッドの呼び出しのカッコの中にあるデータ1「実引数」と言います。
実引数は別に変数である必要はなく、1のようなリテラルでも問題ありません。
リテラルとは「99」や「”猫”」のようなデータそのものを意味します。
では先ほどの例でメソッドの流れについて説明します
実引数のxの値はメソッド本体の1にセットされ、yの値は1に、zの値は1にセットされることになります。
このように変数の値を渡すことを値渡しと言います。
そして、そのセットされた変数は実際のメソッドの中で使われることになります。1 また、実引数と仮引数の変数名が一致していなくても問題ありません。
ここで注意点して欲しいことがあるのですが、実引数と仮引数の型と順番と数は一致させてください。
例えば次のような引数の数の不一致はいけません。1 そして、仮引数がint型で実引数がString型と言うような型の不一致もできません。
しかし、仮引数と実引数の型が違っても、以下のように小さい型の実引数から大きい型の仮引数への自動変換は出来ます。1 この例の場合はint型の99と96をdouble型の1に自動変換してくれます。
次にメソッドの利点について説明します。
メソッドを作成する便利な点は例えば3つの数字の平均を求めるメソッドから3つの数字の合計を求めるメソッドにプログラムを変更する際にも以下のようにメソッドの一部分を変えるだけで簡単に変更できるということです。1
次にメソッドの基本構文について詳しく説明します。1 〇アクセスレベルとは 変数やメソッドに対してどのような場所からアクセスすることが可能であるかを指定することですが、ここではpublicを指定しています。
publicとはどこからでもアクセス可能であると覚えておいてください。
他にもprivateやprotectedなどを指定できますがpublicも含めてクラスの章で詳しく説明します。
static修飾子については「staticについて知ろう」の章で説明します。
〇戻り値型とはメソッドの実行結果を次の例で説明するreturnで呼び出し側に戻すことができるのですが、その戻す値のデータ型を記述します。
戻す値がない時はvoidを指定します。
〇メソッド名はshowTemperatureのように小文字から始まり、単語の区切り目は大文字であることが慣習になっています。
このように書かなくてもエラーにはならないので、自身で解りやすい名前を付けましょう。
またメソッド名にはgetとかshowとか動詞が使われることが多いです。
次はメソッドを実行した時に発生した値を呼び出し元に返す方法について説明します。
例を見てみましょう11 値を呼び出し元に返す構文は次の通りです。
先ほど説明したメソッドの例と違うところはreturnがあるか、無いかの違いです。1 計算結果を呼び出し元に返したい時には1という形式で書きます。
戻り値とは文字通り、呼び出し元に返したいデータです。
この例では1と書いています。
このreturnで返す戻り値がどの型なのかを指定するのが基本構文の「戻り値型」です。
この例では返す値がint型なので「戻り値型」もintになっています。
戻り値を返さないのであればvoidと書きます。1 戻り値である変数dは呼び出し元に戻って、変数gに代入されます。11 上の例は結果を変数に入れて、returnで返していますが、以下の例のようにreturnに直接、式を書いて返してもいいです。11 このような変数をローカル変数と言います。
例えばheikinメソッドのa,b,c,dの変数はheikinメソッド内でしか使用することは出来ません。
ですので、他のメソッドでa,b,c,dの変数名を使用しても、まったく別の変数になるので問題ありません。
この例でもmainメソッドとheikinメソッドでは同じ変数名a,b,cが使われていますが、全く問題ありません。
では次に進みます。
これまではmainメソッドから他のメソッドを呼び出していましたが、mainメソッド以外のメソッドから他のメソッドを呼び出すことも出来ますので、次の例を見てください。111 この例ではmainメソッドからmenseki1メソッドを呼び出していますが、さらにmenseki1メソッドから、menseki2メソッドを呼び出しています。
このような呼び出し方も出来るので覚えておいてください。
では説明を始めます。
mainメソッドの中でmenseki1メソッドを呼び出しています。
menseki1メソッド内では1の結果を1に代入しています。
さらにmenseki1メソッド内でmenseki2メソッドを呼び出して1に結果を代入しています。
最後にdとeを足したものをfに代入して、その値をreturnで呼び出し元に返して変数gに入れています。
結果は以下の通りです。1
次は配列をメソッドに渡す方法について説明します。
では例をみてみましょう。11 このメソッドは配列の要素の中で一番大きい数の値を求めるメソッドです。
〇配列をmaxメソッドに渡すには1のように引数に配列を書きます。

〇配列を渡しているのでメソッドの仮引数は1のように配列で受け取ります。

〇比べるための一番初めの基準の数値は1なので1の値である2になります。
そして、for文の中で以下のような順番でループして大きさを比べています。
1周目の11となり、1の方が大きいのでtop1には1が入ります。
2周目の11となり、1の方が大きいのでtop1には2が入ります。
3周目の11となり、1の方が大きいのでtop1には3が入ります。
4周目の11となり、1の方が大きいのでtop1には4が入ります。
5周目の11となり、1の方が大きいのでtop1には5が入ります。
最終的にtop1には5が入ります。
そして、1の箇所でtop1の値がworld1に代入されます。
number[world1]のworld1には一番大きい配列のインデックス番号が入っているので、1となり、89が出力されます。
次の例は配列の要素をメソッドに渡して、その値をメソッド内で変更した時に元の配列はどうなるかについて説明します。11 結果は「444444」です。
配列をメソッドに渡すときには値渡しではなく、参照渡しになります。
変数をメソッドに渡す場合は値渡しです。
呼び出し元の配列numberをrt配列に渡していますが、このrt配列をkakikaeメソッド内で変更するとnumber配列の値まで書き替えることができます。
これが参照渡しになります。
変数を渡す値渡しの場合はメソッド側でその変数の値を書き替えることが出来ません。
例ではnumber配列の要素である1をkakikaeメソッドの中のrt配列に渡してすべて4を代入していますが、このようにメソッド側で配列の値を変えることで、呼び出し元の配列の要素もすべて1に変更されます。
次の例では呼び出し元の変数をメソッド側で書き替えることができるか(書き替えることは出来ませんが)見てみましょう。11 kakikae(x,y,z);の箇所で引数をkakikaeメソッドに送っています。
これは値渡しで渡しています。
そして、kakikaeメソッドで以下のように4を代入しています。
a=4;
b=4;
c=4;
ここで変数に4を代入しても、呼び出し元のx 、y、z の値は変更されず1のままです。
つまり、値渡しの場合はメソッド側でその変数の値を書き替えることが出来ません。1 その場合には呼び出し側の引数もカラにしてメソッドを呼び出します。1

カテゴリー
Java

do-while文について知ろう

この章ではdo-while文について説明します。
while文は繰り返し文が実行される前に条件式を判定しますがdo-while文は繰り返し文が実行された後に条件式を判定します。
while文は初めの条件がFALSEの場合は繰り返し文を1回も実行することはありませんが、do-while文は最低1回は繰り返し文を実行します。1 では例をみてみましょう。1 初めに1を実行して、a++でインクリメントしてから、1の条件判定に入りますので最低1回は繰り返し処理文を実行します。1

カテゴリー
Java

while文の中でのbreakの使い方を知ろう

この章ではwhile文の中でのbreak の使い方について説明します。
while文の中で強制的に繰り返し文を終了させたい時にbreakを使用します。
では例をみてみましょう。11 では説明に入ります。
〇 iに1を代入します。

〇 (i <= 10)の条件を判定します。
iは1でTRUEなので、whileの処理文を実行します。

〇 iは1で、if文の条件式はTRUEではないので、そのままif文はスルーします。

〇次の文を実行して「ループ1回目」を出力します。1

〇 i++で1を足して、iは2になります。

〇(i <= 10)の条件を判定します。
iは2でTRUEですので、whileの処理文を実行します。

〇 iは2で、if文の条件式はTRUEではないので、そのままif文はスルーします。

〇 次の文を実行して「ループ2回目」を出力します。1

〇 i++で1を足して、iは3になります。

〇 (i <= 10)の条件を判定します。
iは3でTRUEなので、whileの処理文を実行します。

〇 3回目のループで初めて、if文の条件部分がTRUEになるので1を実行します。
そして、この後にbreakがあるので、ここでwhile文を抜けます。

カテゴリー
Java

while文について知ろう

この章ではwhile文について説明します。
while文はfor文と同じく、条件式がTRUEの場合は何度でも繰り返し文を実行します。1 では例をみてみましょう。1 順を追って説明しましょう。
〇初めにiに初期値1を代入します。
while( i < 6 )の条件式をif文と同じようにTRUEかFALSEで判定します。
もし条件部分がTRUEであるならば、1を実行します。
FALSEであるならば1は実行されません。
1周目のiは1で6未満なので1を実行して、1を出力します。
そしてi++の箇所で1を加えてiは2になります。

〇 2周目のiは上の1番で1が足されているので2になっていますが、次に1の条件判定に入ります。
2は6未満なのでTRUEになり、1を実行して、2を出力します。
そしてi++の箇所で1を加えiは3になります。

〇 3周目のiは上の2番で1が足されているので3になっていますが、次に1の条件判定に入ります。
3は6未満なのでTRUEになり、1を実行して、3を出力します。
そしてi++の箇所で1を加えiは4になります。

〇 4周目のiは上の3番で1が足されているので4になっていますが、次に1の条件判定に入ります。
4は6未満なのでTRUEになり、1を実行して、4を出力します。
そしてi++の箇所で1を加えiは5になります。

〇 5周目のiは上の4番で1が足されているので5になっていますが、次に1の条件判定に入ります。
5は6未満なのでTRUEになり、1を実行して、5を出力します。
そしてi++の箇所で1を加えiは6になります。

〇 6周目のiは上の5番で1が足されているので6になっていますが、1の条件判定でfalseになるため、ここで処理を終了します。
このように1の部分がFALSEになるまで繰り返します。
つまり変数iが6以上になりましたらwhile文を終了します。

カテゴリー
Java

forの中のcontinueの使い方を知ろう

この章ではcontinueについて説明します。
continueは現在進行している周回を抜けても、ループ自体は続けたい場合に使います。
では例をみてみましょう。1 では説明を始めます。
1つ
2つ
3つ
を出力した後に次の周回でiが4になりますが、1の条件がTRUEですので、1を実行することなく、つまり「4つ」という文字列を出力することなく、forの先頭に戻ります。
forの先頭に戻りましたら、1の箇所で条件判定をしますが、5はまだ5以下でTRUEなのでループを継続して「5つ」を出力します。
breakと違いループ自体を止めることはしません。