[Java]オブジェクト向けプログラミング1


クラスメソッド(静的メソッド)とインスタンスメソッド
  • 클래스 메서드オブジェクトを作成することなく、オブジェクトを呼び出すことができます.

  • クラスを設計するときに、staticをメンバー変数のすべてのインスタンスの共通項目に追加します.
    *すべてのインスタンスで同じ値を保持する必要がある変数については、staticを貼り付け、クラス変数として定義する必要があります.

  • クラス変数はインスタンスを作成する必要はありません.
    *클래스 변수追加の変数は、クラスがメモリに入ったときに自動的に生成されます.

  • クラスメソッドでは、インスタンス変数は使用できません.
    クラスメソッドは、インスタンスを作成せずに呼び出すことができるため、クラスメソッドを呼び出すときにインスタンスが存在しない可能性があります.
    したがって、インスタンス変数の使用は禁止されます.

  • メソッドにインスタンス変数が使用されていない場合はstaticを貼り付けることを考慮します.
    インスタンス変数が必要ない場合はstaticを貼り付けたほうがいいです.(メソッド呼び出し時間の短縮によるパフォーマンス向上)
    staticを貼り付けないメソッドは、実行時に呼び出す必要があるメソッドを検索する必要があるため、追加の時間がかかります.
  • クラスメンバーとインスタンスメンバー間の参照と呼び出し
  • 個々のインスタンスを作成することなく、同じクラスに属するメンバー間で相互参照または呼び出すことができます.
  • ただし、クラスメンバーがインスタンスメンバーを参照または呼び出したい場合は、インスタンスを作成する必要があります.
  • Class TestClass{
    
    	void instanceMethod(){}
    	static void staticMethod(){}
    
    	void instanceMethod2() {
    		instanceMethod();
    		staticMethod();
    	}
    
    	static void staticMethod2() {
    		instanceMethod();          // 에러!! 인스턴스메서드를 호출할 수 없다.
    		staticMethod();            // static 메소드는 호출할 수 있다.
    	}
    }
    Class TestClass2 {
    	int iv;
    	static int cv;
    
    	void instanceMethod() {
    		System.out.println(iv);
    		System.out.println(cv);
    	}
    
    	static void staticMethod() {
    		System.out.println(iv);      // 에러!! 인스턴스 변수를 사용할 수 없다.
    		System.out.println(cv);      // static 변수는 사용할 수 있다.
    	}
    }
    可変パラメータと過負荷
  • 従来の方法ではパラメータ数は固定されているが、staticからこれらのパラメータを動的に指定することができる.
  • 可変パラメータは、「タイプ...変数名」として宣言されます.
  • public PrintStream printf(String format, Object... args) {...}
    上記の可変パラメータに加えて他のパラメータがある場合は、パラメータに可変パラメータを最後に宣言する必要があります.コンパイルエラーが発生します.(可変パラメータを区別できないため)
    複数の文字列を1つの文字列に結合して返すconcatenateメソッドを作成する場合は、次のように記述する必要があります.
    String concatenate(String s1, String s2) {...}
    String concatenate(String s1, String s2, String s3) {...}
    String concatenate(String s1, String s2, String s3, String s4) {...}
    この場合,可変因子を用いることができる.
    String concatenate(String... str) {...}
    可変因子が内部で配列を利用していることに気づいたかもしれません.したがって、可変パラメータを宣言するメソッドを呼び出すたびに、新しい配列が生成されます.(可変パラメータは便利ですが、無効なパラメータが非表示になっているため、必要に応じてのみ使用できます.)
    では、可変因子は以下のパラメータタイプの配列とどのような違いがありますか?
    String concatenate(String[] str) {...}
    
    String result = concatenate(new String[0]);  // 인자로 배열을 지정
    String result = concatenate(null);           // 인자로 null을 지정
    String result = concatenate();               // 에러. 인자가 필요함.
    パラメータタイプを配列とする場合はパラメータを指定する必要がありますので、上記のコードのようにパラメータを省略することはできません.したがってnullまたは長さ0の配列をパラメータとして指定することは不便である.
    コンストラクション関数から別のコンストラクション関数を呼び出す-this(),this
    this()
    同じクラスのメンバー間で相互に呼び出すことができるように、生成者間でも相互に呼び出すことができます.ただし、次の2つの条件を満たす必要があります.
  • クラス名ではなくthisをジェネレータの名前として使用します.
  • あるコンストラクタから別のコンストラクタを呼び出す場合は、最初の行のみから呼び出す必要があります.
  • 次のコードは、ジェネレータの作成時に守らなければならない2つの条件を満たすことができないため、エラーが発生しました.
    Car(String color) {
    	door = 5;
    	Car(color, "auto", 4);    // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
                                // 에러2. this(color, "auto", 4);로 해야한다.
    }
  • コンストラクタ内の初期化操作中に他のコンストラクタが呼び出されると、呼び出された他のコンストラクタ内でもメンバー変数の値が初期化されます.
  • これにより、他のジェネレータを呼び出す前の初期化操作が無意味になる可能性がある.
  • したがって、他のジェネレータは1行目からのみ呼び出されます.
  • this
    Car(String color, String gearType, int door) {
    	this.color = color;
    	this.gearType = gearType;
    	this.door = door;
    }
  • JDK1.5は、インスタンス自体を指す参照変数です.
  • 変数を参照してインスタンスのメンバーにアクセスできるように、この方法でインスタンス変数にアクセスできます.(スタティックメソッドがインスタンスメンバーを許可しないようにthisは使用できません)
  • this
    インスタンス自体を指す参照変数.インスタンスのアドレスが格納されています.
    すべてのインスタンスメソッドに領域変数として存在します.
    this()
    同じクラスの他のコンストラクション関数を呼び出すコンストラクション関数.
    thisとthis()はあまり差がなく、全然違います.