-
Liệt kê các phương thức lớp
Object
equals()
hashCode()
toString()
getClass()
notify()
notifyAll()
wait()
wait(long timeOut)
wait(long timeOut, int nanos)
-
equals
Tại sao & phương pháp cần thiếthashCode
?Dùng để so sánh các đối tượng.
Mục đích của phương pháp này
equals
là xác định xem các đối tượng có giống nhau bên trong hay không bằng cách so sánh nội dung bên trong của các đối tượng. Điều nàyequals
hoạt động chậm, đầu tiên mã băm của các đối tượng được so sánh và nếu mã băm bằng nhau, việc kiểm tra sẽ được thực hiện đối vớiequals
-
Điều gì xảy ra nếu bạn ghi đè bằng nhưng không ghi đè
hashCode
?Ban đầu
hashCode
là một số ngẫu nhiên.equals
Các bộ sưu tập trong Java luôn tìm kiếm/so sánh chúng bằng phương thức này trước khi so sánh các đối tượng bằng cách sử dụnghashCode()
. Và nếu các đối tượng giống nhau có khác nhauhashCode
thì các đối tượng đó sẽ được coi là khác nhau - đơn giản là không thể so sánh bằng cách sử dụng chúngequals
. -
Tại sao các phương pháp
wait
,notify
,notifyAll
?Đôi khi một chương trình có thể gặp tình huống một luồng đã nhập một khối mã
synchronized
, chặn màn hình và không thể hoạt động thêm, bởi vì một số dữ liệu vẫn bị thiếu: ví dụ: tệp cần xử lý vẫn chưa được tải hoặc nội dung tương tự. Một phương pháp đã được phát minh để giải quyết vấn đề nàywait()
. Việc gọi phương thức này sẽ khiến luồng giải phóng màn hình và "tạm dừng".Để bỏ tạm dừng, các phương thức được sử dụng
notify
.notifyAll
Phương thứcnotify
“giải phóng” một luồng ngẫu nhiên, phương thứcnotifyAll
– tất cả các luồng “đóng băng” của một màn hình nhất định. -
Làm thế nào để sao chép một đối tượng một cách chính xác?
Hai loại nhân bản.
Để sao chép một đối tượng mặc định:
- Thêm giao diện
Cloneable
vào lớp của bạn - Ghi đè phương thức
clone
và gọi triển khai cơ sở trong đó:
class Point implements Cloneable { int x; int y; public Object clone() { return super.clone(); } }
Hoặc bạn có thể tự viết phần thực hiện của phương thức
clone
:class Point { int x; int y; public Object clone() { Point point = new Point(); point.x = this.x; point.y = this.y; return point; } }
- Thêm giao diện
-
Tại sao phương pháp này cần thiết
finalize()
và nó hoạt động như thế nào?Nếu bạn còn nhớ, đây
finalize()
là một phương thức đặc biệt được gọi trên một đối tượng trước khi trình thu gom rác phá hủy nó.Mục đích chính của phương pháp này là giải phóng các tài nguyên không phải Java bên ngoài đã được sử dụng: đóng tệp, luồng I/O, v.v.
finalize()
hoạt động không ổn định.Phương pháp này không đáp ứng được những mong đợi đặt ra cho nó. Máy Java có thể trì hoãn việc hủy một đối tượng cũng như lệnh gọi một phương thức
finalize
bao lâu tùy thích. Hơn nữa, nó không đảm bảo rằng phương thức này sẽ được gọi. Trong nhiều trường hợp, vì mục đích "tối ưu hóa", nó không được gọi. -
Sự khác biệt là gì
final
,finally
,finalize
?final
- bổ nghĩa- Các trường không thể thay đổi, các phương thức bị ghi đè
- Các lớp không thể được kế thừa
- Công cụ sửa đổi này chỉ áp dụng cho các lớp, phương thức và biến (cả biến cục bộ)
- Các đối số của phương thức được đánh dấu là
final
chỉ đọc; cố gắng thay đổi chúng sẽ dẫn đến lỗi biên dịch. - Переменные
final
не инициализируются по умолчанию, им необходимо явно присвоить meaning при объявлении or в конструкторе, иначе – ошибка компиляции - Если final переменная содержит ссылку на an object, an object может быть изменен, но переменная всегда будет ссылаться на тот же самый an object
- Также это справедливо и для массивов, потому что массивы являются an objectми, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив
- Если класс объявлен
final
иabstract
(взаимоисключающие понятия), произойдет ошибка компиляции - Так How
final
класс не может наследоваться, его методы никогда не могут быть переопределены
finally
— блок в связкеtry-catch-finally
, code в котором выполнится независимо от того вылетело ли исключение в блокеtry
or нет. Используется для освобождения ресурсов.finalize
— метод в классеObject
см 6. -
What такое
try-with-resources
?Это специальная конструкция
try
, называемаяtry-with-resources
, в которой Обрати внимание – послеtry
следуют круглые скобки, где объявляются переменные и создаются an objectы. Эти an objectы можно использовать внутри блокаtry
, обозначенного скобками{}
. Когда выполнение команд блокаtry
закончится, независимо от того – нормально оно закончилось or было исключение, для an object, созданного внутри круглых скобок()
, будет вызван методclose()
; -
Чем отличаются методы
wait(1000)
иsleep(1000)
?sleep()
приостанавливает поток на указанное. состояние меняется на TIMED_WAITING, по истечению — RUNNABLEwait()
меняет состояние потока на WAITINGможет быть вызвано только у an object владеющего блокировкой, в противном случае выкинется исключение IllegalMonitorStateException. при срабатывании метода блокировка отпускается, что позволяет продолжить работу другим потокам ожидающим захватить ту же самую блокировку . в случае
wait(int)
с аргументом состояние будет TIMED_WAITING -
В чем отличие
i++
и++i
?++i
,i
сначала увеличивается на 1, затем участвует в выражении.i++
,i
сначала участвует в выражении, затем увеличивается на 1.
GO TO FULL VERSION