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です。』と出力される。