2013-07-18 46 views
5

Tôi đã nhận thấy một điều rằng một hàm tạo và một phương thức đơn giản của một lớp làm cùng một công việc. lý do chính xác để tạo ra một cấu trúc của một lớp là gì? Nếu tôi tạo phương thức khởi tạo MyClass(){} và phương thức MyClassMethod(){}, nó sẽ thực hiện công việc tương tự khi tôi viết phần nội dung của phương thức và hàm tạo đó. Vì vậy, nhu cầu xây dựng là gì? Nó có sử dụng đặc biệt nào không?lợi ích bổ sung của việc tạo hàm tạo trong java là gì?

+0

Có nhiều công dụng của nhà xây dựng không phải là chức năng thực thi nhà ở! – NINCOMPOOP

+0

http://www.javaworld.com/jw-10-2000/jw-1013-constructors.html – Santosh

Trả lời

1

Một trong những lợi ích của việc sử dụng một hàm tạo trên một phương thức là bạn có thể đảm bảo rằng hàm tạo đã được gọi và công việc bên trong hàm tạo đã được thực hiện.

Ngôn ngữ quy định rằng để xây dựng một đối tượng, một hàm tạo phải được gọi. Vì vậy, nếu bạn sử dụng một phương thức tùy chỉnh để thiết lập trạng thái ban đầu của đối tượng của bạn, trước tiên bạn sẽ cần phải gọi hàm tạo mặc định. Tại sao thực hiện hai cuộc gọi phương thức khi bạn có thể thực hiện công việc trong một cuộc gọi hàm khởi tạo và được đảm bảo rằng đối tượng đã được khởi tạo đúng cách?

public class Test(){ 

    private Integer x; 

    public Test(){ 

    } 

    public Test(Integer x){ 
     this.x = x; 
    } 

    public void setX(Integer x){ 
     this.x = x; 
    } 

    public void doSomethingWithX(){ 
     this.x.toString(); 
    } 
} 

Test test = new Test(8); 
test.doSomethingWithX(); //I know x has been declared and assigned 

Test test = new Test(); 
test.doSomethingWithX(); //X has not been assigned results in NPE 
3

Nếu bạn tạo một đối tượng mới của MyClass nó sẽ tự động gọi các nhà xây dựng - bạn có thể khởi tạo tất cả các thành viên bên trong nó, và chắc chắn rằng đây object's thành viên đều khởi tạo.

chung:
Một constructor là luôn gọi lần khi bạn tạo một đối tượng mới của lớp này, và bạn can't gọi nó bằng tay.
không thực hiện công việc "thực" trong một hàm tạo, vì nó sẽ làm chậm việc tạo đối tượng của lớp này - chỉ khởi tạo lớp/thành viên của bạn ở đó.

Bạn cũng có thể sử dụng các hàm tạo khác nhau, tùy thuộc vào nhu cầu của bạn - nhưng nếu bạn tạo một hàm tạo, không có hàm tạo mặc định nào khác!

Ví dụ:

public MyClass { 

    int score; 

    public MyClass(int sc) { // already know the score 
    score = sc; 
    } 

    public MyClass() { // don´t know the score yet 
    score = 1; 
    } 

    public void addScore() { 
    score += 5; // i know for sure that score is not zero 
    } 

} 
4

Một số điểm:

1) Constructors là cách duy nhất để thiết lập final biến ví dụ.

public class SomeType { 
    final int x ; 
    SomeType(int y){ 
    x=y; 
    } 
} 

2) Không thể phân lớp phụ với lớp khởi tạo private.

3) Nếu lớp của bạn là lớp con và lớp cơ sở không có hàm tạo mặc định, thì bạn cần hàm tạo trong lớp của bạn để gọi hàm tạo siêu lớp.

0

Bạn có thể đặt final trường không có bộ khởi tạo trong hàm tạo. Điều này giúp xây dựng immutable trường hợp:

class Number extends Expr { 
    private final int n; 

    public Number(int n) { 
     this.n = n; 
    } 

    public int getValue() { 
     return this.n; 
    } 
} 

Vì vậy, sau một constructor như thế này, bạn có thể dựa trên thực tế là các trường hợp được khởi tạo hoàn toàn (và trong trường hợp này, đó là giá trị là bất biến/hằng) .

2

Về cơ bản, hàm tạo chỉ là một phương thức đặc biệt trả về ngầm một đối tượng chứa kiểu chứa của nó.Bạn thường nên sử dụng các nhà xây dựng để tạo các đối tượng - đây là những gì mọi người mong đợi để xem.

Tuy nhiên, có một thành ngữ hữu ích được gọi là factory method (thêm thông tin tại this link) trong đó chủ yếu là sử dụng một phương pháp tĩnh để xây dựng một đối tượng, ưu điểm nổi bật là

  • Bạn có thể cung cấp một phương pháp nhà máy một nhiều tên mô tả (trong khi tất nhiên một hàm tạo tiêu chuẩn phải được đặt tên sau lớp chứa).
  • Họ không để trả lại một đối tượng, mang lại sự linh hoạt hơn.
  • Họ có thể trả lại một loại phụ của lớp học.
+0

Các phương thức này không được gọi là phương thức 'static constructor' nhưng là phương thức factory. –

+0

Sự hiểu biết của tôi là nó được gọi là một hàm tạo tĩnh nếu nó trả về kiểu chứa lớp và phương thức factory nếu không (ví dụ nó thuộc về một lớp nhà máy chuyên dụng). Tuy nhiên một chút googling cho thấy rằng phương pháp nhà máy là tên phổ biến trong cả hai trường hợp, sẽ cập nhật câu trả lời của tôi. Cảm ơn! – robjohncox

0

Constructor không phải là phương pháp đơn giản. Nó được gọi mỗi khi đối tượng của lớp đó được tạo ra. Bạn không cần phải gọi nó một cách rõ ràng.


Có somethings rằng chúng ta cần phải làm ngay khi đối tượng được tạo ra, ví dụ khi bạn tạo một loại giao diện điều bạn muốn thiết lập nhiều tài sản trên thời điểm tạo ra như kích thước của cửa sổ, vv Một lợi ích khác của constructor là bảo mật của class. Bạn không thể tạo một đối tượng trừ khi bạn biết chu vi bên phải của hàm tạo.


Thông tin chi tiết: http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

3

Một constructor và một phương pháp là hai việc khác nhau. Thực tế là bạn có thể viết mã tương tự hoặc tương tự bên trong chúng là không thích hợp.

Khi đối tượng mới được tạo, hàm tạo được gọi. Nếu bạn không chỉ định một trình biên dịch sẽ tạo một trình biên dịch mặc định cho bạn. Đây là nơi mà initializaton của các lĩnh vực của đối tượng diễn ra và bộ nhớ được phân bổ cho các đối tượng. Đây là một khái niệm mà tất cả các ngôn ngữ hướng đối tượng đều có. Một đối tượng mới phải được khởi tạo bằng cách nào đó. Bộ nhớ cần được cấp phát. Trong Java, bạn không tự quản lý bộ nhớ (ít nhất là không trực tiếp) vì vậy đây là mục đích của hàm tạo. Lưu ý rằng vì hàm tạo luôn được thực hiện, hành vi này là được thực thi ngay khi bạn gọi, ví dụ: Person p = new Person();.

Bây giờ, kể từ khi một hàm tạo luôn được gọi, bạn có một tùy chọn ở đây: bạn có cho phép hàm tạo mặc định thực hiện hoặc bạn tự tạo một hàm tạo không? Có lẽ có các trường cần được khởi tạo theo cách khác với giá trị mặc định của chúng. Hoặc có lẽ bạn không cần cho phép tạo một đối tượng mà không cung cấp một số giá trị. Nếu bạn tự định nghĩa một hàm tạo, trình biên dịch không tạo một trình mặc định cho bạn. Vì vậy, nếu tôi có public Person(String firstName, String lastName) {} sau đó tôi đã tạo ra một quy tắc cụ thể đó là một lần nữa thực thi bởi hệ thống: một đối tượng mới của lớp người không thể được tạo ra, trừ khi bạn cung cấp cho một tên đầu tiên và tên cuối cùng:

Person p = new Person(); // this would give a compile error 
Person p = new Person("John", "Smith"); // this is the only way to create an object now 

Sử dụng một phương pháp bạn không thể thực thi điều này. Lập trình viên sử dụng lớp của bạn có thể gọi phương thức của bạn hay không. Hàm khởi tạo là một phần của vòng đời của đối tượng. Các phương thức xác định hành vi của đối tượng

0

Một hàm tạo là một phương pháp đặc biệt của một lớp hoặc cấu trúc trong lập trình hướng đối tượng khởi tạo đối tượng thuộc loại đó.

Một số điểm:

1. A constructor eliminates placing the default values. 
2. A constructor eliminates calling the normal method implicitly. 
Các vấn đề liên quan