2010年8月4日水曜日

クラスの階層をつくる

■スーパークラス⇒サブクラス1⇒サブクラス1_1⇒サブクラス1_1_1と出来ます。
スーパークラスを指定しないextends 指定を行わない時は、オブジェクトクラススーパークラスになり、Object クラスは、クラス階層のルートです。すべてのクラスは、スーパークラスとして Object を持ちます。配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。
■JavaのクラスはすべてObjectクラスを継承しています
public String toString(){}ではObjectクラスのtoStringメソッドをオーバーライドしています。
■equals()メソッドは、同じオブジェクトを指しているか、調べる時に使います。帰り値はbooleanです。
Stringクラスequals()メソッドは、オブジェクトが同じを調べるのではなく、文字列が同じか調べている。

*Objectクラス:equals(Object obj)
          このオブジェクトと「等価」になるオブジェクトがあるかどうかを示します。
*Stringクラス:equals(Object anObject)
          この文字列と指定されたオブジェクトを比較します。
■getClassメソッド:getClass()
          この Object の実行時クラスを返します。class クラス名 = オブジェクト.getClass();
が戻り値はクラス名です。

2010年8月3日火曜日

final ファイナルの概要

■finalなメンバークラスはサブクラスを拡張できません。
■finalなメンバーメソッドはサブクラスを呼び出しできません。
■finalなメンバーフィールドは値を変更できません、また、定数なは、大文字英数字で指定します。
public fainal int NUM = 1;//と大文字英数字で指定します。
あと、初期化も指定してください、呼び出すときは、「クラス名.NUM」で呼び出します。

スーパークラスと同じ名前のメンバを使う

サブクラスからスーパークラスのメソッドの呼び出し、
//F1クラスはスーパークラスです。
//F2クラスはサブクラスです。
class F2 extends F1
{
  public void showF()
   {
     super.showF();//スーパークラスのshowFメソッドの呼び出し
   }
}
スーパークラスのフィールドにアクセス
class F1
{
 int i; //サブクラスと同じ名です。
}

class F2 extends F1
{
 int i;//スーパークラスと同じ名で
  public void showF()
  {
   super.i = 2;//スーパークラスのフィールド、変数iにアクセス
   i = 1; //サブクラスのフィールド、変数iにアクセス
  }
}

オーバーライドとオーバーロード

■オーバーロードはメソッドな同じで、引数や型が違うメソッド、
■オーバーライドは、サブクラス・スーパークラスでメソッド名・引数・型が同じメソッドを定義すること。

■どんな時に使うか考えている、
//F1:スーパークラス
//F2:サブクラス

F1クラスのメソッドを使う時は、良いマシーンを作るチームの時はF1クラスのメソッドを呼び出し、
悪いマシーンを作るチームの時は、F2クラスのメソッドを呼び出すとかかな?・・

スーパークラスの変数でオブジェクト

サブクラスのオブジェクトはスーパークラスの変数でも扱えます
F1 f1 = new F2();//とか出来ます。
■javaはオブジェクトが違うクラスの変数でも、オブジェクト自体のクラスのメソッドが呼び出される、
■スーパークラスの変数だと、サブクラスのメソッドは呼び出せません

■オーバーライド とは サブクラス・スーパークラスの同じメソッド名・同じ引数のメソッドを定義すること。

//F1クラスはスーパークラスです。
//F2クラスはサブクラスです。
//配列で扱われているオブジェクトがどのクラスでも、生成元のクラスのメソッドが呼び出されます。
F1 f1[];
f1 = new F1[2];

f1[0] = new F1();
f1[0].setCar(111,222);//生成したインスタンス元、スーパークラスのメソッドが実行

f1[1] = new F2();
f1[1].setCar(1233,432);//生成したインスタンス元、サブクラスのメソッドが実行
■1つのメソッドが状況に応じて動く事を多様性(ポリモーフィズム)という

BigDecimalを勉強しました。

http://d.hatena.ne.jp/nattou_curry_2/20090211/1234366254

に詳しく載っています。

2010年8月2日月曜日

継承クラスメソッドのオーバーライド

サブクラスにスーパクラスと同じ名前のメソッド

スーパクラスのprivateメンバはアクセスできない?

■スーパクラスのprivateメンバはサブクラスからアクセスできない?
こんな時は、スーパークラスのprivateメンバをprotectedメンバに変更する、
仕様に応じて記述しましょう。

super() スーパークラスのコンストラクタ指定

サブクラスのコンストラクタのなかで、super(x、y)
を記述すると、スーパークラスの引数2個ありのコンストラクタが呼び出され、引数が渡されて実行されます。
public F1car (int num, double b,int c)
{
  super(num,b);//スーパークラス引数2個が呼び出される、
}

メインメソッド
F1car f1car = new F1car(122,90.0,3);//サブクラスの引数3個の呼び出し、処理ではサブクラスのsuper()がスーパークラスに引数2このコンストラクタを呼び出す事になります。

this()はそのクラスの別のコンストの呼び出し、
super()はスーパークラスのコンストの呼び出し、

■分かりやすくF1を題材にしたよ


class Car//車としての基本性能
{
    private int cc;
    private int gas;
   
    public Car(int c,int g)
    {
        cc= c;
        gas = g;
        System.out.println("車としての機能排気量は" + cc + "で、" + "ガソリン量は" + gas + "です");
    }
}

class F1car extends Car//F1カーとしてのターボを追加

{
    private int tab;
   
    public F1car(int c, int t, int g)
    {
        super(c,g);//スーパクラス引数2個のコンストが呼び出しです
        tab = t;//ここはF1カーのターボを追加してます

        System.out.println("F1カーとしての機能のターボ量は" + tab + "です");
    }
}


class Sample1_1
{
    public static void main (String args[])
    {
        F1car f1carnew = new F1car(1500,2000,100);//コンストでsuper渡しで基本の車、                              //引数の100はターボに代入される
    }
}

/*********実行結果********
車としての機能排気量は1500で、ガソリン量は100です
F1カーとしての機能のターボ量は2000です

*/

継承

extends(クラスの拡張)
inheritance(継承)クラスのメンバーを受け継ぐ
superclass(元となるスーパークラス)
subclass(サブクラス、新しいクラス)

Car//スーパークラス
{
private 排気量;
private ナンバー;

  public Car()
  {
   排気量 = 0;
   ナンバー = 0;
  }
  public void setF1(cc,num)
  {
  
   排気量 = cc;
   ナンバー =num;  }
  public void show()
  {
   System.out.print(排気量、ナンバー);
  }
}

class F1car 拡張 Car//サブクラス

サーキットコース;


/メインメソッド/
public static void main(String agrs[])
{
 F1car f1car = new F1car();//サブクラスの呼び出し
  f1car.setF1(12,44);//スーパークラスのメソッドを呼び出し
f1car.show();//スーパークラスのメソッドを呼び出し
}
■サブクラスからスーパークラスのメンバを呼び出せます。継承、カプセル化、多様性がjavaの強みです。
■メインメソッドからサブクラスのオブジェクトが呼び出された時に、スーパークラスの引数無のコンストラクタが先に実行され、次にサブクラスのコンストラクタが呼び出されまあす。
■スーパークラスのコンストラクタはサブクラスに継承できません、引数無のコンストラクタが自動的に呼び出されます。

2010年7月29日木曜日

クラス概要

(1)インスタンス変数 とは インスタンス(オブジェクト)が生成された時に実態をもつ変数、*private e;など
(2)インスタンスメドッド とは インスタンス(オブジェクト)が生成され時実態をもつメソッド、 ※public void car()
(3)クラス変数 とは public static  int a; インスタンス(オブジェクト)を生成しなくても呼び出せる、クラスに属する変数
(4)クラスメソッド とは public static void car(); インスタンス(オブジェクト)を生成しなくせも呼び出せるメソッド、クラスに属する。

(5)コンストラクタ とは クラス名と同じで、戻り値が無い、インスタンスを生成した時に呼び出される物です、
引数の数や型で呼び出すコンストラクタを変えることが出来ます。

JavaAPIドキュメント

日本語版が便利です。

パッケージ一覧・クラス一覧・仕様と3つの画面があります。
■java.langはパッケージ指定しなくても使えます。標準クラスです。
たとえば、Stringはクラスです。パッケージは指定しなくても使えます。

■コンストラクタ・メソッドもあります。

■Mathクラスのstatic int max(int a,int b);は
staticはクラスメソッドの、戻り型intの、max名と言うメドッソです。

※またクラスフィールドのPIは、Math.PIは円周率;

2010年7月28日水曜日

オブジェクトの配列

//クラスの配列を用意し、for文で用意した配列分のオブジェクトをつくります。
//クラス変数で生産された台数をカウントし、
//メソッドにクルマの番号とガソリン量を渡します。
import java.util.Random;

class Car
{
    public static int i;
    private int num;
    private double gas;
  
    public Car()
    {
        i++;
        System.out.println("車をつくたよ" + i + "車");
    }
  
    public void car1(int n,double g)
    {
        num = n;
        gas = g;
      
    }
  
    public void showCar()
    {
        System.out.println("num車" + num + "号車です。" + "gas:ガソリン量" +gas);
    }
  
    public static void showNum()
    {
        System.out.println("車は" + i + "台あります");
    }
}

class Sample9
{
    public static void main(String args[])
    {
        int i;
        Random rnd = new Random();

        Car[] car = new Car[5];
      
        for( i = 0; i < car.length; i++)
        {
            car[i] = new Car();
        }
      
        for( i = 0; i < car.length; i++)
        {
            int k = i;
            car[i].car1(k+1,rnd.nextInt(100));
        }
        for( i = 0; i < car.length; i++)
        {
            car[i].showCar();
        }
        Car.showNum();
      
        System.out.println("今日は何号車に乗っていきますか?");
        car[rnd.nextInt(car.length)].showCar();
    }
}
/****実行結果*******
車をつくたよ1車
車をつくたよ2車
車をつくたよ3車
車をつくたよ4車
車をつくたよ5車
num車1号車です。gas:ガソリン量23.0
num車2号車です。gas:ガソリン量31.0
num車3号車です。gas:ガソリン量40.0
num車4号車です。gas:ガソリン量88.0
num車5号車です。gas:ガソリン量39.0
車は5台あります
今日は何号車に乗っていきますか?
num車4号車です。gas:ガソリン量88.0*/

クラス型変数・基本型変数をメソッドの引数として使う

■基本が変数の値は値渡し、ことなる物を示す事になる。


■クラス型変数の値渡しは参照渡しになる。同じものを示すことになる
class Y1
{
 J1 j1 = new J1("text");
 I1.setT(j1);
}

class U1
{
  public void setT(J1 te)
  {
    text = te;
  }
}
※同じものを指します

ガーベージコレクション

■クラス型変数にnullを代入すると、ガーベージコレクション・メモリーが解放される事
■だたし2つのクラス型変数が同じもを示しているなら、片方は残ります「オブジェクトの事」。
■finalize()メソッドでメモリから破棄する事も出来る、

クラス型変数

■クラス型変数
J1 j1;
   j1 =  new J1;
J1 j2;
  j2 = j1;//新しいオブジェクトが出来たのではない、同じオブジェクトをさす事になります。

ラッパクラス・基本型とは

■基本型のint・double・char型を提供するクラス。
これらのクラスはnewしなくても使えます。
クラスメソッドも使えます。Integer.parseInt()などがそうです。
■Math.max(7,8);は大きい方を返します
これも標準クラスライブラリーです。

privateフィールド・publicメソッド・コンストラクタ・オブジェクト作成

//0から100までのXとYの座標を表す
class MyPoint
{
    //インスタンスフィールドです
    private int x;
    private int y;
   
    //引数のないコンストラクタ
    public MyPoint ()
    {
        System.out.println("初期座標はxは" + x + "です。Yは" + y + "です。\n");
    }
    //引数有のコンストラクタ
    public MyPoint (int px, int py)
    {
        if((px >= 0 && px <=100) && (py >= 0 && py <=100))
        {
            x = px;
            y = py;
            System.out.println("座標xは" + x + "で、座標Yは" + y + "です。\n");
        }
        else
        {
            System.out.println("0~100を入力してください");
        }
    }
    //インスタンスメソッド
    public void setX(int px)
    {
        if(px >= 0 && px <=100)
        {
            x = px;
            System.out.println("座標xは" + x + "です。\n");
        }
        else
        {
            System.out.println("0~100を入力してください");
        }
    }
    public void setY(int py)
    {
        if(py >= 0 && py <=100)
        {
            y = py;
            System.out.println("座標Yは" + y + "です。\n");
        }
        else
        {
            System.out.println("0~100を入力してください");
        }
    }
    //インスタンス変数
    public int getX()
    {
        return x;
    }
   
    public int getY()
    {
        return y;
    }
}

class Lessen5
{
    public static void main (String args[])
    {
        System.out.println("引数なしのコンストラクタを実行します");
        MyPoint mypoint1 = new MyPoint();
       
        System.out.println("引数2個のコンストラクタを実行します");
        MyPoint mypoint2 = new MyPoint(100,20);
       
        System.out.println("引数が1つあるメソッドを実行しました、");
        mypoint1.setX(55);
        System.out.println("引数が1つあるメソッドを実行しました、");
        mypoint1.setY(99);
       
       
        int pointX = mypoint1.getX();
        int pointY = mypoint1.getY();
        System.out.println("オブジェクトmypoint1XYの座標を受け取るint型のメソッドを実行しました");
        System.out.println("X座標は" + pointX + "で、Y座標は" + pointY + "です。\n");
       
        int point2X = mypoint2.getX();
        int point2Y = mypoint2.getY();
        System.out.println("オブジェクトmypoint2XYの座標を受け取るint型のメソッドを実行しました");
        System.out.println("X座標は" + point2X + "で、Y座標は" + point2Y + "です。");
    }
}
/*
実行結果

引数なしのコンストラクタを実行します
初期座標はxは0です。Yは0です。

引数2個のコンストラクタを実行します
座標xは100で、座標Yは20です。

引数が1つあるメソッドを実行しました、
座標xは100です。

引数が1つあるメソッドを実行しました、
座標Yは99です。

XYの座標を受け取るint型のメソッドを実行しました
X座標は100で、Y座標は99です。
*/

2010年7月27日火曜日

クラスメソッド・クラス変数  public static

//クラスメソッドテストとクラス変数テスト
class Car
{
    public static int sum = 0;
    private int num = 1;
    public Car()
    {
        sum++;
        System.out.println("コンスト時のsumです" + sum);
    }
    public static void showS()
    {

        System.out.println("インスタンス変数にアクセスしてみましたsumです" + sum);
       
    }
}

class Sample8
{
    public static void main(String args[])
    {
        Car.showS();
        Car.showS();
        Car.showS();
        Car.showS();
        Car car1 = new Car();
        Car car2 = new Car();
        Car car3 = new Car();
        Car car4 = new Car();
        Car.showS();//クラス変数表示
   }
}

/*
C:\JavaSrc\9>java Sample8
インスタンス変数にアクセスしてみましたsumです0
インスタンス変数にアクセスしてみましたsumです0
インスタンス変数にアクセスしてみましたsumです0
インスタンス変数にアクセスしてみましたsumです0
コンスト時のsumです1
コンスト時のsumです2
コンスト時のsumです3
コンスト時のsumです4
インスタンス変数にアクセスしてみましたsumです4//クラスメソッドでクラス変数をよびだしています
*/

コンスタラクタに修飾小を付ける

class J1
{
   private J1()
   {
     System.out.println("privateなコンスト実行");
   }
public J1(int n,double e)
  {
    this();     //privateなコンスト呼び出し
    System.out.println("publicなコンスト実行");
  }
}

J1 j1 = new J1();//引数無のコンストは呼び出しできません
J1 j2 = new J1(12,55);//引数無のコンストをthisで呼び出しています。
必ず引数2個のコンストしか呼び出せないような時つかえます。