2013-07-29 27 views
5

Hôm nay trong khi tìm kiếm một đoạn mã nhất định từ google, tôi đã xem qua một blog Q/A, trong đó người ta nói rằng chúng ta có thể khai báo biến cục bộ bên trong một phương thức của lớp là cuối cùng. Tuy nhiên, tác giả đã miễn cưỡng đủ để giải thích sự cần thiết/lợi ích của việc làm như vậy.biến cục bộ được thực hiện cuối cùng theo phương thức của một lớp - nhưng tại sao?

như

public class A 
{ 
private void show() 
{ 
    final String s="checking"; 
} 
} 

tôi sẽ tìm sự giúp đỡ rất kinh nghiệm java để giáo dục tôi về vấn đề này. Cảm ơn trước vì sự hỗ trợ và hướng dẫn của các bạn.

Trân trọng!

+3

có thể trùng lặp của [Sử dụng "sửa đổi cuối cùng" bất cứ khi nào có thể áp dụng trong java] (http://stackoverflow.com/questions/137868/using-final-modifier-whenever- áp dụng-trong-java) –

Trả lời

8

Ngoài câu trả lời khác, làm cho một biến final cho phép việc sử dụng các biến trong việc thực hiện nội tuyến của các lớp và các giao diện:

final String test = "test"; 

foo = new Foo() { 
     public void bar() { 
      System.out.println(test); 
     } 
    }; 

EDIT: Nếu bạn là một người mới bắt đầu nó cũng có thể là giá trị chỉ ra rằng biến số thực ra là tham chiếu thành một ví dụ . Khi bạn tạo một biến số final, bạn đang thực tế tạo tham số không đổi, nghĩa là biến cuối cùng không bao giờ có thể tham chiếu đến một số cá thể khác sau khi khởi tạo. Điều này không đưa ra tuyên bố về việc liệu trường hợp được tham chiếu thực tế có phải là không đổi hay không.

Ví dụ, nếu bạn nói final String[] foo = { "bar", baz" } bạn thể làm foo[0] = "sheep" mặc dù foofinal. Những gì bạn không thể làm là tham chiếu foo biến cho một thứ khác, như trong foo = new String[]... hoặc foo = someOtherArray. Điều này có liên quan đến tính đột biến không thay đổi và các khái niệm này có phần tương tự như final, vì vậy chúng có thể đáng được điều tra.

+0

Câu trả lời tuyệt vời Sir! Cảm ơn rất nhiều :) – animark

0

khi biến thể là cuối cùng, bạn không thể thay đổi nó. điều đó có nghĩa là - một sai lầm bạn không thể làm - hoặc, nếu chính xác hơn, một sai lầm hợp lý sẽ tạo ra lỗi biên dịch và tiết kiệm thời gian gỡ lỗi dài.


không được trộn lẫn với số final class mà bạn không thể kế thừa.


more data could be found in wikipedia

+0

Cảm ơn Ngài! vâng tôi hiểu phần đó, nhưng vì biến đó không phải là biến thành viên của lớp đó, mà đúng hơn là chỉ có một phạm vi cục bộ cho phương thức đó, những gì tác động có thể thừa kế có thể mang lại cho nó? nhu cầu làm cho nó cuối cùng là gì ?? Hãy cho tôi biết nếu câu hỏi của tôi có ý nghĩa với bạn. – animark

+0

'final' không chỉ dành cho kế thừa. khi bạn khai báo var final, điều đó có nghĩa là bạn không thể thay đổi nó. như 'const' trong c/C++. – elyashiv

4

Biến thể được đặt trong bộ nhớ chỉ đọc, làm cho nó nhanh hơn để hoạt động trên.

Ngoài ra, nó có thể đơn giản là hợp lý để làm như vậy, ví dụ để đại diện cho hằng số địa phương hoặc đảm bảo rằng một giá trị nhất định không phải là vô tình thay đổi. Điều này làm cho nó một cách hữu ích để biến lỗi thành lỗi trình biên dịch.

Ngoài ra, nó cho phép biến được sử dụng trong các lớp bên trong/ẩn danh, như được chỉ ra bởi các câu trả lời khác.

1

Thêm final cho tất cả mọi thứ mà nên không thay đổi chỉ đơn giản là thu hẹp các khả năng mà bạn (hoặc các lập trình viên tiếp theo, làm việc trên mã của bạn) sẽ hiểu sai hoặc lạm dụng quá trình suy nghĩ đó dẫn đến mã của bạn.

Lấy từ this answer cho một câu hỏi tương tự.

4

Ngoài việc thực thi biến không thay đổi sau khi khởi tạo, khai báo biến là final làm cho nó có thể truy cập được vào phương thức lớp bên trong cục bộ.
Thông tin chi tiết có thể thu được bằng cách nhìn vào mã tháo rời cho mảnh nhỏ mã sau đây:

class MyFinal 
{ 
    public static void main(String[] args) 
    { 
     String str = "java"; 
     final String str1 = "Hello"; 
    } 
} 

Mã tháo rời cho chương trình trên là như sau:

J:\>javap -c MyFinal 
Compiled from "MyFinal.java" 
class MyFinal extends java.lang.Object{ 
MyFinal(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: ldc  #2; //String java 
    2: astore_1 
    3: return 

} 

Trong phương pháp chính của mã tháo rời ở trên, chúng ta thấy rằng, trình biên dịch java đã giữ mã để tạo đối tượng String là non-final biến str nhưng nó đã bỏ qua một cách âm thầm mã tạo đối tượng String cho final String str1 = "Hello";. Nó là như vậy bởi vì, str1 không được sử dụng trong phương pháp bất cứ nơi nào. Do đó nó giúp trình biên dịch để tối ưu hóa mã, dẫn đến việc tránh tạo đối tượng không cần thiết nếu không sử dụng nó.

2

Điều này làm cho tinh thần có thể dễ dàng biết rằng biến sẽ không thay đổi. Nếu đây là một nguyên thủy, bạn có thể xem xét giá trị là bất biến, và nếu nó không phải là, bây giờ bạn biết rằng giá trị sẽ luôn luôn là cùng một ví dụ (mà nhà nước có thể được thay đổi).

Điều này rất hữu ích cho khả năng đọc của chương trình để chúng tôi chắc chắn rằng biến không bao giờ được gán lại. Nó cũng hữu ích cho các chức năng ẩn danh, được giải thích ở đây: Why do we use final keyword with anonymous inner classes?

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