2013-06-02 44 views
10
public class Bicycle { 

    private int cadence; 
    private int gear; 
    private int speed; 
    private int id; 
    private static int numberOfBicycles = 0; 

    public Bicycle(int startCadence, int startSpeed, int startGear){ 
     gear = startGear; 
     cadence = startCadence; 
     speed = startSpeed; 

     id = ++numberOfBicycles; 
    } 
     // ... 
} 

Tôi đã học trong lớp của mình rằng Static variables should be accessed by calling with class name. tức là ClassName.VariableNameTruy cập các biến tĩnh

Nhưng trong đoạn mã trên, làm thế nào được tuyên bố này id = ++numberOfBicycles; biên soạn mà không có lỗi, mặc dù biến numberOfBicyclesstatic

+3

Nhìn từ bên ngoài lớp học, "biến tĩnh nên được truy cập bởi gọi bằng tên lớp. " Từ bên trong, trình độ lớp được suy ra bởi trình biên dịch. –

+3

Lưu ý rằng dòng này 'id = ++ numberOfBicycles;' không phải là chủ đề an toàn –

Trả lời

11

Biến tĩnh được sở hữu bởi lớp chứ không phải bởi các cá thể (đối tượng) riêng lẻ của nó. Tham chiếu các biến tĩnh bên ngoài lớp là bởi ClassName.myStaticVariable nhưng bên trong lớp nó tương tự như các biến cá thể khác. Bạn có thể luôn sử dụng các biến tĩnh trong các phương thức không tĩnh nhưng bạn không thể sử dụng các biến không tĩnh trong các phương thức tĩnh vì lý do khi các phương thức tĩnh được nạp các biến cá thể không tĩnh khác không được tạo ra.

Vì vậy, tuyên bố của bạn id = ++numberOfBicycles; là hoàn toàn hợp lệ và sẽ biên dịch mà không có lỗi.

5

Từ bên trong lớp Bicycle vòng loại là tùy chọn trên các biến tĩnh, giống như this vòng loại là tùy chọn trên các biến mẫu

3

Có thể là những gì giảng viên của bạn nói là liên quan đến việc truy cập chúng từ bên ngoài lớp học không phải từ bên trong lớp học. Các biến số static có thể được truy cập bên ngoài lớp học như thế này ClassName.VariableName hoặc object.VariableName. Tuy nhiên, phương pháp đầu tiên là thích hợp hơn.

Từ bên trong lớp, không cần thiết bạn có thể sử dụng từ khóa this hoặc classname-qualifier để phân biệt với các biến cục bộ có cùng tên bên trong phương thức và hàm tạo.

3

Biến tĩnh là biến được chia sẻ. Vì vậy, bạn có thể truy cập chúng bằng cách sử dụng Classname.staticVariable hoặc sử dụng một đối tượng của lớp instance.staticVariable. Trong mọi trường hợp, bạn sẽ được đề cập đến bản sao duy nhất của biến trong bộ nhớ, bất kể bạn tạo ra bao nhiêu đối tượng.

1

Với lớp học của bạn ..

public class Bicycle 
{ 
    private int cadence; 
    private int gear; 
    private int speed; 
    private int id; 
    private static int numberOfBicycles = 0; 

    // .. 
} 

Khi tôi tạo ra một đối tượng của loại xe đạp, nó sẽ là như thế này:

Bicycle a = new Bicycle (1,2,3); 

Bicycle b = new Bicycle (2,3,4); 

Trong trí nhớ, nó như thế này:

[a] --> { id:1, cadence:1, gear:2, speed:3 } 

[b] --> { id:2, cadence:2, gear:3, speed:4 } 

numberOfBicycles là tĩnh, vì vậy nó không phải là một phần của bất kỳ đối tượng Xe đạp nào, nó liên quan đến lớp không phải là đối tượng và do đó nó sẽ b e như thế này trong bộ nhớ:

[Bicycle] --> { numberOfBicycles:2 } 

Và như vậy để truy cập thành viên tĩnh, đầu tiên chúng ta định nghĩa một getter tĩnh cho nó:

public static int getNumberOfBicycles() 
{ 
    return numberOfBicycles; 
} 

sau đó chúng tôi gọi nó khỏi lớp học:

System.out.println(Bicycle.getNumberOfBicycles()); 
1

Phương pháp không tĩnh có thể truy cập các thành viên tĩnh của một lớp vì chỉ có một bản sao của biến tĩnh tồn tại không giống như các biến mẫu được tạo khi đối tượng mới thuộc loại đó đã được tạo.
Tôi khuyên bạn nên có một lớp khác để kiểm tra, như BicycleTest sẽ có lớp chính và sau đó tạo ra các đối tượng 4Bicycle và sử dụng 2getters trong lớp Xe đạp, truy xuất numberofBicycles và ID mỗi khi bạn tạo một đối tượng có thể sẽ cho bạn một bức ảnh những gì đang xảy ra.

2
public int getID(){ 
    return numberOfBicycles; 
} 

public static int getNOB(){ 
    return numberOfBicycles; 
} 


Trong lớp xe đạp

Bicycle bc = new Bicycle(30, 90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc.getID()); 

    Bicycle bc2 = new Bicycle(30,90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc2.getID()); 

    Bicycle bc3 = new Bicycle(30,90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc3.getID()); 

    Bicycle bc4 = new Bicycle(30,90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc4.getID()); 


Trong lớp chính của BicycleTest chỉ làm việc tốt cho tôi

+1

bạn không cần phải thực hiện hai câu trả lời ..... bạn chỉ có thể chỉnh sửa câu trả lời đầu tiên của bạn để bao gồm mã này – pinkpanther

+0

yeah lần sau sẽ làm điều đó ... miễn là bạn đọc nó và hiểu. – Manny265

Các vấn đề liên quan