(ジャワ議政石)Chapter 05-07紛らわしい内容を整理


Chapter05


1.int[]宣言

int[] score = new int[]{50, 60, 70, 80, 90};

int[] score = {50, 60, 70, 80, 90};

int[] score;
score = new int[]{50, 60, 70, 80, 90};
int[] score;
score = {50, 60, 70, 80, 90};
このような状況は不可能だ.前述のようにnewint[]{50,60,70,80,90}宣言を使うべきだ.

2. Arrays.toString()

int[] arr = {100, 96, 80, 70, 60};
System.out.println(Arrays.toString(arr));
[100, 95, 80, 70, 60]
Arrays.TOString()メソッドを使用してきれいなアレイを出力

3. Arrays.deepToString()

int[] arr = {0, 1, 2, 3, 4};
int[][] arr2D = {{11,12}, {21,22}};

System.out.prinln(Arrays.toString(arr));
System.out.prinln(Arrays.deepToString(arr2D));
2 Dアレイの場合、Arrays.deepToString()メソッドを使用します.

4. Arrays.deepEquals()

String[][] str2D = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2 = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};

System.out.println(Arrays.equals(str2D, str2D2));    //false
System.out.prinln(Arrays.deepEquals(str2D, str2D2)); //true
2 D配列の交差はArraysです.equals()ではなく、Arraysです.deepEquals()を使用します.

5. Arrays.copyOf()

int[] arr = {0, 1, 2, 3, 4};
int[] arr2 = Arrays.copyof(arr, arr.length); // arr2=[0, 1, 2, 3, 4]
int[] arr3 = Arrays.copyOf(arr, 7); // arr3 = [0, 1, 2, 3, 4, 0, 0]
配列範囲のあるindexがスーパーで表示された場合、0の配列が作成されます.

6. Arrays.copyOfRange()

int[] arr = {0, 1, 2, 3, 4};
int[] arr2 = Arrays.copyOfRange(arr, 2, 4); // arr2 = [2, 3];
int[] arr3 = Arrays.copyOfRange(arr, 0, 7); // arr3 = [0, 1, 2, 3, 4, 0, 0];

7. Arrays.sort()

int[] arr = {3, 2, 0, 1, 4 };
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]

Chapter06


1.初期化領域変数

class InitClass {
    int x;
    int y = x;
    
    void method1() {
        int i;
        int j=i; // 지역변수를 초기화하지 않고 사용했기떄문에 ERROR!
    }
}
ゾーン変数は手動で初期化する必要があります.(領域変数の生成と消失のサイクルが速いため、任意の値に初期化するたびにメモリの無駄が大きくなるため、手動で初期化する必要があります.)

2.静的{}初期化ブロック

class StaticBlockTest {
    static int[] arr = new int[10];
    
    static {
        for( int i = 0 ; i < 10 ; i++ } {
            arr[i] = (int)(Math.random() * 10) + 1;
        }
    }
}
明示的な初期化のみではarr配列に値は生成されないため、静的初期化ブロックを使用して配列初期化値を使用することができます.

3.メンバー変数の初期化点




上の図を見て考えると、オブジェクト生成時にメンバー変数がどのような順序で初期化されているかがわかりやすい!

Chapter07


1.クラス間の関係の決定

  • 継承関係:AはBです.
  • は関係を含む:AはBを有する.(多くは含む関係)
  • 2.super()祖先の作成者


    各ジェネレータは、最初の行で別のジェネレータを呼び出します.
    ない場合、コンパイラはsuper()を自動的に呼び出し、最終的にobjectクラスのジェネレータにアクセスします.
    他のジェネレータの最初の行を覚えておいてください.

    3.多形性

  • 祖先タイプの参照変数で、子孫タイプのインスタンスに近い.
  • 子孫タイプの参照変数として、祖先タイプのインスタンスに近づくことはできません.
    どうしたんですか.参照変数で参照する変数がインスタンスにない場合(欠落した呼び出し)、エラーが発生します.これは動作しないためです.
  • 4.参照変数の形式を変換

  • 一般変数は、タイプを変換するときに値を変更しますが、参照変数は、タイプを変換するときにアドレス値、オブジェクトを変更せず、使用可能なメンバーの数だけを変更します.
  • 祖先/子孫関係の場合にのみ変換できます!
  • 参照変数の変形は、祖先/子孫関係の場合に可能である.しかし,変換型では,実際のインスタンスが何であるかが最も重要である.
    重要なのは、実際のオブジェクト(参照変数ではなく)のメンバーを決定し、その範囲内の参照変数タイプを指定することです.(呼び出しコンパイルに問題がなく、実際の操作にない値の場合、エラーが発生します)
  • 5.instanceof演算子

    if( a instanceof FireEngine ) {
        FireEngine fe = (FireEngine)a;
    }
    参照変数のシェイプを変換する前に、instanceof演算子を使用してシェイプ(親子関係)を変換できるかどうかを決定する必要があります.

    6.マルチフォームのメリット

  • 参照型パラメータは、メソッド呼び出し時に、自分と同じタイプまたはサブタイプのインスタンスを渡すことができる.
  • 祖先タイプ配列に子孫を収容できるオブジェクト.
  • 7.抽象化のメリット


    Calendarクラスの例)
    public static Calendar getInstance9Locale aLocale) {
        return createCalendar(TimeZone.getDefault(), aLocale);
    }
    
    private static Calendar getInstance(Locale aLocale) {
        //···
        if (caltype != null) {
            switch (caltype) {
            case "buddhist" :
                cal = new BuddhistCalendar(zone, aLocale);
                break;
            case "japanse" :
                cal = new JapaneseImperialCalendar(zone, aLocale);
                break;
            case "gregory":
                cal = new GregorialCalendar(zone, aLocale);
                break;
            //···
            }
        }
        //···
    }
    Calendarクラスの場合、
    GregorianCalendar cal = new GregorianCalendar(); //구체적
    Calendar cal = Calendar.getInstance(); //추상적
    具体的な実装new演算子を使用してインスタンスを作成するよりも、CalendarクラスのgetInstance()メソッドを使用してインスタンスを実装します.
    前述したCalendarクラスの一部に示すように、特定のコードよりも柔軟で、変更に便利です.
    変更が発生した場合、メソッド呼び出しの部分を変更する必要はなく、getInstance()メソッドまたは部分を変更するだけです.

    8.抽象クラスとインタフェースの違い


    抽象クラスは,ジェネレータ,メンバ変数などの基本クラス要素を備えた後,抽象メソッドの形式を備え,インタフェースは抽象メソッドの集合である.(インタフェースには定数、静的メソッド、defaultメソッドがありますが、コアではありません)
    結果はインスタンス変数であり、インスタンスメソッドの違いがあるかどうかです.

    9.インタフェースの省略


    定数はpublic static finalを省略することができて、方法はpublic abstractを省略することができて、インタフェースの上でいつもついているためです!(コンパイラは自動的に一部を追加します)

    10.インタフェースの祖先


    インタフェースの祖先はインタフェースのみです(オブジェクトは最初の祖先ではありません)

    11.インタフェースのメリット


  • 接続、対話、コミュニケーション対象の中間的な役割を果たす.
    外殻と卵殻を区別して卵殻を交換しても、外殻から卵殻に近づくことはでき、修正する必要はありません.(柔軟な変更-分散結合)

  • 開発時間を短縮できます.
    柔軟な設計が変更に役立ちます
    標準化可能
    相互に関係のない等級関係を確立することができる.
  • 12.インタフェースのdefaultメソッドと静的メソッド

    interface Myinterface {
        void method();
        void newMethod();
    }
    interface MyInterface {
        void method();
        default void newMetrhod(){}
    }
    interfaceのすべてのメソッドは抽象メソッドであり,体幹を持つdefaultメソッドが追加されている.
    これにより、エラーメソッドが既存のメソッドと競合します.
    必要に応じて、過圧で使用する必要があります.