第12回 クラスの利用(2)

  
参考書 Lesson 10.3(参考書p.314)〜 Lesson 10.5
    
10 クラスの利用(つづき)
 
 10.3 その他のクラス
 
Integerクラスを使う
 - int型などの基本型データを操作する機能を提供するラッパクラスがある 
 - ラッパクラスと基本型の対応
ラッパクラス
基本型
  Byte
  byte
  Character
  char
  Short   short
  Integer   int
  Long   long
  Float   float
  Double   double
 
 - ラッパクラスの文字列から数値へ変換するクラスメソッドがよく利用される 
   int num = Integer.parseInt(str); // 文字列-->整数値  
   double d = Double.parseDouble(str);
  など
 
Mathクラスを使う
 - 数学で使う主な関数や定数が利用できる
 - Mathクラスの主な定数

定数
説明
 double
 Math.PI 円周率 π(パイ、≒3.14159265358979323846)
 double
 Math.E 自然対数の底 e (≒2.718281828459045)
 
 - Mathクラスの主なクラスメソッド
戻り値の型
メソッド
説明
 int
 double
 abs(int a)
 abs(double a)
引数の絶対値を返す
(例)Math.abs(-10); --> 10
(例)Math.abs(-20.5); --> 20.5
 double
 ceil(double a) 引数a以上で一番近い整数値を返す
(例)Math.ceil(3.14); --> 4.0
(例)Math.ceil(-3.14); --> -3.0
 double  floor(double a)
引数a以下で一番近い整数値を返す
(例)Math.floor(3.14); --> 3.0
(例)Math.floor(-3.14); --> -4.0
 double  pow(double a, double b) 引数ab乗を返す
(例)Math.pow(2.0,8.0); --> 256.0
 double  random() 0.01.0未満の乱数を返す
(例)(int)(Math.random()*6); --> 0〜5の整数値
 double  sqrt(double a)
平方根を返す
(例)Math.sqrt(2); --> 1.4142135623730951
 int
 double
 max(int a, int b)
 max(double a, double b)
2つの引数のうち大きい方を返す
(例)Math.max(3,5); --> 5
(例)Math.max(3.0, 5.0); --> 5.0
 int
 double
 min(int a)
 min(double a)
2つの引数のうち小さい方を返す
(例)Math.min(3,5); --> 3
(例)Math.min(3.0, 5.0); --> 3.0
 double  sin(double a) 三角関数のサインを返す
引数aは ラジアン度数(0〜π〜2π)
 double  cos(double a) 三角関数のコサインを返す
引数aはラジアン度数(0〜π〜2π)
 double  tan(double a) 三角関数のタンジェントを返す
引数aはラジアン度数(0〜π〜2π)
                     
    
  
 10.4 クラス型の変数
 
・クラス型の変数に代入する
 - 同じクラス型の変数どうしで、代入することができる
 - 代入しても、オブジェクトが2つになるわけではない
 
<代入の例>
class Sample1
{
  public static void main(String [] args)
  {
    Car c1 = new Car( 1234, 20.5 );
    Car c2;

    c2 = c1; // 同じクラス型の変数に代入する
    System.out.println("c1 = " + c1.num + ", " + c1.gas);
    System.out.println("c2 = " + c2.num + ", " + c2.gas);

    c2.num = 9876
; // c2のメンバ変数を変更する
    System.out.println("<変更後>");
    System.out.println("c1 = " + c1.num + ", " + c1.gas);
    System.out.println("c2 = " + c2.num + ", " + c2.gas);
   }
}
/* Carクラスの記述は省略 */
   
<実行結果>
C:\java>java Sample1
c1 = 1234, 20.5
c2 = 1234, 20.5
<変更後>
c1 = 9876, 20.5  <-- c1のnumも変わっていることに注意
c2 = 9876, 20.5

C:\java>
 
 - 変数 c1c2 は異なる2つのブジェクト(インスタンス)ではなく、同じ1つのオブジェクトをさしている
 
nullのしくみを知る
 - クラス型の変数に null を代入すると、紐づけされているオブジェクトがないことになる
   Car c1 = new Car();  // オブジェクトが作成され、c1に紐づけされる
      :
   c1 = null;  // c1とオブジェクトへの紐づけがなくなる

 - 紐づけがなくなったオブジェクトや利用されなくなったオブジェクトは、システムによって自動的に破棄される
   ---> 「ガーベジコレクション」と呼ばれる機能

・メソッドの引数として使う
 - クラス型の変数をメソッドの引数にする
<引数にクラス型の変数を用いる>
class Sample2
{
  public static void main(String [] args)
  {
    Car c1 = new Car( 1234, 20.5 );
    Car c2 = new Car( 9876, 13.8 );

    show(c1);
    show(c2);
  }
  static void show( Car cc ){ // 引数はCarクラスのクラス型変数
    System.out.println("cc = " + cc.num + ", " + cc.gas);
  }
}
/* Carクラスの記述は省略 */
 
 
・値渡しと参照渡し
 - 基本型変数は値渡し ・・・・ がコピーされる
 - クラス型変数は参照渡し ・・・・ 参照先がコピーされる
 
値渡しの例>
class Sample3
{
  public static void main(String [] args)
  {
    int a = 5;
    int b = 3;

    System.out.println("a=" + a + ", b=" + b);
    exchange( a, b ); // 値渡しなので、aとbの値は入れ替わらない
    System.out.println("a=" + a + ", b=" + b);
  }
  static void exchange( int x, int y ){
    int tmp;
    tmp = x; x = y; y = tmp; // xとyが入れ替わるだけ、a,bには影響なし
  }
}
 
<実行結果>
C:\java>java Sample3
a=5, b=3
a=5, b=3
  <-- 変化なし

C:\java>
 
 
参照渡しの例>
class Sample4
{
  public static void main(String [] args)
  {
    Car a = new Car(1234, 20.5);
    Car b = new Car(9876, 13.8);

    System.out.print("a[" + a.num + "," + a.gas + "], ");
    System.out.println("b[" + b.num + "," + b.gas + "]");
    exchange( a, b );
// 参照渡し
    System.out.print("a[" + a.num + "," + a.gas + "], ");
    System.out.println("b[" + b.num + "," + b.gas + "]");
  }
  static void exchange( Car x, Car y ){
    int nn;
    double gg;
   
// メンバごとに入れ替える
    nn = x.num; x.num = y.num; y.num = nn;
    gg = x.gas; x.gas = y.gas; y.gas = gg;
  }
}
class Car
{
  int num;
  double gas;

  public Car( int n, double g ){
    num = n;
    gas = g;
  }
}

 
<実行結果>
C:\java>java Sample4
a[1234,20.5], b[9876,13.8]
a[9876,13.8], b[1234,20.5]
  <-- a〜bで入れ替わっている

C:\java>
 
    
    
 10.5 オブジェクトの配列
 
・オブジェクトを配列で扱う
 - オブジェクトの配列を使うには 
   Car [] cars;
   cars = new Car[3];
 の配列変数の宣言・領域確保と、さらに
   for(int i=0;i<cars.length;i++){
     cars[i] = new Car();
   }
 を実行して、オブジェクトを1個ずつ作成する必要がある
 
・オブジェクトの配列をメソッドの引数にする
 - オブジェクトの配列を引数で渡す
 
<オブジェクトの配列をメソッドの引数にする>
class Sample5
{
  public static void main(String [] args)
  {
    Car [] cs1 = new Car[3]; // オブジェクトの配列変数
    Car [] cs2 = new Car[5];
    int i;

    for(i=0;i<cs1.length;i++) cs1[i] = new Car(); // オブジェクト作成
    for(i=0;i<cs2.length;i++) cs2[i] = new Car();

    show( cs1 ); // 内容を表示
    show( cs2 );
  }
  // オブジェクトの配列を引数で受け取る
  static void show( Car [] cs ){
   
for(int i=0;i<cs.length;i++) System.out.print(" " + cs[i].num);
   
System.out.println("");
  }
}

class Car
{
  int num;
  double gas;

  public Car(){
    num = (int)(Math.random()*8999.0)+1000; // 乱数で指定
    gas = 60.0;
  }
}
   
<実行結果>
C:\java>java Sample5
 7942 4518 2568
 6339 9431 7321 1467 8821

C:\java>
 
    
    
  
 演習
 
  演習のページへ