Java拡張のオブジェクト向け(2)


5.instanceof演算子

instanceOf 연산자は、作成されたオブジェクトが特定のクラスのインスタンスであるかどうかを尋ねる演算子です.instanceof演算子は、結果としてtrueまたはfalseを返します.使い方は以下の通りです.
객체_참조_변수 instaceOf 클래스명
サンプルコードは次のとおりです.
package instaceOf01;

class 동물 {

}

class 조류 extends 동물 {

}

class 펭귄 extends 조류 {

}

public class Driver {
    public static void main(String[] args) {
        동물 동물객체 = new 동물();
        조류 조류객체 = new 조류();
        펭귄 펭귄객체 = new 펭귄();
    
    	System.out.println(동물객체 instanceOf 동물);
        
        System.out.println(조류객체 instanceOf 동물);
        System.out.println(조류객체 instanceOf 조류);
        
        System.out.println(펭귄객체 instanceOf 동물);
        System.out.println(펭귄객체 instanceOf 조류);
        System.out.println(펭귄객체 instanceOf 펭귄);
        
        System.out.println(펭귄객체 instanceOf Object);
    }
}
実行するとtrueです.
package instaceOf02;

class 동물 {

}

class 조류 extends 동물 {

}

class 펭귄 extends 조류 {

}

public class Driver {
    public static void main(String[] args) {
        동물 동물객체 = new 동물();
        동물 조류객체 = new 조류();
        동물 펭귄객체 = new 펭귄();
    
    	System.out.println(동물객체 instanceOf 동물);
        
        System.out.println(조류객체 instanceOf 동물);
        System.out.println(조류객체 instanceOf 조류);
        
        System.out.println(펭귄객체 instanceOf 동물);
        System.out.println(펭귄객체 instanceOf 조류);
        System.out.println(펭귄객체 instanceOf 펭귄);
        
        System.out.println(펭귄객체 instanceOf Object);
    }
}
上記の例で実行した結果もtrueです.객체 참조 변수 타입이 아닌 실제 객체의 타입에 의해 처리하기 때문이다.instaceOf演算子はクラスの継承関係だけでなく、インタフェースの実装関係にも適用されます.
package instaceOf03;

interface 날수있는 {

}

class 박쥐 extends 날수있는 {

}

class 참새 extends 날수있는 {

}

public class Driver {
    public static void main(String[] args) {
        날수있는 박쥐객체 = new 박쥐();
        날수있는 참새객체 = new 참새();
        
        System.out.println(박쥐객체 instanceOf 날수있는);
        System.out.println(박쥐객체 instanceOf 박쥐);
        
		System.out.println(참새객체 instanceOf 날수있는);
        System.out.println(참새객체 instanceOf 참새);
    }
}
実行してもまだ本当だ.

6.packageキーワード


packageキーワードは、ネーミングスペース(ネーミングスペース)を作成する役割を果たします.異なるパッケージごとに同じクラス名があっても、全く異なるクラスになります.

7.interfaceキーワードとimplementsキーワード


インタフェースは共通抽象法と共通静的定数しか持たない.また,インタフェースは抽象メソッドと静的定数しか持たないため,メソッドにpublicとabstractを付加しなくても属性にpublicとstaticとfinalを追加するとJavaは自動的に貼り付けられる.
また、java 8には「変数に格納できる論理(関数)」람다も登場する.変数は、値を格納したり、メソッドのパラメータとして使用したり、メソッドの戻り値として使用したりできます.最終的にramdaのため,論理を変数に格納することができ,論理を方法のパラメータとして用いることができ,論理を方法の戻り値として用いることができると結論した.これはJavaも関数型言語の持つ特性を受け入れていることを意味する.
JavaではRamdaはインタフェースをベースにしています.したがって、java 8までのインタフェースは静的定数および抽象的な方法しか持たないが、java 8から디폴트 메서드と呼ばれるオブジェクト構築方法および静的抽象的な方法をサポートすることができる.

9.このキーワード

this는 객체가 자기 자신을 지칭할 때 쓰는 키워드이다.の領域変数とオブジェクト変数の名前が同じである場合、領域変数には優先度があります.すなわち、この値は、領域変数ではなくオブジェクト変数に格納された値を使用し、領域変数とオブジェクト変数の名前が同じである場合に使用します.varと呼ばれる場合は、オブジェクト変数varに格納されている値が使用されます.
  • 領域変数が属性(オブジェクト変数、静的変数)名と同じである場合、領域変数が優先されます.
  • オブジェクト変数と同じ名前の領域変数がある場合は、その変数を接頭辞として使用します.
  • の静的変数と同じ名前の領域変数がある場合は、クラス名を接頭辞として使用します.
  • 8.superキーワード

    super는 바로 위 상위 클래스의 인스턴스를 지정하는 키워드다.
    package Super;
    
    class 동물 {
        void method() {
            System.out.println("동물");
        }
    
    class 조류 extends 동물 {
        void method() {
            super.method();
            System.out.println("조류");
        }
    }
    
    class 펭귄 extends 조류 {
        void method() {
            super.method();
            System.out.println("펭귄");
            
            // Syntax error on token "super", Identifier expected
            // super.super.method();
        }
    }
    
    public class Driver {
        public static void main(String[] args) {
            펭귄 뽀로로 = new 펭귄();
            뽀로로.method();
        }
    }
    スーパーキーを使用して親クラスのインスタンスメソッドを呼び出しています.でもsuper親のインスタンスにスーパー形式でアクセスできません.

    10.オブジェクトメンバーメソッド

    package stack;
    
    class 펭귄 {
        void test() {
            System.out.println("Test");
        }
    }
    
    public class Driver {
        public static void main(String[] args) {
            펭귄 뽀로로 = new 펭귄();
            
            뽀로로.test();
        }
    }
    
    ペンギンオブジェクトがPOROではなく、ペンギン[100]のような要素が100個並んでいる場合、ヒップ領域で発生するペンギンオブジェクトは100個あり、test()メソッドもペンギンオブジェクトごとにヒップに100個作成します.
    ただし、オブジェクトメンバーメソッドは、オブジェクトごとに異なるわけではありません.オブジェクトメンバーメソッドのみで使用されるオブジェクトメンバーのプロパティの値が異なります.臀部領域に100個の同じオブジェクトメンバーを作成する方法のテスト()は、深刻なメモリ浪費です.
    したがって、JVMは、オブジェクトメンバーメソッドを静的領域の1つのみにインテリジェントに保持します.また、オブジェクトメンバーメソッドを呼び出すと、オブジェクト自体を表すthisオブジェクト参照変数はスキップされますが、表示されません.すなわち、上記のコードは、JVMによって以下のような変更と見なすことができる.
    package stack;
    
    class 펭귄 {
        static void test(펭귄 this) {
            System.out.println("Test");
        }
    }
    
    public class Driver {
        public static void main(String[] args) {
            펭귄 뽀로로 = new 펭귄();
            
            펭귄.test(뽀로로);
        }
    }
    Tメモリで次のように表示されます.

    リファレンス
  • Javaオブジェクト向けSpringの入門原理と
  • を理解する