第 12 回: インターフェースとは, 宣言, 実装, インターフェースのフィールドとメソッド, インターフェースの宣言, 単一継承と多重継承, クラスとインターフェースの比較, ガベージコレクション, ガベージコレクタ, メモリ管理のためのメソッド

インターフェースとは

1. フィールドは, 必ず定数
2. メソッド, 必ず抽象メソッド
3. インスタンスを作れない

インターフェースの宣言

interface Lockable{
  boolean lock();
  boolean unlock();
}

インターフェースの実装

class Kinko implements Lockable{
  public boolean lock(){
    ...
  }
  public boolean unlock(){
    ...
  }
}
class LockableJewelBox extends JwelBox implements Lockable{
public boolean lock(){
...

} public boolean unlock(){

...

}

インターフェースのフィールドとメソッド

1. インターフェースのフィールドは, public static final
2. インターフェースのメソッドは, public abstract

インターフェースの宣言

interface インターフェース名 extends スーパーインターフェース名{
  型名 フィールド名 = 定数;
  型名 フィールド名 = 定数;
  型名 フィールド名 = 定数;

  型名 メソッド名 (引数列);
  型名 メソッド名 (引数列);
  型名 メソッド名 (引数列);
}

単一継承と多重継承

1. 実装は単一継承である. (extends)
2. 名前は, 多重継承である. (implements)

クラスとインターフェースの比較

クラス:

インスタンス: 作れる
メソッド: いろいろ
フィールド: いろいろ
スーパークラス: 一つだけ
スーパーインターフェース: 複数指定可能

インターフェース:

インスタンス: 作れない
メソッド: 必ず public abstract
フィールド: 必ず public static final
スーパークラス: 持てない
スーパーインターフェース: 複数指定可能

ガベージコレクション

Something obj = new Something();

変数 obj は, Something クラスのインスタンスの参照したアドレスを保持している.

Something obj1 = new Something();
Something obj2 = obj1;
obj1 = null;

obj1 に null を代入することで, どのアドレスも参照しない状態にする. このとき, obj2 に Something クラスのインスタンスの参照を保持.

Something obj1 = new Something();
Something obj2 = obj1;
obj1 = null;
obj2 = null;

obj2 の参照も null にすると, 作った Something クラスのインスタンスを参照できなくなる. この時, ガベージ (ゴミ) となる.

ガベージコレクタ

1. ヒープ上に確保されたインスタンスのメモリ領域がガベージとなり, ガベージが蓄積されると, Java 仮想マシンは, ガベージコレクションを始める.
2. どの変数からも参照されないインスタンスのメモリ領域を回収し, 再利用する.

GcTest1.java

1
2
3
4
5
6
7
8
public class GcTest1{
    public static void main(String[] args){
	while(true){
	    String s = new String("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
	    System.out.println("残りメモリ = " + Runtime.getRuntime().freeMemory());
	}
    }
}

GcTest1.java の実行結果は:

[wtopia koji]$ java GcTest1
残りメモリ = 64381696
残りメモリ = 64381696
残りメモリ = 64381696
残りメモリ = 64381696
残りメモリ = 64381696
残りメモリ = 64381696
残りメモリ = 64381696
...(省略)

メモリ管理のためのメソッド

利用可能なメモリの大きさを得る:

long free = Runtime.getRuntime().freeMemory();

全てのメモリの大きさを得る:

long total = Runtime.getRuntime().totalMemory();

最大メモリの大きさを得る:

long max = Runtime.getRuntime().maxMemory();

ガベージコレクションを動作させる:

Runtime.getRuntime().gc();

または,:

System.gc();