7.1フィールド

10205 ワード

フィールドフィールドには、「クラスに含まれる変数」でオブジェクトの属性値を指定できます.フィールドは、領域変数のローカル変数と区別する必要があります.ゾーン変数とは、メソッドに含まれる変数のことです.すなわち,フィールドと領域変数は,宣言がどの括弧内にあるかによって区別できる.クラス内のカッコ内で宣言された変数を「フィールド」、メソッド内のカッコ内で宣言された変数を「領域変数」とします.フィールドと領域変数の最大の違いは、生成されたメモリの場所です.フィールドはhipメモリのオブジェクトの内部にあり、領域変数はスタックメモリに作成されます.スタックメモリに格納されている変数は、Java仮想マシンを自動的に削除しますが、hipメモリに格納されているオブジェクトのフィールドが消えない場合は、これらのフィールドは絶対に削除されません.

では、スタックメモリの変数はいつ自動的に削除されますか?宣言したメソッドのカッコが閉じて終了すると、メソッドで宣言したすべての領域変数がメモリから削除されます.次に例を示します.
    int m = 3;   // 상위 중괄호가 클래스일 때는 필드
    int n = 4;    // 상위 중괄호가 클래스일 때는 필드
    void work1() {
        int k = 5; // 상위 중괄호가 메서드일 때는 지역 변수 
        System.out.println(k);
        work2(3);
    }
    void work2(int i) { // 상위 중괄호가 메서드일 때는 지역 변수
        int j = 4;      // 상위 중괄호가 메서드일 때는 지역 변수
        System.out.println(i + j);
    }   
} 
クラスAには、フィールドm、nおよびメソッドジョブ1()およびジョブ2()がある.メソッドは「タイプメソッド名を返す(){...}呈する形態.work 1()メソッドでは領域変数kが宣言され、work 2()メソッドでは領域変数iおよびjが宣言される.ここでは、カッコ内の変数iドメインのカッコ内で定義されているものと見なすことができる.次に、Aクラスのオブジェクトを宣言し、内部フィールドとメソッドを使用します.
A a= new A()
System.out.println(a.m); // 3
System.out.println(a.n); // 4
a.work1(); // 5 -> 7
まずクラスAでオブジェクトを生成し,参照変数名をaと宣言する.および参照変数aと点演算子(.)フィールドmとnを出力した値を使用します.最後にwork 1()メソッドが呼び出されました.work 1()メソッドでは、work 2(3)のようにwork 2()メソッドを呼び出し、これを入力パラメータとして3を超え、work 2()メソッドの入力パラメータint i=3となる.方法はまだマスターしていないので、理解できないところがあっても、先にスキップしましょう.しかし、一定の流れを把握することができます.メモリを見てみましょう.

まずオブジェクトが作成されるので、HipMemoryではAクラスのオブジェクトが作成されます.このオブジェクトには、クラスのメンバーフィールドm、n、およびメソッドワーク1()およびワーク2()が格納され、各フィールド値は3および4を格納する.スタックメモリを表示すると、参照変数aはオブジェクトのシフト値を格納します.ワーク1()メソッドを呼び出すと、ワーク1()メソッドで定義された領域変数kがスタックメモリに格納されます(int k=5;)ワーク1()メソッドでワーク2()メソッドを呼び出すと、ワーク2()メソッドで定義された領域変数i,jがスタックメモリに格納されます(int i=3,int j=4).メモリはメソッドを定義する括弧の範囲を「フレームワーク」と呼び、そのメソッドの実行が終了するとJava仮想マシンはメソッドのフレームワーク全体を削除します.ワーク1()メソッドではワーク2()メソッドが呼び出されるため、ワーク2()メソッドを呼び出すとメモリにワーク1()フレームとワーク2()フレームが同時に存在する.完了すると、[作業2](Work 2)()はすべての[作業2](Work 2)()フレームを削除し、[作業1](Work 1)()メソッドも[作業1](Work 1)フレームを削除します.

実習

// 클래스 생성
class A {
    int m = 3; // 필드
    int n = 4; // 필드
    void work1(){
        int k = 5;
        System.out.println(k);
        work2(3); // work2() 안에 정의된 지역 변수를 스택 메모리에 추가
    }
    void work2(int i) { // 인수를 변수 i에 대입해 입력매개변수로 활용
        int j = 4; // 지역 변수
        System.out.println(i + j);
    }
}
        public class jh {
            public static void main(String[] args) {
                // 클래스로 객체 생성
                A a = new A();
                // 필드값 출력
                System.out.println(a.m); // 3
                System.out.println(a.n); // 4
                // 메서드 호출 
                a.work1(); // 5 -> 7
            }
        }
結果