อะไรคือความแตกต่างระหว่างตัวแปรคลาสและตัวแปรอินสแตนซ์ใน Java? [ปิด]


16

ฉันใหม่กับ Java และต้องการเข้าใจความแตกต่างระหว่างตัวแปรคลาสและตัวแปรอินสแตนซ์

ตัวอย่างเช่น:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

ตัวแปรอินสแตนซ์และตัวแปรคลาสแตกต่างจากกันอย่างไร ตัวแปรใดที่นี่คือตัวแปรคลาสและตัวแปรอินสแตนซ์ใด สิ่งนี้มีผลต่อขอบเขตอย่างไร


1
ดูเหมือนว่าคุณจะเริ่มอ่านบทช่วยสอน Java ™: ทำความเข้าใจกับสมาชิกในชั้นเรียนซึ่งอธิบายสิ่งนี้ แต่ยังไม่เข้าใจทั้งหมด

คำตอบ:


35

ทั้งคู่เป็นตัวแปรสมาชิกหมายความว่าทั้งสองเกี่ยวข้องกับคลาส แน่นอนตอนนี้มีความแตกต่างระหว่างสอง:

ตัวแปรอินสแตนซ์:

ตัวแปรเหล่านี้เป็นของอินสแตนซ์ของคลาสจึงเป็นวัตถุ และทุกอินสแตนซ์ของคลาส (วัตถุ) มีสำเนาของตัวแปรนั้นเอง การเปลี่ยนแปลงที่เกิดขึ้นกับตัวแปรจะไม่สะท้อนในอินสแตนซ์อื่นของคลาสนั้น

public class Product {
    public int Barcode;
}

ตัวแปรคลาส:

สิ่งเหล่านี้เรียกว่าตัวแปรสมาชิกแบบสแตติกและมีเพียงหนึ่งสำเนาของตัวแปรนั้นที่ใช้ร่วมกับอินสแตนซ์ทั้งหมดของคลาสนั้น หากมีการเปลี่ยนแปลงตัวแปรนั้นอินสแตนซ์อื่น ๆ ทั้งหมดจะเห็นผลของการเปลี่ยนแปลง

public class Product {
    public static int Barcode;
}

ตัวอย่างเต็มรูปแบบ:

// INSTANCE VARIABLE
public class Main {

    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.Barcode = 123456;

        Product prod2 = new Product();
        prod2.Barcode = 987654;

        System.out.println(prod1.Barcode);
        System.out.println(prod2.Barcode);
    }
}

public class Product {
    public int Barcode;
}

ผลลัพธ์จะเป็น:

123456

987654

ตอนนี้เปลี่ยนตัวแปรอินสแตนซ์เป็นตัวแปรคลาสโดยทำให้เป็นแบบคงที่:

//CLASS VARIABLE
public class Main {

    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.setBarcode(123456);
        Product prod2 = new Product();
        prod2.setBarcode(987654);

        System.out.println(prod1.getBarcode());
        System.out.println(prod2.getBarcode());
    }
}

public class Product {

    public static int Barcode;

    public int getBarcode() {
        return Barcode;
    }

    public void setBarcode(int value){
        Barcode = value;
    }
}

ฉันใช้วิธีการที่ไม่คงที่เพื่อรับและตั้งค่าBarcodeให้สามารถเรียกมันจากวัตถุไม่ใช่จากชั้นเรียน ผลลัพธ์จะเป็นดังนี้:

987654

987654


ทำไมตัวอย่าง C # สำหรับคำถามเกี่ยวกับ Java
Basile Starynkevitch

ความคิดของฉันแน่นอนฉันรู้เพียงแค่การเขียนโปรแกรมภาษาจาวาไม่ใช่ C # ดังนั้นคุณจึงไม่ได้รับความช่วยเหลือมากนัก
Skylar Adams

1
@BasileStarynkevitch ฉันส่วนใหญ่เป็นนักพัฒนา C # และเนื่องจากหลักการนับสำหรับทั้งสองและเป็นสิ่งที่ดีเหมือนกันฉันให้ตัวอย่าง C # อย่างรวดเร็วผิดกับฉันแน่นอน :) เปลี่ยนตัวอย่างของฉันเป็น Java
Abbas

2
@SkylarAdams ขออภัยฉันคิดผิดเร็วเกินไปว่าใครก็ตามที่รู้จัก Java รู้ C # ฉันเปลี่ยนตัวอย่างเป็น Java หนึ่งหวังว่าจะช่วยได้
Abbas

9
สำหรับคำถามแบบนี้ฉันคิดว่ามันไม่เกี่ยวข้องเลยไม่ว่าจะใช้ Java หรือ C #,
Thomas ขยะ

6

มันจะมีการอธิบายที่นี่ (มีตัวอย่างที่BicycleเรียนกับตัวแปรระดับnumberOfBicyclesและอินสแตนซ์ตัวแปรcadence, speed, gearและid):

บางครั้งคุณต้องการมีตัวแปรที่ใช้ร่วมกับวัตถุทั้งหมด สิ่งนี้สามารถทำได้ด้วยโมดิstaticฟายเออร์ เขตข้อมูลที่มีstaticตัวแก้ไขในการประกาศเรียกว่าเขตข้อมูลแบบคงที่หรือตัวแปรคลาส พวกเขาเกี่ยวข้องกับคลาสมากกว่ากับวัตถุใด ๆ ทุกอินสแตนซ์ของคลาสแบ่งใช้ตัวแปรคลาสซึ่งอยู่ในตำแหน่งคงที่เดียวในหน่วยความจำ วัตถุใด ๆ สามารถเปลี่ยนค่าของตัวแปรคลาสได้ แต่สามารถเปลี่ยนตัวแปรคลาสได้โดยไม่ต้องสร้างอินสแตนซ์ของคลาส

ตัวแปรคลาส (ประกาศstatic) เป็นตำแหน่งทั่วไปสำหรับอินสแตนซ์ทั้งหมด

ในตัวอย่างnumberOfBicyclesคือตัวแปรคลาส (เนื่องจากถูกประกาศstatic) มีเพียงตัวแปรเดียว (เช่นตำแหน่ง) ที่พบได้ทั่วไปในทุกอินสแตนซ์และคลาส ดังนั้นหากคุณปรับเปลี่ยนnumberOfBicyclesในวิธีหนึ่งวิธีอื่น ๆ จะเห็นค่าใหม่ (แม้สำหรับBicycleวัตถุที่แตกต่างกัน)

ในทางตรงกันข้ามgear& idเป็นตัวแปรอินสแตนซ์ (เนื่องจากการประกาศไม่มีการเปลี่ยนแปลงstatic) Bicycleวัตถุทุกชิ้นมีของตัวเอง ถ้าคุณปรับเปลี่ยนgearบางและถ้าคืออีกตัวอย่างการแก้ไขมีผลกระทบต่อBicycle a.gearb.gear

แต่ละวัตถุ Java เป็นโซนหน่วยความจำที่แตกต่างกับข้อมูลเมตาบางส่วน (เช่นการอ้างอิงถึงระดับของมัน) และตัวแปรอินสแตนซ์ของตัวเอง (อาจสืบทอดมาจากซูเปอร์คลาส) แต่ตัวแปรคลาสนั้นใช้ร่วมกันกับคลาสและแบ่งใช้โดยอินสแตนซ์ทั้งหมด

ดูเพิ่มเติมวัตถุ (วิทยาการคอมพิวเตอร์)และอินสแตนซ์ตัวแปร wikipages


4

ตัวแปรอินสแตนซ์:

  • ตัวแปรอินสแตนซ์ถูกประกาศในคลาส แต่ภายนอกเมธอดตัวสร้างหรือบล็อกใด ๆ
  • ตัวแปรอินสแตนซ์เป็นของอินสแตนซ์ของคลาสหรือคุณสามารถพูดได้ว่าตัวแปรอินสแตนซ์นั้นเป็นของวัตถุ
  • ตัวแปรตัวอย่างมีค่าแยกกันของแต่ละอินสแตนซ์ของคลาส

    Class InstanceDemo {
    
         // this instance variable is visible for any child class.
           public String name = "Testing";
    
         // count variable is visible in Demo class only.
           private int count = 2;
    }

วิธีการเข้าถึงตัวแปรอินสแตนซ์:

InstanceDemo demo = new InstanceDemo ();

System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );

เอาท์พุท: 2 การทดสอบ

ตัวแปรระดับ:

  • ตัวแปรคลาสเป็นของคลาส
  • ตัวแปรคลาสถูกสร้างโดยการเพิ่มคีย์เวิร์ด“ static” ไว้ข้างหน้าตัวแปร
  • เรียกอีกอย่างว่าตัวแปรแบบคงที่
  • และตัวแปรคลาสที่สำคัญที่สุดรักษาค่าที่ใช้ร่วมกันเดียวสำหรับทุกอินสแตนซ์ของคลาสแม้ว่าจะไม่มีวัตถุอินสแตนซ์ของคลาสอยู่

        Class ClassDemo {
    
         // count variable is Same for all instance of this class
           public static int count = 2;
    }

วิธีการเข้าถึงตัวแปรคลาส:

System.out.println("Access Class variable: " + ClassDemo.count );
//class variable is directly refer with class name

ผลลัพธ์: 2

ความแตกต่างสั้น ๆ ระหว่างตัวแปรของคลาสและตัวแปรอินสแตนซ์:

  • ตัวแปรตัวอย่างมีค่าแยกกันสำหรับแต่ละอินสแตนซ์ของคลาส ตัวแปรคลาสรักษาค่าที่ใช้ร่วมกันเดียวสำหรับทุกอินสแตนซ์ของคลาสแม้ว่าจะไม่มีวัตถุอินสแตนซ์ของคลาสนั้นอยู่
  • คุณจะใช้คำหลักคงที่เพื่อเปลี่ยนตัวแปรอินสแตนซ์เป็นตัวแปรคลาส
  • ทั้งอินสแตนซ์และตัวแปรคลาสถูกประกาศในระดับคลาสไม่ใช่ภายในเมธอด

3

ความแตกต่างระหว่างclass variablesและตัวแปรเป็นเพียงคำถามของinstancewho knows what?

An instance variableเป็นที่รู้จัก (= ผูก ) กับตัวอย่างที่เป็นรูปธรรมนั่นจึงเป็นชื่อ

  public class Person {
       private String firstName;
       private String lastName;
  [...]
  }

คำจำกัดความของคลาสนั้นเหมือนกับพิมพ์เขียวสำหรับการสร้างวัตถุที่เป็นรูปธรรม บางทีจุดนี้อาจทำให้คุณสับสน แต่การเขียนด้วยวิธีนี้ทุกตัวแปรจะผูกพันกับวัตถุที่เป็นรูปธรรมเช่นทุกคนมีชื่อของตัวเอง

class variableในมืออื่น ๆ เป็น - เป็นชื่อกล่าวว่า - ที่รู้จักกันในแต่ละคนและสมาชิกของชั้นเรียนทุก; หรือในทางเทคนิค: มันเป็นที่รู้จักกัน / ผูกไว้ที่ระดับชั้น ตัวอย่างทั่วไปเป็นตัวนับจำนวนวัตถุที่คุณสร้างขึ้น - แม้ว่ามันจะเป็นตัวอย่างที่มีปัญหามาก แต่นั่นไม่สำคัญในช่วงแรกนี้

  public class Person {
       private String firstName;
       private String lastName;
  [...]
       static int numberOfPersons = 0
  }

numberOfPersonsมีการประกาศstaticซึ่งเป็นคำที่ต้องการ distingush ระหว่างและclass variables instance variabesตัวแปรถูกประกาศเช่นเดียวกับตัวอื่น ๆ ภายในการกำหนดคลาส แต่staticคำหลักส่งสัญญาณว่ามันแตกต่างกัน

  • firstName, lastNameมีตัวแปรเช่นและผูกไว้กับตัวอย่างที่เป็นรูปธรรมที่

  • numberOfPersons ถูกผูกไว้กับคลาสเพื่อให้ทุกอินสแตนซ์สามารถเข้าถึงตัวแปรนี้ได้

TL; DR

สถานที่ที่มีการกำหนดตัวแปรคือคำจำกัดความของคลาส

ตัวแปรระดับเป็นที่รู้จักกันที่ / ผูกพันกับระดับชั้นคือแต่ละตัวอย่างที่เป็นรูปธรรมสามารถเข้าถึงได้ staticการกำหนดตัวแปรชั้นเรียนคุณใช้คำหลัก

ตัวแปรอินสแตนซ์เป็นที่รู้จักในระดับอินสแตนซ์เท่านั้น คุณกำหนดโดยไม่มีstaticคำหลัก

เอกสารเพิ่มเติมสำหรับ Java อยู่ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.