2009-02-23 28 views
24

Tôi đang cố gắng tìm hiểu cách chỉ định các hàm tạo lớp trong Java. Tôi bắt đầu hiểu rằng họ chỉ định các loại biến cá thể của các đối tượng được tạo từ lớp đó. Chúng cũng có thể được sử dụng để thiết lập các giá trị ban đầu của biến cá thể. Ví dụ sau là từ hướng dẫn Java trên trang web của Sun:Java Constructors

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

Trường hợp trong mã nguồn lớp học, bạn nên đặt (các) hàm tạo?

Các đối số này có phải tên của các biến không ?: (int startCadence, int startSpeed, int startGear) hoặc là bánh răng, nhịp điệu và tốc độ tên của các biến?

Sự khác nhau giữa (int startCadence, int startSpeed, int startGear) và thiết bị, nhịp và tốc độ là gì?

Trong trường hợp không chắc rằng người hướng dẫn của tôi hoặc bất kỳ quản trị viên nào từ trường Cao đẳng Cộng đồng Salt Lake đã từng nói về câu hỏi này, hãy để tôi làm rõ ý định của mình. Câu hỏi này được đăng trên tinh thần học tập trung thực nhất. Tôi hỏi câu hỏi này để tìm kiếm lời khuyên chung và giúp hiểu cách thích hợp để sử dụng ngôn ngữ lập trình Java. Tôi không bao giờ sử dụng công việc của người khác và đại diện cho nó như là công việc của riêng tôi. Tôi sử dụng các câu trả lời được cung cấp ở đây như là một trợ giúp chung trong sự hiểu biết của tôi. Tôi làm tất cả công việc của mình và không sao chép tác phẩm do mọi người trả lời câu hỏi của tôi.

Trả lời

33

Các nhà thầu có thể xuất hiện ở bất kỳ đâu trong mã cho lớp học. Tuy nhiên, theo quy ước, hầu hết mọi người đặt chúng trước bất kỳ chức năng nào khác không phải là nhà thầu.

Đối với tên biến, tất cả 6 thực sự là tên biến, nhưng phạm vi là differnet. Những cái được chỉ định làm tham số cho hàm tạo (startCadence, startSpeed, startGear) chỉ có sẵn trong hàm tạo. 3 khác (bánh răng, nhịp điệu, tốc độ) có lẽ là các biến toàn lớp, có sẵn cho tất cả các phương pháp. Tuy nhiên, định nghĩa không được hiển thị trong đoạn mã của bạn. Lớp học đầy đủ sẽ trông giống như:

class Bicycle 
{ 
    // class-level variables 
    private int gear; 
    private int cadence; 
    private int speed; 

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

    // another method (not a constructor) 
    public void ShiftUp() { 
     gear = gear + 1; // notice the 'gear' variable is available here too. 
    } 
} 

Hy vọng điều đó sẽ hữu ích!

1

Bạn thực sự cần một bản sao của Head First Java

+0

@ Bỏ phiếu miễn phí: Điều này không thực sự xúc phạm, chỉ không hoàn toàn hữu ích. – OscarRyz

+0

Stackoverflow không thực sự là nơi dành cho liên kết chi nhánh của Amazon. Hãy dự trữ chúng cho các dự án cá nhân của bạn. –

+0

Tôi không có tài khoản liên kết Amazon. – Fortyrunner

3
  1. Nó hoàn toàn tùy thuộc vào bạn. Tôi thường bắt đầu với tất cả các biến, sau đó xây dựng, sau đó phương pháp, nhưng nó chỉ là sở thích cá nhân.
  2. Tên của các đối số là hoàn toàn không có liên quan, miễn là bạn không đặt tên chúng giống với biến của bạn. Trong ví dụ này, gear, cadencespeed là các biến.
  3. Bạn (hoặc ai đó) đang đi qua ba ints cho người tạo. Tên (startCadence, startSpeed, và startGear được gọi là thông số chính thức, và họ là những cách bạn có thể xác định các đối số. Xem http://en.wikipedia.org/wiki/Parameter_(computer_science).
    gear, cadence, và speed được định nghĩa ở một nơi khác trong lớp. Bất kỳ phương pháp trong lớp có thể tham khảo chúng

Đừng lo lắng -.. nếu bạn làm việc ở đó, loại điều này sẽ được thiên nhiên thứ hai khá sớm

Oh, và tôi có thể gợi ý rằng bạn sẽ có được một IDE tốt? BlueJ là giả sử d là tốt cho người mới bắt đầu và NetBeansEclipse cho những người lập trình có kinh nghiệm hơn. Làm nổi bật mã nguồn có thể là vô giá.

+0

Cảm ơn sự khích lệ. –

+0

Giảng viên đại học của tôi khuyến khích chúng tôi sử dụng IDE jGRASP được phát triển tại Đại học Auburn. Tôi cũng có ba bạn đã đề cập, nhưng đã không sử dụng chúng nhiều như jGRASP. –

+0

Tôi chưa bao giờ thử jGRASP và không biết nó so sánh như thế nào, nhưng mọi thứ đều tốt hơn Notepad. :) –

3

Tôi thường đặt các nhà thầu của mình lên gần đầu tệp của tôi, sau các phần khai báo biến tĩnh, nhập, Javadoc và tĩnh/mẫu.

thiết bị, nhịp và tốc độ là các biến lớp, có lẽ được định nghĩa bên ngoài của hàm tạo ở đâu đó. startCadence, startSpeed ​​và startGear cũng là các biến, nhưng chúng là các tham số được truyền cho hàm tạo.

Bạn cũng có thể thấy một cái gì đó như thế này:

public Bicycle(int cadence, int speed, int gear) { 
    this.gear = gear; 
    this.cadence = cadence; 
    this.speed = speed; 
} 

đó cài đặt các biến lớp từ các thông số của cùng tên.

6

thiết bị, nhịp và tốc độ là các biến thành viên của lớp (được khai báo ở nơi khác) và startCadence, startSpeed ​​và startGear là các tham số hàm.

class Bicycle 
{ 
    private int gear, cadence, speed; 

    public Bicycle(int startCadence, int startSpeed, int startGear) 
    { 
     // set the value of member variables from passed parameters 
     gear = startGear; 
     cadence = startCadence; 
     speed = startSpeed; 

    } 
} 
0

Thực ra, các đối số cho hàm tạo không cần phải lưu trữ dưới dạng biến thành viên của đối tượng. Dưới đây là ví dụ:

class NumberAsString { 

    private String numAsStr; 

    public NumberAsString(double number) { 
     this.numAsStr = Double.toString(number); 
    } 

} 

Trong ví dụ này, đối số hàm tạo không thực sự được lưu trữ ở bất kỳ đâu, nhưng giá trị của nó là cần thiết để tính một hoặc nhiều giá trị biến thành viên.

Hành vi bạn đã thấy, nơi tất cả các đối số được lưu trữ trực tiếp dưới dạng biến thành viên, là khá phổ biến. Đặc biệt đối với một số loại lớp đơn giản chỉ cung cấp các phương thức "getter" và "setter" cho các biến thành viên của chúng (không cung cấp bất kỳ hàm tính toán hoặc chuyển đổi nào). Trong thế giới java, các loại lớp này thường được gọi là "đậu". (Trong đó, có, là một cái tên rất ngu ngốc.)

0

Sự khác biệt cơ bản giữa int startCadence và cadence không nằm trong các biến, nhưng trong phạm vi của chúng. Nếu một biến được định nghĩa bên trong một phương thức, giống như một hàm tạo, nó sẽ chỉ tồn tại bên trong phương thức này, nhưng không tồn tại bên ngoài. Nếu một biến được định nghĩa trong một lớp, nó sẽ tồn tại ở mọi nơi trong lớp đó, một biến như vậy có một phạm vi toàn cục. Biến startCadence wll chỉ tồn tại bên trong hàm tạo, vì vậy nếu bạn muốn sử dụng giá trị của nó ở nơi khác, bạn có thể chuyển nó tới biến khác với phạm vi toàn cục. Đây là những gì xảy ra ở đây: cadence = startCadence;

5

Trong mã nguồn của lớp học, bạn nên đặt (các) hàm tạo?

tôi sử dụng như sau:

package statement .... 
import statements.... 


public class MyClass { 
    // instance attributes 
    private int i; 

    // class attribute 
    private static int MAX; 

    // static methods 
    public static int getClassCount() { 
    } 

    // Constructor!! 
    public MyClass() { // constructor. 
    } 

    // public methods 
    // protected methods 
    // private methods 

    // public static void main 
} 

Nhưng họ có thể đi bất cứ nơi nào. Tôi cảm thấy tốt hơn là nên đặt mọi thứ theo thứ tự hiển thị. Ví dụ tôi thích có các phương thức công khai trước các phương thức riêng (vì vậy nếu tôi đang tìm kiếm một phương thức công khai cụ thể, tôi biết nó ở đầu tệp) Vì lý do tương tự, tôi thường đặt hàm tạo ở trên cùng.

Các đối số này có phải là tên của các biến không?:

Không cần thiết, bạn có thể đặt tên chúng theo ý muốn. Tôi thường sử dụng cùng tên.

... hoặc là thiết bị, nhịp và tốc độ tên của các biến? ...

Họ là những dụ tên biến

sự khác biệt giữa (int startCadence, int startSpeed, int startGear) và dụng cụ, nhịp và tốc độ là bao nhiêu?

Đầu tiên là tên thông số cho hàm tạo và trước đây là tên của các thuộc tính của đối tượng đó.

Lấy mẫu này khác:

public class Person { 
    private String name; // a person has a name. 

    public Person(String nameParameter) { 
     this.name = nameParameter; 
    } 
    public String toString() { 
     return "My name is : " + this.name; 
    } 

    public static void main(String [] args) { 

      // creates a new "instance" and assign "Patrick" as its name. 
     Person one = new Person("Patrick"); 
     System.out.println(one); // prints "My name is: Patrick" 

     // each person have its own name. 
     Person two = new Person("Oscar"); 
     System.out.println(two); // prints "My name is: Oscar"   


    } 
} 

Như bạn thấy, khi bạn vượt qua một giá trị cho các nhà xây dựng bạn đang sử dụng một cuộc tranh cãi, và khi bạn nhìn thấy mã constructor bạn thấy tên tham số (mà nhận đối số đó) và sau đó nó được gán cho thuộc tính instance.

+0

FYI: Ở trên nơi bạn tham khảo "báo cáo gói" và "báo cáo nhập", bạn có thể quan tâm để biết rằng những kỹ thuật đó không phải là tuyên bố. Chúng được gọi là "chỉ thị". Chỉ là fyi. – benjismith

+0

Thật sao? : O Điều mới học được. :) – OscarRyz

+0

Đúng. Sự khác biệt giữa một câu lệnh và một chỉ thị là một câu lệnh gây ra hành vi thời gian chạy (thường là do việc thực hiện trực tiếp các lệnh máy), trong khi chỉ thị chỉ gây ra hành vi biên dịch thời gian. Trong Java, các câu lệnh chỉ có thể xảy ra trong các khai báo phương thức và các khởi tạo tĩnh. – benjismith

0

Thông số (int startCadence, int startSpeed, int startGear) là các đối số hàm tạo và chúng sẽ đặt trường Xe đạp cadence, speedgear. Chúng chỉ có sẵn trong constructor. gear, cadencespeed là các biến mẫu duy nhất cho mỗi trường hợp Xe đạp và có thể tham chiếu từ các phương pháp khác. Các đối số hàm tạo cho phép bạn cung cấp các tham số cho việc khởi tạo một đối tượng. Trong ví dụ này, bạn có thể tạo một đối tượng xe đạp với một thiết bị trong tổng số 1, nhịp từ 0, và tốc độ từ 0 như vậy:

Bicycle bike = new Bicycle(0, 0, 1); 

Hoặc bạn có thể tạo ra một xe đạp di chuyển nơi nhịp là 60 rpm, và tốc độ là 10 dặm/giờ, ở bánh răng thứ 3 như sau:

Bicycle bike = new Bicycle(60, 10, 3); 

Vị trí của hàm tạo không liên quan nhưng thường được đặt trong phần đầu của định nghĩa lớp.

0

1) Vị trí của hàm tạo không quan trọng chút nào. Đi theo quy ước, tuy nhiên, tôi sẽ cá nhân nơi nó như sau:

public class Bicycle { 

    public int gear, cadence speed; 

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

    public void otherFunction1() {} 
    public void otherFunction2() {} 
    public void otherFunction3() {} 

} 

2) bánh, nhịp và tốc độ là các biến thành viên của lớp; chúng thuộc về mỗi Xe đạp và là các biến khác nhau cho mỗi Xe đạp. startCadence, startSpeed ​​và startGear, tuy nhiên, là các biến cục bộ, chỉ thuộc về hàm đó. Khi tôi gọi cho một startCadence

new Bicycle(10, 15, 5); 

được thiết lập đến 10, startSpeed ​​được thiết lập đến 15, và startGear được thiết lập để 5. Sau đó, các nhà xây dựng khởi tạo các biến thành viên để "bắt đầu" biến tương ứng của họ.

-2
public class Account 

{ 

    private static final Exception InsufficientFundsException = null; 

    private int accountNumber; 
    private double availableBalance; 
    private int pin; 
    public Account(int account, int pin,double amount) 
    { 

     this.accountNumber = account; 
     this.pin = pin; 
     this.availableBalance = amount; 
    } 

    public void credit(double amount) 
    { 
     this.availableBalance= this.availableBalance+amount; 
    } 

    public void debit(double amount) throws Exception 
    { 
     if(this.availableBalance>=amount) 
     { 
     this.availableBalance= this.availableBalance-amount; 
     } 
     else 
     { 
      throw new InsufficientFundsException(); 
     } 

    } 

    public int getAccountNumber() 
    { 
     return accountNumber; 
    } 

    public double getAvailableBalance() 
    { 
     return availableBalance; 
    } 
    public String toString() 
    { 
     return "Account="+accountNumber+"pin="+pin+"balance"+availableBalance; 
    } 
    public boolean validatePIN(int pin) 
    { 
     if(this.pin==pin) 
      return true; 
     else return false; 
} 
} 
+0

Vui lòng giải thích câu trả lời của bạn. – kingdamian42

+0

Câu hỏi này được hỏi 5 năm trước. Không có vấn đề gì khi trả lời ngay bây giờ mà không có nhiều lời giải thích. – Buddha

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