Integerクラス

 Integerクラスは、int型のラッパー(包み込む)クラスで、基本型に関する様々な機能を補完するクラス。

 そもそもint型とは、基本型(プリミティブ)であり、javaが標準で用意している、8つの数値や文字列を格納する為のデータ型である。

 データ型は、名前の通り、フィールド(データ)しか持っていない(メゾットを有しない)。フィールド(データ)とメゾット(処理機能)をもっているクラス型とは異なる

 javaではデータしか持ち合わせないデータ型を補完する為、メゾットを保有しているクラス型(参照)であるIntegerクラスが別で用意されている。

 そもそも、プログラムとは、フィールド(データ)をメゾット(処理機能)によりフィールド(データ)を変化させる事が目的である。よって、データだけでは、どの様に変化させるのかがないので、プログラムとして完結しない。そこで数値を参照型(リファレンス)にし、どの様に処理するかを加えたものを別のクラス型で用意したものが、ラッパークラスでその1つがIntegerクラスある。

 Integerクラスは、複数のクラスメゾット(対義語インスタンスメゾット)をもっている。

 Integerクラスのnewによる宣言、初期化と代入(コンストラクタの呼び出し)は、推奨されていない。

Integer i;

i = new Integer(6);//コンパイル時に警告メッセージが出る。

 

:関連事項:

 intも、newによる宣言、初期化と代入(コンストラクタの呼び出し)はしない。intはデータ基本型であり、上記でも解説している通り、フィールド(データ)しか持っておらず、メゾット(処理機能)は無い。よって、そもそもコンストラクタをもっていないので、newによる代入はできない(しない)ので直接代入する。

int num;
num = new int(10);//データ型にはコンストラクタが無いので呼び出せない。この記述ではコンパイルできない。

よって

int num;

num = 10;//直接代入

この様な記述になる。

 

【 仮定義 】

String str1 = "4597";

int num1  = 0;

int num2 = 3;

 

 

Q1

 String型の文字列をint型の変数にして返す。

メゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

 

A1

ststic int parseInt(String str)

int num = Integer.parseInt(str1);

プリミティブ型を返す。

parseIntはIntegerクラスで、クラスメゾットと定義されているので、オブジェクトの作成は行わない。

『クラス名.メゾット名(引数)』

の様な記述になる。

 クラスメゾット(関数)はクラス全体で扱うメゾットの事。クラスメンバ(変数)は、クラス全体で扱う変数の事。クラスメゾットは、インスタンスオブジェクトメンバ(変数)の作成を行わないので、コンストラクタも作成されない。※コンストラクタは、newによる宣言、初期化と代入によりインスタンスオブジェクトメンバの作成が行われないと呼び出しされない。戻り値を持っているので、int型へ代入まで行う。

 

 この様な、メゾットを持つラッパークラスが用意されている事により、フィールドしか持っていないデータ型では行えなかった、型の変換等を行う事ができる様になっている。

 

 

Q2

 String型の文字列をInteger型の変数で返す。

メゾットを記述し、呼び出し元でオブジェクトを作成するコードを記述。

 

 

 

 

A2

static Integer valueOf(String str)

Integer in = Integer.valueOf(str1);

ラッパークラスの初期化されたIntegerオブジェクトで返す。newによるインスタンスオブジェクトの作成を行わないので、戻り値を介して直接入力する。宣言、初期化、代入をする時はvalueOfを使用する。

Integerオブジェクトにするメリットの1つとしては、参照型になる事。

StringBufferクラス

 StringBufferクラスは、オブジェクト(変数)の文字列を直接的に変更を加える事ができる。Stringクラスでは、一度代入した文字の直接的な変更はできない。

【 仮定義 】

String str1 = "HELLO";

String str2 = "world";

String str3 = "HELLOwarld";

int num = 0;

int num1 = 3;

int num2 = 5;

char ch = 'a'

 例えば、str1の後ろにstr2を付け加えたい場合、文字列str1を直接的に変更を加える事は出来ない。新たに"HELLOhello"を定義し、代入をしなおす。

 StringBuffer クラスのオブジェクト(変数)であれば、文字列を変更するメゾットが用意されている。

 StringBufferクラスを使用するには『new』による、インスタンスオブジェクト(変数)の作成(呼び出し)と宣言が必要になる。省略は出来ない。例題ではStringBuffer型の識別子はsbを使う。

 

0 オブジェクト(変数)の作成

StringBuffer型のsb(オブジェクト)を宣言し、String型の引数str1を代入する。

Q:

短縮する場合としない場合を記述

char型、int型、double型を代入する場合どの様に代入するのか

 

 

 

A:

省略あり

StringBuffer sb = new StringBuffer(str1);

省略なし

StringBuffer sb;

sb = new StringBuffer(str1);

 オブジェクトの作成時の引数は、String型の文字列でなくてはならない。データ型が、『char,int,double』はコンパイルは通るが代入できない。charも代入できそうだが、代入できないので注意。文字や数字を引数で使用する場合は、String型で宣言してから代入する。

【 例 】

String str3 = "a"

String str4 ="4597"

String str5 =  "40.5"

 

 

Q1:

 StringBuffer型の文字列の後ろに、引数char,String,int型を付け加え、StringBuffer型で返す。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A1:

StringBuffer append(char ch)

sb = sb.append(str2);

 

Q2:

 StringBuffer型の文字列の、引数の位置の文字を削除し、StringBuffer型で返す。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A2:

StringBuffer deleteCharAt(int index)

sb = sb.deleteCharAt(num);

Charは基本型なので大文字。StringBufferクラスdeleteのみCharAtをつける。

引数は、Char型のみ。String、int、doubleはエラーになる。←確認

 

Q3: StringBuffer型の文字列に、引数の位置に文字又は文字列を追加し、StringBuffer型で返す。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A3:

StringBuffer insert(int offset , char ch or String str)

sb = sb.insert(num , ch) ;

sb = sb.insert(num , Str1);

:直訳: insret 挿入する・はさみ込む

 

Q4:

 StringBuffer型の文字列の長さをint型で返す。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

 

A4:

int length()

int num = sb.length();

 戻り値は、1番目を0とカウントされる。StringBufferクラスでも、length()メゾットが用意されている。このインスタンスメゾットは引数を持たない。

 認識間違いしやすい所は、sbを引数としてしまう時。

main()クラスでのインスタンスオブジェクト(変数や数値の事を指す)作成後、作成したインスタンスオブジェクトを使用する為に、インスタンスメゾットを呼び出す。その際、呼び出し方の記述方法は、常に単一で、『主語を、どうする、何々を使って』と記述する。(※クラスオブジェクトは記述の方法が異なる)

sb.length();の場合

元となる変数【主語を】.メゾット名【どうする】(引数)【何々を使って】;となる

『元となる変数sbを、カウントする、()内の引数を使って』と認識しながら記述する。

今回のlengthは、カウントするだけなので、

『元となる変数sbを、カウントする、()内の引数を用いて』となり、引数が不要になる。よって()内は空欄のままになる。

 

Q5:

 StringBuffer型の文字列の、引数の数値の文字列を、引数の文字列で置換し、StringBuffer型で返す。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A5:

StringBuffer replace(int Strt ,int End, String str)

sb = sb.replace(num,num1,str2);

引数int strt ,int endは、int strt以上からint end未満までと定義されている。

 

Q6:

 StringBuffer型の文字列を、文字列を逆にし、StringBuffer型で返す。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A6:

StringBuffer reverse()

sb = sb.reverse();

:直訳: reverse 反転させる・逆にする・ひっくり返す

String型の文字列を引数にする事は出来ない。

『主語を、どうする、何々を使って』に当てはめてみると、

『文字列sbを、反転させる、引数の文字列を使って』となると意味が通らなくなる。

sbに違う文字列を付け加えて、反転させたい場合は、sbに文字列を付け加えた後、付け加えた後の文字列を反転させる2段階に記述を分けなければならない。

 

Q7:

  StringBuffer型の文字列の、引数の文字の位置を引数の文字にする。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

 

A7:

void setCharAt(int index, char ch);

sb.setCharAt(ch);

 インスタンスメゾットに戻り値が無いので、sbの文字列を変更しただけ。sbに代入できない。

sb = sb.setCharAt(ch);//エラー: 不適合な型: voidをStringBufferに変換できません:

ここが、戻り値がある場合とない場合の違い。戻り値があるインスタンスメゾットの場合(Q1~Q6)、戻り値の型と適合する、宣言と初期化済みの変数であれば代入子演算を使い直接代入できる。戻り値がある場合でも代入しなくてもよい。その場合は、Q7と記述方法は同じで、代入子演算を省略する。

:参照:esson10文字列を扱うクラスSample051.java又は教科書p253

 

Q8:

 StringBuffer型の文字列を、String型に変換し、String型で返す。インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A8:

String toString()

String str = sb.toString();

Stringクラスに戻したい時に使用する。

何を、どうする、引数を使ってに当てはめてみると

『sbをString型にする引数を使って』になる。

Objectクラスのクラス変数のオブジェクト名.toString()オーバーロードも同じ意味になる。

 

 

String クラス

 文字列を扱うクラス。Stringクラスは、よく使うクラスなのでnewによるオブジェクトの作成を省略できる。省略なので、記述しても良い。

String str1 = new String("HELLO");

String str1 = "HELLO";

 上記2パターンは、どちらでも良い。コードでは、基本的に、省略した方を採用する。この時、なぜ略せるのか?省略した裏に隠れているコードはなにか?を意識しながらコードを記述する。

 

String型でnewにより作成された、オブジェクト(上記の場合str1)は、参照型のオブジェクトになる。

 

【 仮定義 】

String str1 = "HELLO";

String str2 = "world";

String str3 = "HELLOwarld";

int num = 0;

int num1 = 3;

int num2 = 5;

char ch = 'a'

 

 

 

Q1:

 String型文字列において、引数intで指定した位置にあるの文字をchar型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

A1:

char charAt(int index)

char ch = str1.charAt(num);

 main()クラスでのインスタンスオブジェクト(変数や数値の事を指す)作成後、作成したインスタンスオブジェクトを使用する為に、インスタンスメゾットを呼び出す。その際、呼び出し方の記述方法は、常に単一で、『主語を、どうする、何々を使って』と記述する。(※クラスオブジェクトは記述の方法が異なる)

 

Q2:

 String型文字列においての長さをint型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A2:

int length()

int num = str1.length();

返ってくる値は、1番目を0とカウントされる。

 

Q3:

 String型文字列において、引数(char ch)が最初に出てくる位置をint型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A3:

int indexOf(char ch)

int num = str1.indexOf(ch);

引数部分は、int型でもstrintg型でも可

※iは小文字・文字をつなぐ時は大文字になる。この場合はOf

 

Q4:

 String型の文字列において、引数が最後に出現する位置をint型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

 

A4:

int lastIndexOf(char ch);

int num = str1.lastIndexOf(ch);

引数部分は、int型でもString型でも可。

※lは小文字・文字をつなぐ時は大文字になる。この場合はIndex

 

Q5:

 String型の文字列において、引数の位置から最後までの文字列をString型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A5:

String substring(int begingindex);

String str = str1.substring(int begin);

※stringは小文字つなぐ時は、本来の書き方から変化させる。toStringは全て返す時。subは一部という意味で覚える。

 

Q6:

 String型の文字列において、引数の位置(int num1)から引数の位置(int num2)までの文字列をString型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A6:

String substring(int begin,int lastindex)

String str = str1.substring(num1,num2);

※stringは小文字つなぐ時は、本来の書き方から変化させる。

 

Q7:

 String型の文字列において、大文字に変換し、String型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A7:

String toUpperCase();

String str = str1.toUpperCase();

※stringは小文字つなぐ時は、本来の書き方から変化させる。

toを入れ忘れない様にする。変化させる時はtoを入れる。StringBufferクラスのtoStringメゾットはまさにそれ。

認識間違いしやすい所は、str1を引数としてしまう時。

main()クラスでのインスタンスオブジェクト(変数や数値の事を指す)作成後、作成したインスタンスオブジェクトを使用する為に、インスタンスメゾットを呼び出す。その際、呼び出し方の記述方法は、常に単一で、『主語を、どうする、何々を使って』と記述する。(※クラスオブジェクトは記述の方法が異なる)

元となる変数【主語を】.メゾット名【どうする】(引数)【何々を使って】;となる

『元となる変数sbを、カウントする、()内の引数を使って』と認識しながら記述する。

今回のtoUpperCaseは、大文字にするだけなので、

『元となる変数str1を、大文字にする、()内の引数を用いて』となり、引数が不要になる。よって()内は空欄のままになる。

 

 

 

Q8:

 String型の文字列において、小文字に変換してStrintg型で返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A8:

String toLowerCase();

String str = str1.toLowerCase();

 

 

Q9:

 String型の文字列において、引数の文字列で終わるかどうかを判断しbooleanで返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A9:

boolean endsWith(String suffix)

boolean b1 = str1.endsWith(string suffix);

true or falseで返す。

sを入れ忘れないようにする。

 

Q10:

  String型の文字列において、引数の文字列で始まるかどうかを判断しbooleanで返す。

インスタンスメゾットを記述し、mainクラスでメゾットを呼び出すコードを記述。

 

 

 

 

A10:

boolean startsWith(String prefix)

boolean b1 = str1.startsWith(String prefix);

tuer or falseで返す

lesson8~9 クラスの基本とクラスの機能

フィールドとメゾット

 

classには、フィールド(数値)とメゾット(フィールドをどう変化させるかを指示したもの)が存在する。

そもそも、プログラムは、フィールド(数値)をメゾット(指示そのもの)を使って変化させる事。

 

インスタンスメゾット

クラス全体に関連づけられていないメゾット。

インスタンスオブジェクトを扱う時に必要。

呼び出し方は、インスタンス変数名

 

オブジェクトとは

オブジェクトは、いろいろなフィールド(数値)の事とおぼえる。時にはメゾットやクラスそのものも含まれる。抽象的概念である。

 

オブジェクトの作成

main()クラス内で、newによる(コンストラクタを呼び出し)クラスの宣言と初期化を行う事。インスタンス化とも言う。インスタンスオブジェクト(変数)を使う時に必ず呼び出されるものであるから。

 

 

メゾット→show(); System.exit(0); set(){}などプログラムを動かす物を示す概念。

オブジェクト内(class)にはメゾットの他にフィールドが存在する。

フィールド→変数int numやdouble gasやString modなどプログラムに動かされる物(変数や配列、数値など)を示す概念。オブジェクト(class)は、メゾットとフィールドの集合体で構成されている。

 

◎classの宣言 -class変数-

 車のナンバーをnum、ガソリンの量をgas、車種をmodとして定義するCarクラスを作成する。

  • <pre>
  •   <code>
  • class Car
  • {
  • int num;
  • double gas;
  • String mod;
  • }
  • </code>
  • </pre>

 この記述でclassを宣言できる。今まで作ってきたclass Sampleと同じ。違いは、public static void main(Strig args)が無い事。これについてこれから復習していく。

 

 

class変数の呼び出し -オブジェクトの作成-

 classオブジェクトは、別のclassオブジェクトの中で『呼び出す事』ができる。別のclassオブジェクトを呼び出す為には、newを使って呼び出す。

  • <pre>
  •   <code>
  • class Sample1

    {

         public static void main(String args) 

         {

         Car car1 = new Car();

         }

    }

  •   </code>
  • </pre>

 上記Sample1クラスの記述では、別のどこかに定義されたCarクラスを呼び出した事になる。Sample1クラスのコード内においてCarは、呼び出したい別のどこかのclass名で、car1は呼び出したクラスを識別する為につけた識別子であり任意に決めれる。

 

引用先のクラスの記述

  • <pre>
  •   <code>
  • Class Car
  • {
  •      int num;

         double gas;

         String mod;

     

         Car(){};   //※1

     

         Car(int n,double g,String m){    //※2

           this();

           num = n;

           gas = g;

           mod = m;

  •        }

    }

  •   </code>
  • </pre>

コンストラク

Car(・・・){・・・};の記述は、class Carのコンストラクタになる。

 コンストラクタは、呼び出し元のclass Sample内でCarクラスを呼び出した時、

int num;

double gas;

String mod;

以外に、Car(・・・){・・・};の記述が一緒に呼び出される。

//※1の様に()内に何も記載されない場合、『引数』が無いコンストラクタとなる。引数無しの場合、呼び出し元のSampleクラスでは、num、gas、modに0が代入されてたとして処理される(初期化)。呼び出し元の記述として、引数がない場合は、Car(){}自体を省略する事もできる。コンストラクターに識別子は存在しない。

省略する場合は、※1(引数無しのコンストラクタ)と※2(引数ありのコンストラクタ)を全て省略するか、又は※1(引数無しのコンストラクタ)だけ記述する。引数ありのコンストラクタだけ記述する事はできない。

 

◎引数を持つ場合

Car(int n,double g,String m){

this();

num = n;

gas = g;

mod = m;

   }

 引用先のclass Carにおいて※2は、上記の部分は引数を持つコンストラクタになる。呼び出し元のClass Sampleで、引数を指定して呼び出しをした場合、上記のコンストラクタが呼び出し元に返される。

 

呼び出し元の記述

Car car1 = new Car(4597,20.5,"HARRER");

 

 あらかじめ引用先のclass Carで記述したコンストラクタは、引数の数に合わせて、呼び出し元から指定された型と同じ物が呼び出され、引数を代入した物が返される。また、String class等のいくつかのclassは、このnewでの呼び出しの記述を省略する事もできる。

String str = new String("あいうえお");  //この様に書いても良いが下の様に省略している

String str = "あいうえお";

 

◎引数を持たないコンストラクタを引用した場合の数値の代入方法

 引用先のclass carにおいて、引数を持たないコンストラクタ(デフォルトコンストラクタ)を作成した場合や、コンストラクタを省略(初期化のみ)した場合、引用先のCarクラスでは、newでコンストラクタを呼び出した後に、set(){}メゾットを記述し、引数を代入する。

 

引用先での記述

set(・・・){・・・}メゾット

  • <pre>
  •   <code>
  •   void setNGM(int = n,double = g,String = m){
  • num = n;

    gas = g;

    mod = m;

  •   </code>
  • </pre>

 

※引用先のNGMはsetメゾットの識別子。(・・・)内にはデータ型と引数が入る。{・・・}内には引数の代入の式が入る。

 また、既に引数があるコンストラクタを呼び出し、代入済みの場合でも、引用元のSample classでset(){}メゾットを記述し呼び出す事によって、指定した引数に変数の数値を変更できる。

 

オーバーロード

 引用先において、引数のデータ型または、個数が異なっている場合、同一の識別子で記述できる。

引用先class Carでの記述

  • <pre>
  •   <code>
  •     

    void showNGM(int n,double g,String m){

    num = n;

    gas = g;

    mod = m;

    }

    void showNGM(int n, double g){

    num = n;

    gas = g;

    }

    •  </code>
    • </pre>

 上記2つのshowメゾットは、識別子が同じNGMであるが、受け取る引数のデータ型と個数が異なる為、違いを区別する事ができる。よって同じ識別子で定義するす事ができる。先の記述では、コンストラクタをオーバーロードしている。

※引数の個数が同じであってもデータ型が異なっていればオーバーロードできる。

呼び出し元class Sampleでの記述

car1.showNGM(4597,20.5,"HARRER");

car1.showNGM(4597,20.5) ;  //引数の数が異なる

 

◎戻り値

 今までは、呼び出し元から引用先に数値を渡す時を解説した。今度は、逆に引用先から呼び出し先に数値を渡す値を戻り値を解説する。

引用先での記述

  • <pre>
  • <code>
  •  

    class  Car

    {

      private int num;   //※4

      private double gas;  //※4

      private String mod;  //※4

      private double kilo;  //※4

  •  
  •  

      Car(){}

  •  
  •  

      Car(int n, double g, String m, double k){   //

         num = n;

         gas = g;

         mod = m;

         kilo = k;

         this.showNGMK;

        }

  •  
  •  

       pubric void showNGMK(){   //※5

         System.out.println("ナンバー"+num+"の車種    は"+mod+です。);

         System.out.println("ガソリンは"+gas+"ℓで1ℓあたりの燃費は"+kilo+"Kmです。")

        }

  •  
  •  

       public void setNGMK(double g,double k){    //※3

         gas = g;

         kilo = k;

        }

  •  
  •  

       public double getRun(){    //double型を指定している。

         return (kilo*gas);    //returnの後の数値をdoubleで返す。

        }

    }

  • </code>
  • </pre>

 

呼び出し元での記述

 

  • </code>
  • </pre>
  •  
  •  

    class Sample

    {

       public static void main(String args)

       {

        Car car1 = new Car();

        car1.setNGMK(4597, 8.5, HARRER,10.5);

        car1.setNGMK(60.5, 14.5);

        double RUN = car1.getRun();

        System.out.println("走行可能距離は"+RUN+"です。");

        }

    }

  • </code>
  • </pre>

 引用先の記述では、returnの後に続く式の結果の数値または変数を、データ型を指定し、呼び出し元に返す。記述では、getメゾット内で走行可能距離を計算しclass Sampleに戻り値として返している。受け取り方は、代入演算子(=)を使い変数として、データ型に合ったものに代入をする。この様に戻り値は、引数と逆の処理をしている。

 

◎void

 引用先の記述において、戻り値がないものは、intやdoubleのデータ型を記述する箇所にvoidと記述する。class Car内の記述※3ではpublic void showNGMK()の部分がそうである。※3のメゾットには引数はあるが、戻り値がないのでvoidを記述する。

 

◎privateとpublic

 上記引用先class Carにおいて、※4のクラスメンバには全てprivate記述がある。privateが記述されていると、class外からのアクセスができなくなる。例えば、class Sample内でnewでclass Carを呼び出し、

car1.num = 4597;

と記述してもコンパイルは通らない。

System.out.println(car1.num);

も同じくコンパイルは通らない。アクセスできないという事は、代入のみならず、変数も引用できない事となる。privateであっても、同じclass内ではアクセスできるので、上記の記述ではsetメゾットを使い、数値を代入している。

 対してpublicと記述されているメゾット※5には、どこからでもアクセスできる。setNGMK()は、class Sampleからアクセスできる。何も記述しない場合は、同じパッケージからはアクセスできるが、パッケージ外からはアクセスできない。

 この様にprivateメンバに直接アクセスを制限する事により、明らかな入力間違いを未然に防ぐ事ができる。具体的には、setNGMK()メゾットにif()メゾットを組み合わせ、マイナスの引数を受け取った際に、エラーメッセージを表示させる処理を設計できる。

priveteやpublic等メンバやメゾットの前につけるものを総じて修飾子という。

 

インスタンス変数とインスタンスメゾット

 呼び出し元のclass Sampleにおいて、newを使って引用先class Carを呼び出し、識別子をつける事を、オブジェクトの作成と言う。この様にオブジェクトの作成により関連付けられた引用先class Carの変数の事をインスタンス変数と呼ぶ。上記のコードであれば、※4の事を指す。また、関連付けられたメゾットをインスタンスメゾットと呼ぶ。上記のコードであれば、※3や※5である。

 

◎修飾子static クラス変数とクラスメゾット

 上記に記述したclass Sampleの記述は、オブジェクトの作成により関連付けられた、インスタンス変数やインスタンスメゾットである。オブジェクトに関連づけられていないメゾットや変数もある。その事をクラスメゾットやクラス変数という。クラスメゾットやクラス変数は、クラスに関連付けられている。

引用先での記述

  • </code>
  • </pre>
  • class Car
  • {
  •     public static int sum = 0;   //※6
  •     private int num;
  •     private double gas;
  •   
  •     private Car(){};
  •     public Car(int n, double g){
  •       this;
  •       num = n;
  •       gas = g;
  •       sum++;    //※7
  •       System.println.("車のナンバーとガソリンの量は" + num + "と"+ gas +"です。");
  •      }
  •     public setG(double g){
  •        gas = g;
  •        System.out.println("ガソリンの量を" + gas + "に変更しました。")
  •      }
  •     public static showSum(){
  •         System.out.println(”作成した車の台数は”+ sum +"です。");
  •     }
  • }
  • </code>
  • </pre>

 

呼び出し元での記述

  • </code>
  • </pre>
  • class Sample
  • {
  •    public static void main(String args)
  •     {
  •      Car car1 = new Car(4597,15.1);
  •      Car car2 = new Car(2563,20.1);
  •      Car car3 = new Car(2463,40.1);
  •      car2.showG(50.1);
  •      Car.showSum();   //※8
  •      }
  • }
  • </code>
  • </pre>

 上記の記述※6の様に引用先で修飾子staticをつける事により、引用先のclassに関連づけられる。呼び出し元では、※8の様にclassを指名するで呼び出す事ができる。

 上記コードにおいては、※7の記述で引用先のコンストラクタにクラス変数sumのインクリメントを入れる事により、呼び出し元では、コンストラクタが呼び出される毎にsumが1づづ増加する様に設計している。コンパイルの結果は、Car.shouSum();の部分では『作成した車の台数は3です。』と出力される。

lesson6 繰り返し文

①for(){}

 ()内で定義された回数分、繰り返し{}内の処理を行う。

 

for( int i = 0; i <=5; i++){

System.out.println("hello,world")

     };

上記コードは、hello,worldを5回出力する為のコード。

 

ⅰ 繰り返す回数

 上記のコードでは、「iを0で初期化した後、iが5になるまで、プラス1づつ増やした時、何回ループする」いう表現で繰り返しの回数を指定する(iをループ変数と呼ぶ)。カッコ内では、宣言をしている。この宣言は、for構文のブロック内のみで有効なので、iを「繰り返す式」に組み込む事もできる。※-復習-if()は宣言は出来ない。

 

ⅱ 繰り返す処理

 繰り返す処理内では、宣言も代入もできる。

 

 

② while(){}

カッコ内の条件の式に達するまで、while以下の「繰り返す式」を処理し続ける。

int i = 0;

while(i < 5){

    System.out.println(i + "番目処理です。");

    i++

         }

上記コード場合、繰り返す式は「System〜」と「変数 i のインクリメント」になる。trueの時に繰り返し処理を行う。falseの時は行わない。


i ループ変数

 コード上のループ変数はiで指定している。

while文の場合for文と違いループ変数を指定する時、while()のブロックの外で宣言を行い、ブロック内にインクリメントを組み込む。インクリメントをつけ忘れた場合、ループ変数iが増加しない。何度繰り返しても、while()のカッコ内の繰り返し終了条件式に該当しないので、無限の繰り返しループを起こしてしまう。


ⅱ for文との違い

 繰り返す回数が決まっている場合は、for文を使う。繰り返す回数が決まっていなく、条件を満たしている場合に常に繰り返したい場合は、whileを使う。

回数が決まっていない時とは、コマンドラインからBufferedReaderクラスで、fileReaderメゾットを使い、長さが決まっていない文字列を読み込む時はwhile文を使用する。

参照教科書p468


ⅲ 順序

上から順に処理される。

1ループ変数iの宣言と初期化

2ループ変数iの条件判断

3処理(画面への出力)

4ループ変数iのインクリメント

→2に戻る

 


③ do{}while();

int i = 0;

do{

System.out.println(i + "回目の処理です");

i++;

}

while(i < 5);


 whileの前にdoを使い、「繰り返す式」を前に持っていく事によりwhile()の条件に該当するまで、繰り返し処理をする事ができる。

whileよりも前に繰り返す式が前にあるので処理が先にされる。trueの時は処理を行う。falseの時は処理を行わない。※while()が最後に来るので「;」をつけ忘れない。


ⅰ  順序

上から順に処理される。

1.ループ変数iの宣言と初期化

2.処理(画面への出力)

3.インクリメント

4.ループ変数iの条件判断

→2に戻る

順序を見てみると理解できるが、条件がfalseの場合であっても1度は処理が実行される。

lesson5 条件分岐

①if(){}

 変数に対して、条件を指定し、その条件に該当する場合のみ、その後に続く処理をする。

 

int a = nam1

if(a == 0){

    System.out.println("頑張りましょう。");

  }

else if(a <= 2){

    System.out.println("あと少しです。");

  }

else if(a <= 4){

     System.out.println("合格です。");

  }

else if(a == 5){

      System.out.println('⚪︎');//1文字は「'  '」でくくる

  }

 

ⅰ順序

 上記のコードは変数aをに対し、指定した範囲で分類した結果を状況に応じて画面に出力する。上から順に処理されていくので、カッコ内の「条件指定の式」は、より小さい範囲から指定してく。

 上のコードを見てみると、ifのブロックは、区切られていない。if(a == 0)の後ろに記述されている事になっている。「 ; 」が存在しない。「 )」の後ろに;をつけた場合は、if文は成立しなくなる。

 

ⅱ宣言

 if(  )または、else if(  )のカッコ内では、宣言や初期化はできない。演算も行わない。「演算の式」はカッコ内に記載せず、if文の外(前)に記載する。カッコ内は、「演算の式」の結果に対し、「条件指定の式」を記述する。

 

ⅲ 条件を表す記号

if(  )または、else if(  )のカッコ内では、条件指定として不等式( >= <= < > )を使う。等しいという意味で=を用いているので、代入とは異なる事を示す為、==を使う。

&&や||を使う事によって、2つの条件が重なる時や、どちらか一方の条件が重なる時のみなどの条件を指定できる。

 

ⅳ 処理

その後に続く{  }内での処理は、System.out.println()以外にも初期化や代入も処理できる。処理を記述する際はインデントを行い後から見ても見やすくする。「条件指定の式」の部分ではできなかった宣言も代入もできる。

 

 

②switch

 演算結果に対して、数値や文字を1つづつ指定し、その数値や文字に該当する場合のみ、処理を行う。

int num1 = Integer.parseInt( str1 );

int num2 = Integer.parseInt( str2 );

 switch(num1 + num2){

   case 1: 

               System.out.println("計算結果は1です");

               braek;

   case 2:

               System.out.println("計算結果は2です");

               braek;

   case 3:

               System.out.println("計算結果は3です");

               braek;

  default:

               System.out.println("1〜3以外です");

               braek;

   }

ⅰ  順序

 上記コードの、switch()のカッコ内には「演算の式」を記述し、その結果をcaseの後に記述する。ifのような、「条件の指定の式」は記述出来ない。その代わりに具体的な数値や文字を指定できる。演算の式は、{  }内全てに適用される。

 

ⅱ  文字や数値を指定する

 指定したい数値や文字を、caseの後に記述する。数値の終わりに「 : 」をつける。※「 ; 」ではない。文字を指定する場合は、case 'a': と記載する。:注意:文字はchar型で宣言する。

 

ⅲ  文字を抜き出す

 BuffededReaderクラスからString型(文字列)で入力された文字を抜き出すことができる。

String str1 = br.readLine();

char i = str1.charAt(0);

iに文字列str1の最初の文字を代入する。()内の数値が何番目の文字を抜き出すかの基数となっている。

 

ⅳ  braek;

 各「case 〜:」のブロックは必ずbraek;で締めくくる。switch()の場合上から順番に処理をしていくので、braek;を使わないと構文の中から抜け出すことができない。2つ以上のcaseにて、同じ結果になる場合は、braekを入れずに記述する事もできる。

 

ⅴ  処理

 case以下の部分には、System.out.println("  ");

以外にも、宣言や初期化もできる。ifのⅳと同じ。

 

  

 

 

lesson4 2/2 演算 代入演算 インクリメント デクリメント キャスト演算

① 代入演算子

 代入演算子は、元の変数の数値に、代入する変数の数値を、演算子に基づいて代入する。

 そもそも代入は、変数の数値をまるまる入れ替える事。代入演算は、「+=」を使った場合、元のデータ型という「入れ物」の中に入っている数値もプラスするというイメージ。

 

int num1 = 10;

int nam2 = 5;

nam1 = nam1 + nam2

nam1 +=  nam2;

3行目の処理と2行目の処理は同じ。

 

 代入演算子は、四則演算(足し算、掛け算、引き算、割り算)に加えて、%やシフト演算も短く記述できる。

注意事項

 代入演算子を使う場合、あらかじめ宣言を行い、変数を用意する。左側の変数を基に演算を行うので下記のような宣言と代入演算を同時に記述した場合はコンパイルできない。

int nam1 += nam2;

 

代入演算子

a += b  ・・・加算代入  a = a + b

a -= b  ・・・減算代入      a = a - b

a *= b  ・・・乗算代入      a = a * b

a /= b  ・・・除算代入      a = a / b

a %= b  ・・・余剰代入        a = a % b

a <<= b  ・・・左シフト代入     a =  a << b

a >>= b  ・・・右シフト符号あり代入       a = a >> b

a >>>= b  ・・・右シフト符号なし代入    a = a <<< b

※シフト演算(代入も含む)は、整数値型のみ使用可。浮動小数点型、boolen型、参照型は使用不可。コンパイルエラーが出る。

 

② インクリメント、デクリメント

ⅰ  前置インクリメント

 右側の変数の前に「 ++ 」を置く事により、右側の変数の数値を1増やしてから代入する

nam1 = 5;

nam2 = ++nam1; 

上記のコードの場合、mam2は(5 + 1)で6が代入される。nam1は(5 + 1)で6になる。

 

ⅱ 後置インクリメント

nam1 = 5;

nam2 = nam1++;

 右側の変数の後ろに「 ++ 」を置く事により、代入した後に右側の変数を1増やす

上記のコードの場合、nam2には5が代入される。nam1は(5 + 1)で6になる。

 

ⅲ   前置デクリメント、後置デクリメント

 上記のインリメント「 ++ 」を「 -- 」マイナスに置き換えたをデクリメントという。代入に関しての概念は同じでデクリメントは、1を減らす

 

③ キャスト演算

 データ型の異なった変数同士を代入する場合、エラーが起きて代入できない場合や、コンパイルできても、端数が切られてしまい、数値の一部が失われてしまう場合がある。違う型同士で演算を行った場合、大きなサイズの型に合わせられる。

 

boolen     ・・・ trueまたはfalse

char         ・・・2byte文字(8bit→10進数で1~256迄)  表現範囲¥u0000~¥uffff

byte         ・・・1byte整数(8bit→10進数で1~256迄)  表現範囲-128~-127

short        ・・・2byte整数(16bit→10進数で1~65535迄)  表現範囲 -32768~32767

int            ・・・4byte整数(32bit→10進数で1~2147483647迄)

                           表現範囲  -2147483648~2147483647 

long         ・・・8byte整数(64bit→10進法で1~2^64-1迄)

                           表現範囲  -9223372036854775808~9223372036854775807

float         ・・・4byte単精度浮動小数点数(32bit→10進数で1~2147483647)                                                 表現範囲  1.401298E-45 ~ 3.4028235E+38

                                        -3.4028235E+38 ~ -1.401298E-45

                            有効桁数 上位7桁

double     ・・・8byte倍精度浮動小数点数(64bit→10進法で1~2^64-1迄)

                           表現範囲  ±1.79769313486231570E+308~

                                          ±4.94065645841246544E-324

                           有効桁数 上位15桁

 

ⅰ 小さい型から大きい型に代入する場合

 データ型の変換が自動で行われる。上の表において、代入先のデータ型が、代入するデータ型よりも下に来ているものは、コンパイルできる。

class SampleB
{
    public static void main(String args)
    {
       int a1 = 2252;
       float b1 = a1;
       System.out.println( b1 );

    }
}

注意事項

longをfloatやdoubleに代入した場合、有効桁数よりも下の桁の数値は信頼できない。

longを宣言し数値を代入する際は数値の後ろにlまたはLをつける。

 

ⅱ  大きい型から小さい型に代入する場合

 上記表のデータ型において下から上へと、扱うサイズが大きい型から小さい型に代入する時、コンパイルエラーが発生する。その場合、型を変換する事を明示的にしっかりと記述する。記述方法は、代入元のオペランドの前に代入先のデータ型をカッコでくくる。これがキャスト演算

class SampleB
{
    public static void main(String args)
    {
       float a1 = 222.2f;
       int b1 = (int)a1;//←(int)これにより明示される。

       System.out.println( b1 );

    }
}

 小数点を扱える「float」から、小数点を扱えない「int」に変換するので、小数点以下は切り捨てられる。扱える数値がオーバーした場合も同じく切り捨てられる。

注意事項

floatを宣言し数値を代入する際は数値の後ろにfまたはFをつける。

 

ⅲ  型が異なる同士での演算

 四則演算等の演算子を使った時、型が違う場合は、大きい方の型に変換されてから演算処理を行う。処理の結果も、大きい型で得られる。

 

注意事項

 同型同士で演算を行った場合は、その結果は同型で得られる。例えば、int型同士で割り算をした結果は、整数で返される。少数点以下は切り捨てられるのでキャスト演算を使用する。※大きい型に変換されて処理されるので下記のコードの割られる方、割る方のどちらか一方でも可。

class SampleB
{
    public static void main(String args)
    {
       int a1 = 22;
       int b1 = 5;
       double ans1 = (double)a1/(double)b1;  // double ans1 = a1/(double)b1;でも可
       System.out.println( ans1 );

    }
}

上記コードの結果は「4.4」

※キャスト演算を使用せず、結果のデータ型だけ指定しても、データ型int同士の割り算になるので、得られる結果に演算結果の少数点反映されない。ただ、doubleなので丁寧に小数点まで表示される。

class SampleB
{
    public static void main(String args)
    {
       int a1 = 22;
       int b1 = 5;
       double ans1 = a1/b1;
       System.out.println( ans1 );

    }
}

上記に表示されるのは、「4.0」