Trong Java, các từ khóa `cuối cùng`,` cuối cùng` và `cuối cùng` thực hiện mục đích gì? [đóng cửa]


82

Trong Java, mục đích gì làm các từ khóa final, finallyfinalizethực hiện?


4
Câu hỏi bài tập về nhà? allu.wordpress.com/2006/11/08/…
Grey

12
Chúng thậm chí không phải là những khái niệm có thể so sánh được. Chúng chỉ tình cờ được đánh vần giống nhau. Đọc một số bài.
Marcelo Cantos

3
Chúng không liên quan gì đến nhau - hoàn toàn không liên quan, về mặt khái niệm. Nghiên cứu từng thứ riêng biệt.
Ed Staub

7
Điều này không nên được đóng lại vì nó dường như là một câu hỏi tương đối phổ biến.
David Titarenco

1
đã bỏ phiếu để mở lại do câu trả lời hay, có thể hữu ích cho người dùng đến đây.
akappa

Câu trả lời:


272

sau cùng

final có thể được sử dụng để đánh dấu một biến "không thể thay đổi"

private final String name = "foo";  //the reference name can never change

final cũng có thể làm cho một phương thức không bị "ghi đè"

public final String toString() {  return "NULL"; }

finalcũng có thể làm cho một lớp không được "kế thừa". tức là lớp không thể được phân lớp.

public final class finalClass {...}
public class classNotAllowed extends finalClass {...} // Not allowed

cuối cùng

finallyđược sử dụng trong câu lệnh try / catch để thực thi mã "luôn luôn"

lock.lock();
try {
  //do stuff
} catch (SomeException se) {
  //handle se
} finally {
  lock.unlock(); //always executed, even if Exception or Error or se
}

Java 7 có một thử nghiệm mới với tuyên bố tài nguyên mà bạn có thể sử dụng để tự động đóng các tài nguyên triển khai rõ ràng hoặc ngầm định java.io.Closable hoặc java.lang.AutoClosable

hoàn thiện

finalizeđược gọi khi một đối tượng được thu gom rác. Bạn hiếm khi cần ghi đè nó. Một ví dụ:

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}

18
câu trả lời hay hơn hầu hết các sách Java !!
tư vào

3
Cảm ơn bạn. Câu trả lời này được giải thích tốt so với những người khác gọi họ là "chuyên gia".
datnt

2
Câu trả lời tốt nhưng chữ ký của phương thức hoàn thiện là sai.
Samarth Shah

Lưu ý: Các Object#finalize()phương pháp đã bị phản đối trong Java 9 ( JDK-8.165.641 ).
Slaw

19
  • "Cuối cùng" biểu thị rằng điều gì đó không thể thay đổi. Bạn thường muốn sử dụng điều này trên các biến tĩnh sẽ giữ cùng một giá trị trong suốt vòng đời của chương trình của bạn.
  • "Cuối cùng" được sử dụng cùng với một khối try / catch. Bất kỳ điều gì bên trong mệnh đề "cuối cùng" sẽ được thực thi bất kể mã trong khối 'thử' có ném ngoại lệ hay không.
  • "Finalize" được gọi bởi JVM trước khi một đối tượng sắp được thu gom.

6

Từ khóa final dùng để khai báo hằng số.

final int FILE_TYPE = 3;

Từ khóa cuối cùng được sử dụng trong câu lệnh try catch để chỉ định một khối mã để thực thi bất kể ngoại lệ được đưa ra.

try
{
  //stuff
}
catch(Exception e)
{
  //do stuff
}
finally
{
  //this is always run
}

Và cuối cùng (haha), finalize tôi không hoàn toàn chắc chắn là một từ khóa, nhưng có một hàm finalize () trong lớp Object.


6

http://allu.wordpress.com/2006/11/08/difference-between-final-finally-and-finalize/

cuối cùng - khai báo hằng.

cuối cùng - Khối cuối cùng luôn thực thi khi khối thử thoát, ngoại trừ lệnh gọi System.exit (0). Điều này đảm bảo rằng khối cuối cùng được thực thi ngay cả khi một ngoại lệ không mong muốn xảy ra. Nhưng cuối cùng hữu ích cho nhiều hơn là chỉ xử lý ngoại lệ - nó cho phép lập trình viên tránh việc mã dọn dẹp vô tình bị bỏ qua khi trả về, tiếp tục hoặc ngắt. Đặt mã dọn dẹp trong một khối cuối cùng luôn là một phương pháp hay, ngay cả khi không có ngoại lệ nào được dự đoán trước.

finalize () - phương thức giúp thu gom rác. Một phương thức được gọi trước khi một đối tượng bị bộ thu gom rác loại bỏ, cho phép nó dọn dẹp trạng thái của nó. Không nên được sử dụng để giải phóng các tài nguyên không phải bộ nhớ như xử lý tệp, ổ cắm, kết nối cơ sở dữ liệu, v.v. vì Java chỉ có một số lượng hữu hạn các tài nguyên này và bạn không biết khi nào bộ sưu tập rác sẽ bắt đầu giải phóng các tài nguyên không phải bộ nhớ này thông qua phương thức finalize ().

Bạn đã thử tìm kiếm trên google và cần được giải thích rõ ràng?


4
Chào mừng bạn đến với Stack Overflow! Mặc dù bài viết này trên thực tế có thể trả lời câu hỏi, nhưng sẽ tốt hơn nếu đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Stack Overflow chỉ hữu ích như các câu hỏi và câu trả lời của nó, và nếu máy chủ blog này gặp sự cố hoặc các URL bị di chuyển, câu trả lời này sẽ trở nên vô dụng. Cảm ơn!
sarnold

6

final: cuối cùng là một từ khóa. Biến được coi là cuối cùng chỉ được khởi tạo một lần và không thể thay đổi. Các lớp Java được khai báo là cuối cùng không thể được mở rộng. Không thể ghi đè các phương thức được khai báo là cuối cùng.

cuối cùng: cuối cùng là một khối. Khối cuối cùng luôn thực thi khi khối try thoát. Điều này đảm bảo rằng khối cuối cùng được thực thi ngay cả khi một ngoại lệ không mong muốn xảy ra. Nhưng cuối cùng hữu ích cho nhiều hơn là chỉ xử lý ngoại lệ - nó cho phép lập trình viên tránh việc mã dọn dẹp vô tình bị bỏ qua khi trả về, tiếp tục hoặc ngắt. Đặt mã dọn dẹp trong một khối cuối cùng luôn là một phương pháp hay, ngay cả khi không có ngoại lệ nào được dự đoán trước.

finalize: cuối cùng là một phương thức. Trước khi một đối tượng được thu gom rác, hệ thống thời gian chạy sẽ gọi phương thức finalize () của nó. Bạn có thể viết mã giải phóng tài nguyên hệ thống trong phương thức finalize () trước khi thu gom rác.


2

1. Cuối cùng • Cuối cùng được sử dụng để áp dụng các hạn chế về lớp, phương thức và biến. • Không thể kế thừa lớp cuối cùng, không thể ghi đè phương thức cuối cùng và không thể thay đổi giá trị biến cuối cùng. • Các biến cuối cùng được khởi tạo tại thời điểm tạo ngoại trừ trường hợp biến cuối cùng trống được khởi tạo trong Constructor. • Cuối cùng là một từ khóa.

2. Cuối cùng • Cuối cùng được sử dụng để xử lý ngoại lệ cùng với thử và bắt. • Nó sẽ được thực thi cho dù ngoại lệ có được xử lý hay không. • Khối này được sử dụng để đóng các tài nguyên như kết nối cơ sở dữ liệu, tài nguyên I / O. • Cuối cùng là một khối.

3. Finalize • Finalize được gọi bởi chuỗi thu gom rác ngay trước khi thu thập các đối tượng đủ điều kiện để thực hiện xử lý dọn dẹp. • Đây là cơ hội cuối cùng để đối tượng thực hiện bất kỳ thao tác dọn dẹp nào nhưng vì nó không được đảm bảo rằng liệu finalize () có được gọi hay không, nên thực tế không tốt là giữ nguyên tài nguyên cho đến khi lệnh gọi finalize. • Finalize là một phương pháp.


0

Ý nghĩa của final trong java là: -được áp dụng cho một biến có nghĩa là biến tương ứng sau khi được khởi tạo không thể sửa đổi được nữa

private final double numer = 12;

Nếu bạn cố gắng sửa đổi giá trị này, bạn sẽ gặp lỗi.

-được áp dụng cho một phương thức có nghĩa là không thể ghi đè phương thức tương ứng

 public final void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }

Nhưng phương thức cuối cùng có thể được kế thừa vì từ khóa cuối cùng hạn chế việc định nghĩa lại phương thức.

-được áp dụng cho một lớp có nghĩa là lớp tương ứng không thể được mở rộng.

class Base
{

    public void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }
}

Ý nghĩa của cuối cùng là:

class TestFinallyBlock{  
  public static void main(String args[]){  
  try{  
   int data=25/5;  
   System.out.println(data);  
  }  
  catch(NullPointerException e){System.out.println(e);}  
  finally{System.out.println("finally block is always executed");}  
  System.out.println("rest of the code...");  
  }  
} 

trong ví dụ này, ngay cả khi try-catch được thực thi hay không, những gì bên trong cuối cùng sẽ luôn được thực thi. Ý nghĩa của finalize:

class FinalizeExample{  
public void finalize(){System.out.println("finalize called");}  
public static void main(String[] args){  
FinalizeExample f1=new FinalizeExample();  
FinalizeExample f2=new FinalizeExample();  
f1=null;  
f2=null;  
System.gc();  
}}  

trước khi gọi Người thu gom rác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.