[Javaの定義]CHAPTER 6:オブジェクト向けプログラミングI


1.対象言語

  • コードの再利用性が高い.
    新しいコードを作成する場合は、既存のコードを使用して簡単に作成できます.
  • コードは管理が容易です.
    コード間の関係を利用して、少ないワークロードで簡単にコードを変更することができます.
  • は、高信頼性プログラミングを可能にする.
    制御者と方法を使用して、データを保護し、正しい値を維持し、コードの重複を解消し、コードの不一致によるエラー行為を防止することができます.
  • 2.クラスとオブジェクト


    オブジェクトとインスタンス

    class Tv{ 
        // TV의 속성(멤버변수)
        String color; // 색상
        boolean power; // 전원상태(on/off)
        int channel; // 채널
    
        void power(){power = !power;} // tv를 켜거나 끄는 기능을 하는 메서드
        void channelUp(){++channel;} // tv의 채널을 높이는 기능을 하는 메서드
        void channelDown(){--channel;} // tv의 채널을 낮추는 기능을 하는 메서드
    }
    
    public class TvTest {
        public static void main(String args[]){
            Tv t1 = new Tv(); // tv 인스턴스를 참조하기 위한 변수 t를 선언하고, 인스턴스 생성한다.
            Tv t2 = new Tv();
            t1.channel = 7; // tv 인스턴스의 멤버변수 channel의 값을 7로 한다.
            t1.channelDown(); // tv 인스턴스의 메서드를 호출한다.
            System.out.println("현재 채널은 " + t1.channel + "입니다.");
        }
    }
  • 参照変数は1つの値(アドレス)しか格納できないため、2つ以上の参照変数は1つのインスタンスを指すことができるが、1つの参照変数として複数のインスタンスを指すことはできない.
  • カテゴリ

  • 対象理論的観点
  • オブジェクトを生成するフレームワーク/クラスは、属性と機能として定義されます.
  • プログラミングの観点
  • データと関数の欠陥
  • データは関数と密接に関係しています.
  • なぜc言語では文字列は文字の配列であり、Javaでは文字列はStringクラスであるのか.
    これは、文字列と文字列を処理するために必要な関数を組み合わせるためです.

    3.変数と方法


    宣言位置による変数タイプ


  • メンバー変数
  • クラス変数(静的変数、共有変数)
  • インスタンスを作成する必要がなく、いつでも使用できます.
  • インスタンス変数
  • インスタンスを生成して使用できます.
  • 地域変数
  • 地域変数が宣言されたブロックでのみ使用できます.
  • 使用方法の理由

  • 高可用性
    一度作成したメールは何度でも呼び出すことができます.
  • 冗長コードの削除
    重複する文をメソッドとして作成すると、変更が発生したときにこのメソッドを変更するだけでコード重複を解消できます.
  • 計画の構造化
    プロセス全体を一目瞭然にするためには、簡単に構造化することが望ましい.プログラムに問題が発生した場合も、この部分を簡単に見つけて解決することができます.
  • JVMのメモリ構造


  • 基本パラメータ
    レプリカは、元のレプリカではなく
  • に変更されました.
  • class Data{
        int x;
    }
    
    public class PrimitiveParamEx {
        public static void main(String args[]) {
            Data d = new Data();
            d.x = 10;
            System.out.println("main() : x = " + d.x);
    
            change(d.x);
            System.out.println("After change(d.x)");
            System.out.println("main() : x = " + d.x);
        }
    
        static void change(int x) {
            x = 1000;
            System.out.println("change() : x = " + x);
        }
    }
    change() : x = 1000
    After change(d.x)
    main() : x = 10
  • 参照型パラメータ
  • の値を持つアドレスではなく、
  • の値を持つアドレスを返します.
  • class Data{
        int x;
    }
    
    public class ReferenceParamEx {
        public static void main(String[] args) {
            Data d = new Data();
            d.x = 10;
            System.out.println("main() : x = " + d.x);
    
            change(d);
            System.out.println("After change(d)");
            System.out.println("main() : x = " + d.x);
        }
    
        static void change(Data d) {
            d.x = 1000;
            System.out.println("change() : x = " + d.x);
        }
    }
    main() : x = 10
    change() : x = 1000
    After change(d)
    main() : x = 1000
  • 戻りタイプは、メソッドがオブジェクトのアドレスを返すことを意味する参照タイプである.
  • クラスメソッドとインスタンスメソッド

  • クラスを設計すると、メンバー変数のすべてのインスタンスに共通の静的が追加されます.
  • を生成する各インスタンスは独立しているため、各インスタンス変数は異なる値を維持する.ただし、すべてのインスタンスで同じ値を維持する必要がある変数については、staticを貼り付けてクラス変数として定義する必要があります.
  • クラス変数(静的変数)は、インスタンスを作成する必要がなく使用できます.
  • の静的変数は、クラスがメモリに入ると自動的に生成されます.
  • クラスのメールでは、インスタンス変数は使用できません.
  • インスタンス変数は、インスタンスを作成する必要がなく呼び出すことができるため、クラスメソッド呼び出し時にインスタンスが存在しない可能性があります.
  • インスタンス変数またはインスタンスメソッドでは、常に静的メンバーを使用できます.
  • メソッドでインスタンス変数が使用されない場合は、静的貼り付けを考慮します.
  • メソッドの作業内容にインスタンス変数が必要な場合は、静的を貼り付けることはできません.
  • インスタンス変数が必要でない場合はstaticを貼り付けます.
  • メソッドの呼び出し時間を短縮することで、パフォーマンスが向上します.
  •  class MyMath{
        long a, b;
        
        long add() { return a + b;}
        long subtract() { return a - b;}
        
        static long add(long a, long b) { return a + b;}
        static long subtract(long a, long b) { return a - b;}
    }
    
    public class MyMathTest {
        public static void main(String[] args) {
        	// 클래스 메서드 호출. 인스턴스 생성없이 호출가능
            System.out.println(MyMath.add(200, 201));
            System.out.println(MyMath.subtract(200, 201));
    
            MyMath mm = new MyMath();
            mm.a = 200; 
            mm.b = 201;
            // 인스턴스 메서드는 객체생성 후에만 호출이 가능함
            System.out.println(mm.add());
            System.out.println(mm.subtract());
        }
    }

    4.過負荷


    かふかじょうけん

  • メソッド名は同じでなければなりません.
  • パラメータの個数またはタイプは異なる必要があります.
  • 戻りタイプは、オーバーロードの実装に何の影響もありません.
  • 可変パラメータとオーバーロード

    public class VarArgxEx {
        public static void main(String[] args) {
            String[] strArr = {"100", "200"};
    
            System.out.println(concatenate("", "100", "200")); // 컴파일에러 발생
            System.out.println(concatenate("", strArr));
    
    
        }
    
        static String concatenate(String delim, String... args) {
            String result = "";
            for (String str : args) {
                result += str + delim;
            }
            return result;
        }
    
        static String concatenate(String... args) {
            return concatenate("", args);
        }
    }
  • で可変因子を宣言するメソッドをオーバーロードすると、メソッドを呼び出すときに区別できないことが容易に発生します.
  • 可能であれば、可変パラメータを使用する方法は過負荷しないほうがいいです.

    5.ジェネレータ


    作成者とは?


    インスタンスの作成時に呼び出されるインスタンスの初期化方法.
    インスタンスの作成時に実行するアクションにも使用できます.

    コンストラクション関数から別のコンストラクション関数を呼び出す-this(),this


    クラス名ではなくthisを
  • ジェネレータの名前として使用します.
  • のあるコンストラクション関数から別のコンストラクション関数を呼び出す場合は、最初の行からのみ呼び出す必要があります.
  • ジェネレータで初期化操作中に他のジェネレータを呼び出すと、呼び出された他のジェネレータでもメンバー変数の値が初期化されるため、他のジェネレータを呼び出す前の初期化操作は意味がなくなる可能性があります.(論理が複雑になる?)
  • this:インスタンス自体を指す参照変数、インスタンスのアドレスが格納されます.すべてのインスタンスメソッドに領域変数として存在します.
  • this()、this(パラメータ):同じクラスの他のコンストラクション関数を呼び出すコンストラクション関数.
  • 6.初期化変数

  • メンバー変数は、初期化する必要がなく、変数のデータ型に基づいて自動的に初期化できます.
  • 領域変数は、使用前に初期化する必要があります.
  • メンバー変数の初期化方法

  • 明示的初期化
  • 宣言と同時に変数
  • を初期化する.
  • ジェネレータ
  • 初期化ブロック
  • インスタンス初期化ブロック:インスタンス変数を初期化するための
  • クラス初期化ブロック:クラス変数を初期化するための
  • クラス初期化ブロックは、クラスが初めてメモリにロードされたときにのみ実行されます.
    インスタンス初期化ブロックは、コンストラクション関数などのインスタンスを作成するたびに実行されます.
    インスタンス初期化ブロックは作成者より先に作成されます
    クラスが最初にロードされると、クラス変数は自動的にメモリに作成され、クラス初期化ブロックはクラス変数を初期化します.

    メンバー変数の初期化時間と順序

  • クラス変数の初期化ポイント:クラスを最初にロードしたときに一度だけ初期化します.
  • クラス変数の初期化順序:デフォルト->明示的初期化->クラス初期化ブロック
  • インスタンス変数の初期化ポイント:インスタンスが作成されるたびに、各インスタンスが初期化されます.
  • インスタンス変数の初期化順序:デフォルト->明示的初期化->インスタンス初期化ブロック->作成者