クラスメンバーとインスタンスメンバー


クラスが設計図である場合、インスタンスはその設計図に基づいて作成された特定の製品です.設計図は1つのみであってもよく、この設計図に対する製品は複数あってもよい.インスタンスとインスタンスを区別するキー基準は、インスタンス内の変数の値に依存し、各インスタンスは異なるステータスを有します.その後、ステータスに応じて、ある動作(=メソッド)を実行すると、他の結果が返されます.関数(メソッド)でメソッドに渡されるパラメータが何であるかのように、戻り値も変化します.

メンバー#メンバー#


クラスとインスタンスの意味と存在性をメンバーの概念で詳細に説明します.メンバーは英語でメンバーの意味です.オブジェクトにもメンバーがあり、以下のようになります.
  • 変数
  • 方法
  • まずクラスを定義してオブジェクトを作成し、次にクラスのインスタンスを作成します.復習しましょう.以前の計算機Demo.Javaでは、左変数と右変数は誰のメンバーですか?インスタンスのメンバー.使用するにはインスタンスを作成する必要があり、各インスタンスには異なる値があります.では、クラスにもメンバーがいるのでしょうか.次の図に示すように、クラスはメンバーを持つこともできます!😲

    クラスの所有者変数は、クラスのメンバー変数がすべてのインスタンスで同じ値を持つことです.インスタンスを作成しなくても、クラス(クラスに属する変数にアクセス)に直接アクセスし、この値を使用できることを理解してください.

    クラス変数

    package com.yuri.javatutorials.classninstance;
    
    class Calculator {
        static double PI = 3.14;
        int left, right;
     
        public void setOprands(int left, int right) {
            this.left = left;
            this.right = right;
        }
     
        public void sum() {
            System.out.println(this.left + this.right);
        }
     
        public void avg() {
            System.out.println((this.left + this.right) / 2);
        }
    }
     
    public class CalculatorDemo1 {
     
        public static void main(String[] args) {
     
            Calculator c1 = new Calculator();
            System.out.println(c1.PI);
     
            Calculator c2 = new Calculator();
            System.out.println(c2.PI);
     
            System.out.println(Calculator.PI);
     
        }
     
    }
    sum()とavg()は、作成したオブジェクトに基づいて異なる結果を生成します.オブジェクトごとに異なる変数値(ステータス値)があるためです.ただし、追加する円周値は、オブジェクトごとに異なる値を指定する必要はありません.
    すべてのインスタンスで共有される変数を作成すると便利です.役割を果たすのはクラス変数です.インスタンス変数は、異なるインスタンス値を持つ変数です.ただし、クラス変数はクラスの変数であるため、クラスに基づいて作成されたすべてのインスタンスは、クラス変数が持つ値を自然に有します.
    static double PI = 3.14;
    変数PIの前に静的を加えた.staticをメンバー(変数、メソッド)の前にアタッチすると、クラスのメンバーになります.クラスが属する変数の作成方法が分かった以上、今回はどのように使用するかについて説明します.クラス変数にアクセスする方法を2つ示します.
    //インスタンスによるPIアクセス
    System.out.println(c1.PI);
    //クラス経由PI
    System.out.println(Calculator.PI);
    2つ目の方法は、オブジェクト計算機です.Javaの他の機能(sum、avg)は必要なく、円周率でクラスに直接アクセスするだけなので、インスタンスを作成する必要はありません.
    クラス変数は、すべてのインスタンスで変数の変更を共有する必要がある場合にも使用されます.計算時に特別な値を含める必要がある場合は、どうすればいいですか?次の例は、sumおよびavgを実行するたびに、演算に値を含める場合に試みる方法です.
    package com.yuri.javatutorials.classninstance;
    
    class Calculator2 {
        static double PI = 3.14;
        // 클래스 변수인 base가 추가되었다.
        static int base = 0;
        int left, right;
     
        public void setOprands(int left, int right) {
            this.left = left;
            this.right = right;
        }
     
        public void sum() {
            // 더하기에 base의 값을 포함시킨다.
            System.out.println(this.left + this.right + base);
        }
     
        public void avg() {
            // 평균치에 base의 값을 포함시킨다.
            System.out.println((this.left + this.right + base) / 2);
        }
    }
     
    public class CalculatorDemo2 {
     
        public static void main(String[] args) {
     
            Calculator2 c1 = new Calculator2();
            c1.setOprands(10, 20);
            // 30 출력
            c1.sum();
     
            Calculator2 c2 = new Calculator2();
            c2.setOprands(20, 40);
            // 60 출력
            c2.sum();
     
            // 클래스 변수 base의 값을 10으로 지정했다.
            Calculator2.base = 10;
     
            // 40 출력
            c1.sum();
     
            // 70 출력
            c2.sum();
     
        }
     
    }
    30
    60
    40
    70
    結果は以下の通りです.クラス変数baseの値を変更すると、すべてのインスタンスのbase値が一致して変更されます.
    クラス変数を整理する用途は以下の通りです.
  • インスタンスには、不変の値(前例ではPI)が必要です.
    (この場合、final宣言を定数として使用することが望ましいが、finalを学習していないため言及しない)
  • インスタンスを作成する必要のない値をクラスに保存する場合は、次の手順に従います.
    (例えば、cal~.PIで3.14を得ることができます.この3.14の円周率だけを得るには、newのようなプロセスは必要ありません.メモリを使うときは、クラスを実例にしなければなりません.c.PIは...いらない~!)🤭🤭 インスタンスを作成する理由は、c.sum、c.avgと呼ばれる方法を使用して、各インスタンスに異なる状態を設定することです.すなわち、各インスタンスに設定された変数の値に基づいて異なる処理結果を取得したい場合、インスタンスを作成します.)
  • すべてのインスタンスは、
  • 値の変更を共有する必要があります.
    (基本例...)
  • クラスメソッド


    クラスとインスタンスは、メンバーをインポートできます.そしてそのメンバーは変数と方法です.そこで今回は方法を知りましょう.
    package com.yuri.javatutorials.classninstance;
    
    class Calculator3{
    	  
        public static void sum(int left, int right){
            System.out.println(left+right);
        }
         
        public static void avg(int left, int right){
            System.out.println((left+right)/2);
        }
    }
     
    public class CalculatorDemo3 {
         
        public static void main(String[] args) {
            Calculator3.sum(10, 20);
            Calculator3.avg(10, 20);
             
            Calculator3.sum(20, 40);
            Calculator3.avg(20, 40);
        }
     
    }
    今回はインスタンスがなく、クラスに直接アクセスしてメソッドにアクセスするだけです.メソッドがインスタンス変数を参照しない場合は、クラスメソッドを使用して不要なインスタンスの作成を阻止できます.
    🌟🌟🌟 重要🌟🌟🌟
    1.インスタンスメソッド(静的キーワードを使用しないメソッド)は、クラスメンバーにアクセスできます.
    2.クラスメソッドはインスタンスメンバーにアクセスできません.
    インスタンス変数は、インスタンスの作成時に作成され、クラスメソッドはインスタンスの作成前に作成されるため、クラスメソッドがインスタンスメンバーにアクセスするのは、存在しないインスタンス変数にアクセスするのと同じです.
    クラスは常にメソッドより先に存在します.クラスという名前の設計図を作成し、後で特定の製品インスタンスを作成するためです.クラスメソッドが作成されていないインスタンスに近いと理解すれば簡単です.クラスが既に存在することを前提として、インスタンスの作成にアクセスできます.
    package com.yuri.javatutorials.classninstance;
    
    class C1{
        static int static_variable = 1;
        int instance_variable = 2;
        static void static_static(){
            System.out.println(static_variable);
        }
        static void static_instance(){
            // 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다. 
            //System.out.println(instance_variable);
        }
        void instance_static(){
            // 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
            System.out.println(static_variable);
        }
        void instance_instance(){        
            System.out.println(instance_variable);
        }
    }
    public class ClassMemberDemo {  
        public static void main(String[] args) {
            C1 c = new C1();
            // 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
            // 인스턴스 메소드가 정적 변수에 접근 -> 성공
            c.static_static();
            // 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
            // 정적 메소드가 인스턴스 변수에 접근 -> 실패
            c.static_instance();
            // 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
            // 인스턴스 메소드가 클래스 변수에 접근 -> 성공
            c.instance_static();
            // 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공 
            // 인스턴스 메소드가 인스턴스 변수에 접근 -> 성공
            c.instance_instance();
            // 클래스를 이용해서 클래스 메소드에 접근 -> 성공
            // 클래스 메소드가 클래스 변수에 접근 -> 성공
            C1.static_static();
            // 클래스를 이용해서 클래스 메소드에 접근 -> 성공
            // 클래스 메소드가 인스턴스 변수에 접근 -> 실패
            C1.static_instance();
            // 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
            //C1.instance_static();
            // 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
            //C1.instance_instance();
        }
     
    }
    static int static_variable = 1;
    staticが前にあるのでクラス変数です.
    int instance_variable = 2;
    音もなく息もしない.すなわち、これはインスタンス変数です.
    各インスタンスメソッドとクラスメソッドが呼び出されるときに発生する問題と発生しない問題を見てみましょう.
    static void static_static(){
        System.out.println(static_variable);
    }
    これは、クラスメソッドがクラス変数を呼び出すときの名前static staticです.クラスメソッドがクラス変数にアクセスすると、どうなりますか?
    static void static_instance(){
    //クラスメソッドはインスタンス変数にアクセスできません.
    //System.out.println(instance_variable);
    }
    クラスメソッドでインスタンス変数にアクセスするときに何が起こるか...
    void instance_static(){
    //インスタンスメソッドでは、クラス変数にアクセスできます.
    System.out.println(static_variable);
    }
    インスタンスメソッドでクラス変数にアクセスできるかどうか...

    用語


    インスタンス変数とクラス変数は、次のようにも呼ばれます.
  • インスタンス変数->非フィールド
  • クラス変数->フィールド
    フィールド(field)は、クラス全体にアクセスできる変数を意味します.この変数の詳細は、有効範囲コースを参照してください.
  • この文章は生活コードに基づくjavaチュートリアルのまとめです.