ファイブは、初期化し、Javaプログラミングのアイデアをクリーンアップ

コンピュータ革命の発展に伴い、「安全でない」プログラミング方法は、プログラミング徐々に高価な変化の一つとして知られています。
初期化とクリーンアップは二つの問題のセキュリティを必要とします。

5.1コンストラクタでその初期化を確実に

コンフィギュレーションを提供することにより、設計者は、オブジェクトの各クラスが初期化されていることを確認することができます。
自動的に同じ名前を使用して、コンストラクタ、コンストラクタとクラスを呼び出すために、初期化の際に考慮にコンパイラを撮影。
あなたがオブジェクトを作成すると、そのオブジェクトのためのストレージスペースを割り当て、適切なコンストラクタを呼び出します。
それは戻り値(voidを返す空の場合、任意の戻り値)を有していないので、コンストラクタは、この方法の特別なタイプです。

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

異なるパラメータおよび方法の形態の同名の方法。

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

各オーバーロードされたメソッドは、パラメータの型のユニークなリストを持っている必要があります。異なるパラメータの順序は、2つの方法の間に十分な差があります。

ヘビーデューティーの基本的な型を含む5.2.2

入ってくる実際のパラメータは、仮パラメータ宣言されたメソッドの型より小さい場合は、実際のデータ型が解除されます。
仮パラメータの入ってくる実際のパラメータの型が宣言されたメソッドよりも大きい場合には、変換のタイプは、必要な変換を狭くすることによって行われます。

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

デフォルトコンストラクタは、正式なパラメータではありません - その役割は作成することで、「既定のオブジェクトを。」

5.4このキーワード

次のコードを見てください:

Banana a=new Banana();
Banana b=new Banana();
a.peel(1);
b.peel(2);

上記のコードでは、オブジェクトにその背後にいくつかの作業を行うようにコンパイラにメッセージを送信します。それは密かに()を剥離する最初の引数として動作オブジェクトです。

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

このキーワードは、内部メソッドを使用することができ、それは参照「メソッドを呼び出すためにそのオブジェクトを」発現しました。
これ。他の方法と現在のオブジェクトのキーワードも有用です。

5.4.1は、コンストラクタで、コンストラクタを呼び出します

私はあなたがこれを行うことができ、これを使用するために、コンストラクタで別のコンストラクタを呼び出したいです。
これは、コンストラクタを呼び出すことができますが、次の2つを呼び出すことはできません。

5.4.2静的な意味

内部静的メソッドで非静的メソッド、およびその逆缶を呼び出すことはできません。

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

Javaのガベージコレクタは役に立たないオブジェクトが占めるメモリリソースを再利用する責任があります。しかし、特別の事情がある:それはオブジェクトのために、この特別なメモリを解放する方法を知りませんすべて、ガベージコレクタは唯一の新しいによって割り当てられているメモリを解放するために知っているので、あなたのオブジェクトは、メモリの面積を得るために、(新しい使用していない)と仮定します。
ガベージコレクタは、オブジェクトによって占有されていたメモリを解放する準備ができたら、最初の()メソッド、およびアクションが発生した次のガベージコレクションを完成呼び出します。これに対処するために、Javaはファイナライズに定義されているという名前のクラス()メソッドを許可しますときは本当にオブジェクトによって占有されていたメモリを再利用します。しかし、ノートファイナライズは()デストラクタと同じではありません。
C ++では、オブジェクトが破壊されると、Javaオブジェクトはガベージコレクションされ、常にではありません。

  • オブジェクトはゴミではないかもしれません
  • ガベージコレクションは、「デストラクタ」を意味するものではありません
5.5.1ファイナライズ()は何を使用しています

ガベージコレクションは、専用メモリと関連しています。
メモリ回復プログラムのためのガベージコレクタを使用する唯一の理由は、使用されていません。
どんなにオブジェクトが作成されるか、ガベージコレクタは、オブジェクトによって占有されたすべてのメモリを解放する責任がありません。

あなたがクリーンアップするために実装する必要があります5.5.2

Java仮想マシンは、とメモリ不足の状況に直面していない場合は、メモリを復元するためにガベージコレクションを実行するための時間の無駄ではありません。

5.5.3終了条件

オブジェクトは長く関心のない場合は - つまり、それはクリーンアップすることができ、オブジェクトが特定の状態であってはならない、それはメモリが安全に解放することができます占めていました。

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

ヒープ・オブジェクトに再割り当てのコストしかし、ガベージコレクタオブジェクトが速度を向上させるために、しかし有意な結果を使用して作成され、非常に高いです。
Java仮想マシン・ヒープ実現の一部では:それはより多くのコンベアベルトのようなものだ、それは前方の1つのスペースを移動する、新しいオブジェクトを割り当てることができませんでした。
それは簡単にコンベヤベルトの始まりに近い移動させることができるように、ガベージコレクション、それは動作しますが、片側の再利用スペース、物体側には、コンパクトなスタックに配置されるように、スタックポインタ、ページフォールトを回避することができます。ガベージコレクタによってヒープ割り当てのための高速、無線空間モデルを実現し、オブジェクトを再配置。
他のシステムでのガベージコレクションのメカニズム:技術的な参照方法、ガベージコレクションの単純だが遅い速度。各オブジェクトは、オブジェクトが参照カウントがインクリメントされた接続への参照を持っている場合、カウンタを有しています。参照がスコープ外になるか、nullに設定した場合、参照カウントがデクリメントされます。
より高速モードの場合:任意の生きているオブジェクトのために、あなたは最終的には、スタックまたは参照の静的な記憶領域に彼らの生存にさかのぼることができるようになります。
Java仮想マシンは、適応ガベージコレクションを使用しています。
呼ばれる慣行がありますコピー-停止プログラムの実行を一時停止し、その後、別のヒープに現在のヒープからコピーされたすべてのライブオブジェクトは、それらはゴミをコピーされません。オブジェクトが新しいコンパクトな配置でスタックを保持し、新しいスタックにコピーされたとき。
安定した状態にプログラムでは、廃棄物をコピーするようにします。チェックするためにいくつかのJava仮想マシン:新しいごみは他のモードに変換されません場合はマーク-スイープ:すべての参照を介して、スタックおよび静的な記憶領域から、その後、すべてのライブオブジェクトを見つけ、いつでもそれライブオブジェクトを見つけ、オブジェクトがマークを与えるだろう、このプロセスは、任意のオブジェクトを回復することはありません。唯一のクリーンアップ動作が開始されるときに完了マークを付けます。洗浄工程では、任意のコピーアクションを送信しません、目立ったオブジェクトが解放されませんがあります。

5.6メンバーの初期化

使用前にすべてのトラバースが適切に初期化することができます:Javaは確保してみてください。ローカル変数の方法については、間違った形でのJavaは、コンパイル時に実装します。
あなたはクラスのオブジェクト参照を定義するとき、あなたがそれを初期化していない場合は、この引用は、特殊なヌル値を取得します。

その割り当てのための場所でメンバ変数の定義5.6.1。

初期化する5.7コンストラクタ

実行時に、あなたは初期値を決定するためのメソッドを呼び出したり、何らかのアクションを実行することができます。しかし、覚えておいて:あなたは、それはコンストラクタで呼び出されます、自動初期化が行われ停止することはできません。

5.7.1初期化シーケンス

クラス内で、配列は変数の初期化の順序を決定します。いずれかのメソッドが呼び出される前に、それらの間を定義するためのウォーキング変数定義方法はまだ初期化されます。

5.7.2静的データの初期化

どんなに多くのオブジェクトが作成されるか、静的データは、唯一の記憶領域を占有しません。キーワードは、静的ローカル変数に使用することはできませんので、それが唯一のフィールドに基づいて行動することができます。フィールドは静的な基本的なタイプのフィールドであり、それを初期化していない場合は、標準の初期値の基本的なタイプを取得します。それがオブジェクト参照である場合は、そのデフォルトの初期値はnullです。



public class StaticInitialization {
    static Table table =new Table();
    static Cupboard cupboard=new Cupboard();
    public static void main(String[] args){
        System.out.println("in main");
        new Cupboard();
        new Cupboard();
        table.f2(1);
        cupboard.f3(3);
    }
}

class Bowl{
    Bowl(int marker){
        System.out.println("Bowl("+marker+")");
    }
    void f1(int marker){
        System.out.println("f1("+marker+")");
    }
}

class Table{
    static Bowl bow1=new Bowl(1);
    Table(){
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2(int marker){
        System.out.println("f2("+marker+")");
    }
    static Bowl bowl2=new Bowl(2);
}

class Cupboard{
    Bowl bowl3=new Bowl(3);
    static Bowl bowl4=new Bowl(4);
    Cupboard(){
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }
    void f3(int marker){
        System.out.println("f3("+marker+")");
    }
    static Bowl bowl5=new Bowl(5);
}

初期化シーケンスは、最初の静的オブジェクトは、「非静的」オブジェクトです。
オブジェクトの作成、あなたが犬というクラスがあるとします。

  • 1.でも、静的なキーワードを使用せず、コンストラクタは実際に明示的に静的メソッドです。
  • 2.静的初期化に関連するすべてのアクションが実行される際にオブジェクトを作成し、最初のエグゼクティブする)新しい犬を(ロードします。
  • 3.あなたが新しい犬(でオブジェクトを作成)、最初の犬のオブジェクトのための十分な記憶領域を割り当てます。
  • 4.このストレージスペースは自動的に犬におけるデータオブジェクトのすべての基本タイプがデフォルト値に設定されているだろう、と参照が設定されたヌルとなった、クリアされます。
  • 5.表示されるフィールドでの初期動作のすべてを定義します。
  • 6.コンストラクタを実行します。
5.7.3明示的な静的初期化

Javaは特別に編成複数の静的初期化アクションできる「静的な句を。」

public class Spon{
static int i;
static{
i=47;
}
}
5.7.4非静的インスタンスの初期化

Javaはまた、同様の構文は、インスタンス化として知られている各オブジェクトの非静的変数を初期化するために使用されています。

5.8配列の初期化

配列は、標的配列へのパッケージの唯一の同じタイプの又は実質的に一緒にデータ配列識別名のタイプです。角括弧の添字演算子[]で配列を定義して使用することができます。
同じ配列とC#を使用してください。

5.8.1変数パラメータリスト

すべてのクラスは、直接的または間接的にObjectクラスから継承されている、あなたは、パラメータとして配列をオブジェクトにメソッドを作成することができます。

public class VarArgs {

    public static void main(String[] args){
       // printArray1(15,13,16,34,"wer",new Integer[]{1,2,3,4});
        printArray1(new Integer[]{1,2,3,4});
    }

    static void printArray1(Object[] args){
        for (Object obj:args) {
            System.out.println(obj);
        }
    }
}

JavaのSE5は、新しい可変パラメータの構文を追加します。可変パラメータには、任意のタイプのパラメータは、プリミティブ型を含め、使用されてもよいです。

 static void printArray(Object... args){
        for (Object obj:args) {
            System.out.println(obj);
        }
    }

    public static void main(String[] args){
        printArray(15,13,16,34,"wer",new Integer[]{1,2,3,4});
        printArray(new Integer[]{1,2,3,4});
    }

変数パラメータ0に渡されたパラメータも可能です。

public class VarArgs {
    static void printArray(Object... args){
        for (Object obj:args) {
            System.out.println(obj);
        }
    }

    public static void main(String[] args){
       // printArray1(15,13,16,34,"wer",new Integer[]{1,2,3,4});
       // printArray1(new Integer[]{1,2,3,4});
        printArray();
    }

//    static void printArray1(Object[] args){
//        for (Object obj:args) {
//            System.out.println(obj);
//        }
//    }
    //printArray1(15,13,16,34,"wer",new Integer[]{1,2,3,4});
}

5.9列挙

public class SimpleEnumUse {
    public static void main(String[] args){
        Spiciness howHot=Spiciness.MEDIUM;
        for (Spiciness spic:Spiciness.values()) {
            System.out.println(spic+":"+spic.ordinal());
        }

    }
}
 enum Spiciness{
    NOT,MILD,RT,MEDIUM,HOT,FLAMING
}

おすすめ

転載: www.cnblogs.com/Tan-sir/p/11228595.html