2012-01-06 17 views
8

Khi nào cần sử dụng từ khóa new trong Java. Tôi biết bạn có nghĩa vụ phải sử dụng nó khi bạn tạo một thể hiện của một đối tượng như thế này:Khi nào là thời điểm thích hợp để sử dụng từ khóa 'mới'?

TextView textView = new TextView(this); 

Đôi khi trong mã tôi nhận thấy rằng new không được sử dụng và tôi bị lẫn lộn .. Trong dòng mã này:

AssetManager assetManager = getAssets(); 

Tại sao không phải là một thể hiện của các AssetManager tạo như thế này:

AssetManager assetManager = new AssetManager(); 

sau đó nó được thiết lập bằng getAssests()?

Khi nào nên sử dụng new?

Cảm ơn!

Trả lời

9

Bạn sử dụng từ khóa mới khi đối tượng đang được tạo một cách rõ ràng lần đầu tiên. Sau đó lấy một đối tượng bằng cách sử dụng một phương thức getter mới là không cần thiết vì đối tượng đã tồn tại trong bộ nhớ, do đó không cần phải được tạo lại.

nếu bạn muốn có một mô tả chi tiết hơn về chuyến viếng thăm mới the oracle docs

Một đối tượng sẽ cần từ khóa 'mới' nếu nó là null (đó là lạ mắt cho không được khởi tạo).

EDIT:

Điều này sẽ luôn in "cần mới" trong các trường hợp hiện tại.

Object mObj = null; 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 

OUTPUTS: needs new 

Vì vậy, để khắc phục nó, bạn sẽ làm điều gì đó như:

Object mObj = new Object(); 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 
OUTPUTS: does NOT need new 

Và dưới những hoàn cảnh chúng tôi sẽ luôn luôn xem "KHÔNG cần mới"

+0

Làm thế nào để bạn biết một đối tượng đã được tạo chưa? – foobar5512

+0

Khi bạn cố gắng tham khảo nó, nó sẽ là null. Bạn có thể kiểm tra bằng một cái gì đó như (tham khảo cập nhật của tôi) – AedonEtLIRA

+1

Bạn nhận được thông tin này từ tài liệu - hoặc kinh nghiệm. Ví dụ: Người quản lý thường được sử dụng như đơn (hoặc s.th. tương tự), vì vậy chỉ có một ví dụ. Loại lớp bạn không tạo, nhưng có một hàm để truy xuất đối tượng. –

2

Bằng cách sử dụng new bạn phân bổ bộ nhớ cho đối tượng.

Sử dụng getXXX() được sử dụng để lấy đối tượng hiện có đã được phân bổ.

2

Mới được sử dụng khi bạn gọi hàm khởi tạo cho hàm. getAssets() trả về một AssetManager, nó không cần phải tạo một cái mới.

2

Vì bạn đã gắn cờ thẻ này với [android], tôi đoán mã của bạn nằm trong số Activity hoặc Service. Trong trường hợp này, getAssets() là một phương thức của lớp bạn đang mở rộng. Vì vậy, bạn không thực sự tạo ra nó, bạn đang yêu cầu mã hiện có để cung cấp cho bạn một tham chiếu đến những gì đã tồn tại.

0

nhận thấy chữ cái viết hoa trong TextView và thiếu chữ trong getAssets. getAssets không phải là một lớp như TextView, nó là một phương thức trả về một đối tượng. Và giống như nhiều người khác được đề cập, nội dung của bạn đã tồn tại.

5

Trong java bạn luôn phải sử dụng new để khởi tạo đối tượng (tốt, hầu như luôn luôn). Với getAssests() bạn truy xuất một tài khoản đã được tạo.Tôi đoán câu hỏi của bạn xuất phát từ C++ trong đó new phân bổ bộ nhớ động, nhưng vì java chỉ có các đối tượng động, nên mới luôn cần thiết.

3

new luôn được sử dụng để tạo đối tượng mới.

này

AssetManager assetManager = getAssets(); 

chỉ được gán một giá trị trả về từ phương pháp getAssets() để tham khảo assetManager.

[sửa]

tôi nói dối về new nó có thể làm điều gì đó như thế này:

Foo.class.newInstance(); 

và bạn cũng có thể sử dụng phản ánh:

Foo.class.getDeclaredConstructors(Class[] parameterTypes).newInstance(arguments); 
1

Trong Java, new MyClass()creates a new instance của MyClass và trả về một tham chiếu đến nó.

Trong khi đó, tuyên bố:

MyClass foo; 

định nghĩa một biến foo có thể lưu trữ một tham chiếu đến một thể hiện của MyClass, hoặc giá trị đặc biệt null cho biết sự vắng mặt của một tài liệu tham khảo như vậy. Nếu bạn không đảm bảo bất kỳ tham chiếu nào đến foo, giá trị mặc định của nó sẽ là null.

Bạn chắc chắn có thể kết hợp những thứ này, ví dụ: như thế này:

MyClass foo;   // define a variable foo that can store an object reference 
foo = new MyClass(); // create a new object and assign a reference to it to foo 

hay tương đương, như thế này:

MyClass foo = new MyClass(); // combined variable definition and assignment 

Nhưng bạn không để tạo ra một trường hợp mới mỗi khi bạn gán một cái gì đó cho một biến tham khảo. Bạn cũng có thể làm được. này:

MyClass foo, bar;  // define two reference variables, foo and bar 
foo = new MyClass(); // create a new object and assign a reference to it to foo 
bar = foo;    // now foo and bar point to the same object 

hoặc thậm chí:

MyClass foo = new MyClass(), bar = foo; // same, but shorter 

Lưu ý rằng trong Java, như trái ngược với một số ngôn ngữ khác như C++, bạn có thể không bao giờ gán (một bản sao của) một đối tượng thực tế vào một biến. Thay vào đó, các đối tượng Java luôn được truy cập thông qua các tham chiếu đến chúng. Khi ai đó nói về "gán đối tượng cho biến" hoặc "chuyển đối tượng dưới dạng tham số" hoặc "trả về đối tượng từ phương thức" trong Java, ý nghĩa của chúng luôn là gán hoặc chuyển hoặc trả về tham chiếu vật.


Phương thức mà lệnh mã của bạn có thể (và thường làm) cũng trả về tham chiếu đến đối tượng.Ví dụ, nếu lớp học của bạn có một phương pháp như thế này:

private MyClass getSomeObject() { 
    // ...some code here... 
} 

bạn có thể gọi nó và lưu lại tài liệu tham khảo nó sẽ trả về vào một biến như thế này:

MyClass foo; 
foo = getSomeObject(); 

hay như thế này:

MyClass foo = getSomeObject(); 

Chúng tôi có thể biết từ phương thức khai báo rằng getSomeObject() sẽ luôn trả lại tham chiếu đến một ví dụ MyClass (hoặc null), nhưng không phải ở vị trí thứ ví dụ thực sự đến từ. Điều đó hoàn toàn phụ thuộc vào mã bên trong phương thức getSomeObject(). Mã này luôn có thể tạo một phiên bản MyClass mới với new MyClass() mỗi lần được gọi và trả về một tham chiếu đến nó hoặc nó luôn có thể trả lại tham chiếu đến đối tượng cùng một đối tượng. Hoặc, tất nhiên, đôi khi nó có thể trả lại một tham chiếu đến một đối tượng mới và đôi khi là một đối tượng được tạo trước đó.


Lưu ý rằng, nếu bạn chỉ định giá trị mới cho biến, bất kỳ biến nào chứa trước đó sẽ bị lãng quên. Nếu giá trị đã quên xảy ra là tham chiếu cuối cùng đối với một số đối tượng, thì chính đối tượng đó sẽ bị hủy bởi bộ thu gom rác của Java.

Vì vậy, ví dụ, trong khi nó chắc chắn thể để làm một cái gì đó như thế này:

MyClass foo = new MyClass(); // create a new object and assign (a reference to) it to foo 
foo = getSomeObject();  // forget the previous content of foo and replace it with whatever getSomeObject() returns 

thường làm cho không có ý nghĩa, vì bạn muốn được tạo ra một MyClass dụ mới chỉ để ngay lập tức vứt bỏ bạn chỉ tham chiếu đến nó và thay thế nó bằng cái gì đó khác. Trong thực tế, các mã trên là chính xác tương đương với:

new MyClass();  // create a new object and throw away(!) the reference to it 
MyClass foo = getSomeObject(); // assign whatever getSomeObject() returns to foo 

Thời gian duy nhất mà ngay cả từ xa có thể có ý nghĩa sẽ được nếu bạn muốn để tạo ra một MyClass dụ mới và ngay lập tức để cho nó được thu gom rác thải, ví dụ vì hàm tạo MyClass có một số tác dụng phụ mà bạn muốn kích hoạt. Nhưng vì nó thường được coi là xấu cho các nhà xây dựng để có bất kỳ tác dụng phụ không tầm thường (hoặc, nói chung, để làm bất cứ điều gì ngoài việc thiết lập các đối tượng mới), bạn không nên có bất kỳ lý do gì để viết mã như vậy.

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