Sự khác biệt giữa các biến lớp và biến thể hiện trong Java là gì? [đóng cửa]


16

Tôi rất mới với Java và muốn hiểu sự khác biệt giữa các biến lớp và biến thể hiện.

Ví dụ:

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

Các biến thể hiện và biến lớp khác nhau như thế nào? Biến nào ở đây là biến lớp và biến nào là biến? Điều này ảnh hưởng đến phạm vi như thế nào?


1
Bạn dường như đã bắt đầu đọc Java ™ Hướng dẫn: Tìm hiểu về các Thành Viên mà giải thích điều này, nhưng chưa thấu hiểu đầy đủ về nó.

Câu trả lời:


35

Cả hai đều là biến thành viên , có nghĩa là cả hai đều được liên kết với một lớp. Bây giờ tất nhiên, có sự khác biệt giữa hai:

Biến thể hiện:

Các biến này thuộc về thể hiện của một lớp , do đó, một đối tượng. Và mọi thể hiện của lớp (đối tượng) đó đều có bản sao của biến đó. Các thay đổi được thực hiện cho biến không phản ánh trong các trường hợp khác của lớp đó.

public class Product {
    public int Barcode;
}

Biến lớp:

Đây cũng được gọi là các biến thành viên tĩnh và chỉ có một bản sao của biến đó được chia sẻ với tất cả các phiên bản của lớp đó. Nếu thay đổi được thực hiện cho biến đó, tất cả các trường hợp khác sẽ thấy tác động của các thay đổi.

public class Product {
    public static int Barcode;
}

Ví dụ đầy đủ:

// 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;
}

Đầu ra sẽ là:

123456

987654

Bây giờ, thay đổi biến thể hiện thành một biến lớp bằng cách làm cho nó tĩnh:

//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;
    }
}

Tôi đã sử dụng các phương thức không tĩnh để nhận và đặt giá trị của Barcodeđể có thể gọi nó từ đối tượng chứ không phải từ lớp. Đầu ra sẽ như sau:

987654

987654


Tại sao một ví dụ C # cho một câu hỏi Java?
Basile Starynkevitch

Suy nghĩ của tôi chính xác. Tôi chỉ biết lập trình java chứ không phải C #, vì vậy bạn chưa được giúp đỡ nhiều
Skylar Adams

1
@BasileStarynkevitch Tôi chủ yếu là nhà phát triển C # và vì nguyên tắc này được tính cho cả hai và cũng tốt như tôi đã nhanh chóng cung cấp một ví dụ về C #, dĩ nhiên là sai. :) Đã thay đổi ví dụ của tôi thành Java.
Abbas

2
@SkylarAdams Xin lỗi, tôi đã giả định quá nhanh rằng bất kỳ ai biết Java, đều biết C #. Tôi đã thay đổi ví dụ thành Java, hy vọng nó có ích.
Abbas

9
Đối với loại câu hỏi này, tôi nghĩ rằng nó không liên quan, cho dù sử dụng Java hay C #,
Thomas Junk

6

Nó được giải thích ở đây (với một ví dụ Bicyclelớp với biến lớp numberOfBicyclesvà dụ biến cadence, speed, gear& id):

Đôi khi, bạn muốn có các biến chung cho tất cả các đối tượng. Điều này được thực hiện với công cụ staticsửa đổi. Các trường có công cụ staticsửa đổi trong khai báo của chúng được gọi là các trường tĩnh hoặc biến lớp. Chúng được liên kết với lớp, hơn là với bất kỳ đối tượng nào. Mỗi phiên bản của lớp chia sẻ một biến lớp, nằm ở một vị trí cố định trong bộ nhớ. Bất kỳ đối tượng nào cũng có thể thay đổi giá trị của một biến lớp, nhưng các biến lớp cũng có thể được thao tác mà không cần tạo một thể hiện của lớp.

Một biến lớp (khai báo static) là một vị trí phổ biến cho tất cả các trường hợp.

Trong ví dụ này, numberOfBicycleslà một biến lớp (vì nó được khai báo static). Chỉ có một biến như vậy (tức là vị trí) chung cho tất cả các trường hợp và cho lớp. Vì vậy, nếu bạn sửa đổi numberOfBicyclestrong một phương thức, các phương thức khác sẽ thấy giá trị mới (ngay cả đối với các Bicycleđối tượng khác nhau )

Ngược lại gear& iddụ biến (vì tuyên bố họ không có staticsửa đổi). Mỗi Bicycleđối tượng có một cái riêng. Nếu bạn sửa đổi gearcho một số Bicycle a và nếu b là một thể hiện khác, sửa đổi a.gearkhông có hiệu lực trênb.gear

Mỗi đối tượng Java là một vùng bộ nhớ riêng biệt với một số dữ liệu meta (ví dụ: một số tham chiếu đến lớp của nó) và các biến thể hiện của chính nó (có lẽ được kế thừa từ một siêu lớp). Nhưng các biến lớp là chung cho lớp và được chia sẻ bởi tất cả các trường hợp.

Xem thêm Object (khoa học máy tính) & wiki biến thể Instance .


4

Biến sơ thẩm:

  • Các biến sơ thẩm được khai báo trong một lớp, nhưng bên ngoài một phương thức, hàm tạo hoặc bất kỳ khối nào.
  • Biến sơ thẩm thuộc về thể hiện của một lớp hoặc bạn có thể nói biến thể hiện đó thuộc về đối tượng.
  • Biến sơ thẩm có giá trị riêng của từng và mọi thể hiện của lớp.

    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;
    }

Phương thức truy cập biến thể hiện:

InstanceDemo demo = new InstanceDemo ();

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

Đầu ra: 2, Kiểm tra

Biến lớp:

  • Biến lớp thuộc về lớp.
  • biến lớp được tạo bằng cách thêm từ khóa tĩnh tĩnh trước trước biến.
  • Cũng được gọi là biến tĩnh.
  • Và biến lớp quan trọng nhất duy trì một giá trị chia sẻ duy nhất cho tất cả các thể hiện của một lớp, ngay cả khi không có đối tượng thể hiện của lớp tồn tại.

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

Phương thức truy cập biến lớp:

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

Đầu ra: 2

Sự khác biệt ngắn gọn giữa biến lớp và biến sơ thẩm:

  • Các biến sơ thẩm có các giá trị riêng cho từng thể hiện của một lớp. Các biến lớp duy trì một giá trị được chia sẻ duy nhất cho tất cả các thể hiện của lớp, ngay cả khi không có đối tượng thể hiện của lớp đó tồn tại.
  • Bạn sẽ sử dụng từ khóa tĩnh để thay đổi một biến thể hiện thành một biến lớp.
  • Cả hai biến thể hiện và lớp được khai báo ở cấp độ lớp, không phải trong các phương thức.

3

Sự khác biệt giữa class variablesinstancecác biến, chỉ đơn giản là một câu hỏi về who knows what?.

An instance variablechỉ được biết (= ràng buộc ) với trường hợp cụ thể đó - do đó tên.

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

Định nghĩa của một lớp giống như một bản thiết kế để xây dựng các đối tượng cụ thể. Có lẽ điểm này làm bạn bối rối một chút. Nhưng viết theo cách này, mọi biến sẽ bị ràng buộc với đối tượng cụ thể của nó: ví dụ: Mỗi người có FirstName riêng của mình

class variableMặt khác, A - như tên gọi - được biết đến với mỗi và mọi thành viên của một lớp; hoặc về mặt kỹ thuật: Nó được biết / ràng buộc ở cấp độ lớp . Ví dụ điển hình là một bộ đếm có bao nhiêu đối tượng, bạn đã tạo - mặc dù đó là một ví dụ rất có vấn đề; nhưng điều đó không quan trọng ở giai đoạn đầu này.

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

numberOfPersonsđược khai báo staticlà từ khóa để phân biệt giữa class variablesinstance variabes. Biến được khai báo giống như các biến khác trong định nghĩa lớp. Nhưng các statictín hiệu từ khóa, rằng nó là khác nhau.

  • firstName, lastNamecác biến thể hiện và ràng buộc với thể hiện cụ thể đó

  • numberOfPersons được ràng buộc với lớp, để mọi trường hợp có thể truy cập vào biến này.

tl; dr

Nơi mà các biến được định nghĩa là định nghĩa lớp.

Các biến lớp được biết ở / ràng buộc với cấp độ lớp, tức là mỗi thể hiện cụ thể có quyền truy cập vào nó. Để xác định một biến lớp, bạn sử dụng từ khóa static.

Biến sơ thẩm chỉ được biết ở cấp độ cá thể. Bạn xác định chúng mà không cần statictừ khóa.

Tài liệu thêm về Java có ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.