「Javaプログラミングのアイデア」05.初期化とクリーンアップ

  • プログラミング費用のかかる主な理由:安全でないプログラミングモード
  • C ++は、導入された构造器、オブジェクトを作成したときに自動的に呼び出される特殊なメソッド(コンストラクタ)
  • 導入しながら、Javaはまた、コンストラクタを使用しています垃圾回收器

初期化することを保証するコンストラクタ

  • コンストラクタでは、すべてのオブジェクトは初期化動作の前に得られることを保証するために
  • なぜクラスのコンストラクタの名前と同じ必要がありますか?
    • 任意の名前は、クラスのメンバーの名前に関連付けることができるコンフリクト
    • オブジェクトを初期化するために呼び出すメソッドのコンパイラ知らせる必要があります(コンストラクタを呼び出すには、あるコンパイラの責任
    • これは、基本的にCの溶液を、以下、ある++
  • したがって、コーディングスタイル(小文字法最初)の観点、指定例外の構成
  • Javaは、作成および初期化捆绑

メソッドのオーバーロード

オーバーロードの方法は、言語を減らすことができ冗余性、メソッドをオーバーロードしない場合は、コンストラクタは達成が困難になり、私たちは、コンパイラおよびコンストラクタメソッドとの間の合意の名前を必要とする、コンパイラのノウハウメソッド呼び出しを聞かせて、コーダーによって与えられた名前そして、マッチングプログラムは、それを達成する場合など、異なる名前がたくさんあるでしょう:車という名前のクラス、CarOne(名前は自分のコンストラクタを記述します)、同様のマッチングカー*途中、道書き込みの場合以上よりも、必然的に多くの問題をもたらす、繰り返します。要するに:コンストラクタは、別の理由で強制的にオーバーロードされた方法があります

オーバーロードされたメソッドの区別

  • ユニークなパラメータ型リスト
    • 異なる数
    • 異なるシーケンス - 通常<行いません - 維持するためのコードは難しいです
    • さまざまな種類

戻り値のオーバーロードの種類を区別するために、

void f(){}
int f(){return 1;}

あなたは、この方法は、ユーザー・コールに依存している呼び出しを区別することができます:

int x = f();    //能够区分
f();            //无法区分  (为了副作用而调用)

オーバーロードメソッドの戻り値を区別するために従う方法は不可能です

デフォルトコンストラクタ

あなたはコンストラクタを定義しない場合、コンパイラが自動的にデフォルトコンストラクタ(「引数なしのコンストラクタ」)を作成します。

このキーワード

class Banana { void peel(int i){/*...*/} }

public class test {
    
    public static void main(String[] args) {
        Banana a = new Banana();
        Banana b = new Banana();
        a.peel(1);
        b.peel(2);
    }
}

コード、皮()どのように私は知っているかBかは、呼び出しているのですか?
コンパイラ“所操作对象的引用”ピール(に渡される最初のパラメータとして)
ので、実際には次のとおりです。

Banana.peel(a, 1);
Banana.peel(b, 2);

この参照は、現在の内部方法を得るためには、コンパイラによって導入された对象的引用、特別なキーワードを設定します。この

コンストラクタコンストラクタを呼び出し

class Banana {
    private String name;
    private double price;

    Banana(double price){
        this.price = price;
    }

    Banana(String name, double price){
        this(price);
        this.name = name;
    }

    public void info(){
        System.out.println("name:" + name + ";price:" + price);
    }
}
  • あなたは<2を呼び出すことはできません - コンストラクタは、ほとんどの先頭に配置する必要があります

静的な意味

  • この方法ではありません
  • あなたは、静的メソッド内の非静的メソッドを呼び出すことはできません
  • あなたは、静的メソッドは(唯一のクラス自体によって)前提の下で任意のオブジェクトを作成しません呼び出すことができます
class Tool {
    public static void sayHi(){
        System.out.println("hello.");
    }
}
public class test {
    public static void main(String[] args) {
        Tool.sayHi();   //仅通过Tool类本身调用,而不是由Tool创建的对象
    }
}
/* Output:
hello.
*/

クリーンアップ:治療の終了とガベージコレクション

  • Javaオブジェクトはガベージコレクションでは、常にではありません
    • オブジェクトはゴミではないかもしれません
    • ガベージコレクションは、「破壊」に等しいではありません
    • ガベージコレクションは、専用メモリ関連のあります

    ガベージコレクション - >使用あなたは、もはやプログラムをリサイクル内存

ネイティブメソッドネイティブメソッド

どのようにガベージコレクタの作品

  • ヒープ割り当てられたオブジェクトを犠牲にして非常に高いです
  • Javaのガベージコレクタはでき向上させるオブジェクトの作成速度を - >だから、Javaからヒープ率スペースの割り当てとは異なる言語スタックに匹敵上の速度分布スペース

いくつかのガベージコレクション:

  1. 参照カウント

シンプルな、遅いです

各オブジェクトは、参照カウンタをインクリメントする接続オブジェクトの参照カウントへの参照がある場合、;ガベージコレクタは、すべてのオブジェクトが参照カウント= 0、スペースを解放することが見出されたオブジェクトのリストに含ま横切ります

  1. 高速化モード

理論的根拠:任意の「ライブ」--- --->スタックまたは静的格納領域で参照バックオブジェクトにトレースすることができ、この領域でのすべての参照を介して見つけることができます--- --->すべての「ライブ」オブジェクト

対処する方法を「ライブ」オブジェクトが見つかりました。

  • 停止-コピー
    (新しいアドレスにマッピングされるように、古いアドレス)を別のヒープにすべての「ライブ」オブジェクトをコピーするプログラムを一時停止するために実行します

短所:非効率的な、スペースを消費

  • マーク-スイープ
    ライブオブジェクトを見つける- >マーク、マークのすべての作業が完了し、マークのないオブジェクトが解放されたクリーンアップを開始、残りのオブジェクトを再配置(ヒープ領域の残りの部分のために連続していません)

ごみの量が少ない場合には、それは非常に高速です

おすすめ

転載: www.cnblogs.com/hhhqqq/p/12588151.html