
1. Các tính năng quan trọng của bản phát hành Java 8 là gì?
Java 8 đã được phát hành vào tháng 3 năm 2014, vì vậy nó là
một trong những chủ đề nóng trong các câu hỏi phỏng vấn java. Nếu bạn trả
lời câu hỏi này một cách rõ ràng, điều đó sẽ cho thấy rằng bạn thích cập nhật
cho mình những công nghệ kiểm tra.
Java 8 là một trong những bản phát hành lớn nhất sau Java 5
chú thích và tổng quát. Một số tính năng quan trọng của Java 8 là:
1. Thayđổi Interface với các phương thức deafult và stattic
2. Chức năng interfaces và Biểu thức Lambda
3. Java Stream API cho cáccollection class
Tôi thực sự khuyên bạn nên đi qua các liên kết trên để hiểu
đúng về từng thứ trong số chúng, cũng đọc Các
tính năng của Java 8 .
2. Ý bạn là gì về tính độc lập nền tảng của Java?
3. JVM là gì và nó có độc lập với nền tảng không?
4. Sự khác biệt giữa JDK và JVM là gì?
Bộ công cụ phát triển Java (Java Development Kit) dành cho mục đích phát triển và JVM là một phần của nó để xử lý các chương trình java.JDK cung cấp tất cả các công cụ, tệp thực thi và mã nhị phân cần thiết để biên dịch, gỡ lỗi và thực thi Chương trình Java. Phần thực thi được xử lý bởi JVM để cung cấp tính độc lập cho máy.
5. Sự khác biệt giữa JVM và JRE là gì?
Java Runtime Environment (JRE) là việc triển khai JVM. JRE bao gồm JVM và các mã nhị phân Java và các lớp khác để thực thi thành công bất kỳ chương trình nào. JRE không chứa bất kỳ công cụ phát triển nào như trình biên dịch java, trình gỡ lỗi, v.v. Nếu bạn muốn thực thi một chương trình java, bạn nên cài đặt JRE.6. Lớp nào là lớp cha của tất cả các lớp?
java.lang.Object là lớp gốc cho tất cả các lớp java và chúng ta không cần mở rộng nó.7. Tại sao Java không hỗ trợ đa kế thừa?
Java không hỗ trợ đa kế thừa trong các lớp vì "Vấn đề kim cương". Để biết thêm về vấn đề kim cương với ví dụ, hãy đọc Đa thừa kế trong Java.
Tuy nhiên đa kế thừa được hỗ trợ trong các interface. Một interface có thể mở rộng nhiều interface bởi vì chúng chỉ khai báo các phương thức và việc triển khai sẽ hiện diện trong lớp thực thi. Vì vậy, không có vấn đề về vấn đề kim cương với các interface.
8. Tại sao Java không phải là ngôn ngữ hướng đối tượng thuần túy?
Java không được cho là hướng đối tượng thuần túy vì nó hỗ trợ các kiểu nguyên thủy như int, byte, short, long, v.v. Tôi tin rằng nó mang lại sự đơn giản cho ngôn ngữ khi viết mã của chúng tôi. Rõ ràng java có thể có các đối tượng wrapper cho các kiểu nguyên thủy nhưng chỉ để biểu diễn, chúng sẽ không mang lại bất kỳ lợi ích nào.Như chúng ta đã biết, đối với tất cả các kiểu nguyên thủy, chúng ta có các lớp bao bọc như Integer, Long, v.v. cung cấp một số phương thức bổ sung.
9. Sự khác biệt giữa biến path và classpath là gì?
PATH là một biến môi trường được hệ điều hành sử dụng để định vị các tệp thực thi. Đó là lý do tại sao khi chúng ta cài đặt Java hoặc muốn bất kỳ tệp thực thi nào được tìm thấy bởi Hệ điều hành, chúng ta cần thêm vị trí thư mục trong biến PATH. Nếu bạn làm việc trên Hệ điều hành Windows, hãy đọc bài đăng này để tìm hiểu cách thiết lập biến PATH trên Windows .Classpath dành riêng cho java và được sử dụng bởi các tệp thực thi java để định vị các tệp lớp. Chúng tôi có thể cung cấp vị trí classpath trong khi chạy ứng dụng java và nó có thể là một thư mục, tệp ZIP, tệp JAR, v.v.
10. Tầm quan trọng của phương thức main trong Java là gì?
Phương thức main() là điểm vào của bất kỳ ứng dụng java độc lập nào. Cú pháp của phương thức main là public static void main (String args []).Phương thức main là public và static để java có thể truy cập nó mà không cần khởi tạo lớp. Tham số đầu vào là một mảng String mà qua đó chúng ta có thể truyền các đối số thời gian chạy cho chương trình java. Kiểm tra bài đăng này để tìm hiểu cách biên dịch và chạy chương trình java.
11. Overloading và Overriding trong java là gì?
Khi chúng ta có nhiều hơn một phương thức có cùng tên trong một lớp nhưng các đối số khác nhau, thì nó được gọi là Overloading. Nếu kiểu trả về khác nhau và các đối số giống nhau thì sẽ bị lỗi và đấy không được gọi là overloadingKhái niệm overriding đi kèm với tính kế thừa khi chúng ta có hai phương thức có cùng tên, một trong lớp cha và một phương thức khác trong lớp con. Chúng ta có thể sử dụng chú thích @Override trong phương thức ghi đè lớp con để đảm bảo rằng phương thức của lớp cha có bị thay đổi hay không, ví dụ như lớp con.
12. Chúng ta có thể overload cho phương thức main không?
Có, chúng ta có thể có nhiều phương thức với tên “main” trong một lớp duy nhất. Tuy nhiên nếu chúng ta chạy lớp, môi trường thời gian chạy java sẽ tìm kiếm phương thức chính với cú pháp là public static void main (String args []).13. Chúng ta có thể có nhiều lớp public trong một tệp nguồn java không?
Không, chúng tôi không thể có nhiều hơn một lớp public trong một tệp nguồn java. Một tệp nguồn duy nhất có thể có nhiều lớp private.14. Java Package là gì và package nào được nhập theo mặc định?
Java Package là cơ chế tổ chức các lớp java bằng cách nhóm chúng lại. Logic nhóm có thể dựa trên chức năng hoặc dựa trên mô-đun. Tên được phân loại đầy đủ của lớp java chứa gói và tên lớp. Ví dụ, java.lang.Object là tên được phân loại đầy đủ của lớp Object là một phần của gói java.lang.Gói java.lang được nhập theo mặc định và chúng tôi không cần nhập bất kỳ lớp nào từ gói này một cách rõ ràng.
[sociallocker id = “2713”]
15. Access modifiers là gì?
Java cung cấp kiểm soát truy cập thông qua các từ khóa access modifiers: public, private, protected. Khi không có cái nào trong số này được sử dụng, nó được gọi là default Access Modifiler. Một lớp java chỉ có thể có default hoặc public access modifiler. Đọc Java Access Modifier để tìm hiểu thêm về những điều này một cách chi tiết.16. Từ khóa final() là gì?
Từ khóa final được sử dụng với Class để đảm bảo rằng không có lớp nào khác có thể mở rộng nó, ví dụ như String class là final và chúng tôi không thể mở rộng nó.Chúng ta có thể sử dụng từ khóa final với các phương thức để đảm bảo rằng các lớp con không thể ghi đè nó.
Từ khóa final có thể được sử dụng với các biến để đảm bảo rằng nó chỉ có thể được gán một lần. Tuy nhiên trạng thái của biến có thể được thay đổi, ví dụ như chúng ta có thể gán một biến final cho một đối tượng chỉ một lần nhưng các biến đối tượng có thể thay đổi sau này.
Các biến Java interface theo mặc định là final và static.
17. Từ khóa static là gì?
Từ khóa static có thể được sử dụng với các biến mức lớp để làm cho nó trở nên toàn cục, tức là tất cả các đối tượng sẽ chia sẻ cùng một biến.Từ khóa static cũng có thể được sử dụng với các phương thức. Một phương thức static chỉ có thể truy cập các biến static của lớp và chỉ gọi các phương thức static của lớp đó.
Đọc chi tiết hơn tại từ khóa java static.
18. finally and finalize trong java là gì?
Khối finally được sử dụng với try-catch để đặt code mà bạn muốn thực thi luôn, ngay cả khi có bất kỳ ngoại lệ nào được ném bởi khối try-catch. Khối finally chủ yếu được sử dụng để giải phóng tài nguyên được tạo trong khối try. finalize() là một phương thức đặc biệt trong lớp Object mà chúng ta có thể ghi đè lên các lớp của mình. Phương thức này được gọi bởi garbage collector (bộ thu gom rác) khi đối tượng đang được thu gom rác. Phương thức này thường được ghi đè để giải phóng tài nguyên hệ thống khi đối tượng là rác được thu thập.19. Chúng ta có thể khai báo một lớp là static không?
Không, Chúng ta không thể khai báo một lớp cấp cao nhất là static tuy nhiên một lớp bên trong có thể được khai báo là static.Nếu lớp bên trong được khai báo là static, nó được gọi là static nested class. Static nested class cũng giống như bất kỳ lớp cấp cao nhất nào khác và được lồng vào nhau chỉ để thuận tiện cho việc đóng gói.
Đọc thêm về các lớp bên trong tại java inner class.
20. Static import là gì?
Nếu chúng ta phải sử dụng bất kỳ biến hoặc phương thức static nào từ lớp khác, thông thường chúng ta nhập lớp và sau đó sử dụng phương thức / biến với tên lớp.//inside class double test = Math.PI * 5;
21. try-with-resources trong java là gì?
Một trong những tính năng của Java 7 là câu lệnh try-with-resources để quản lý tài nguyên tự động. Trước Java 7, không có quản lý tài nguyên tự động và chúng ta nên đóng tài nguyên một cách rõ ràng. Thông thường, nó được thực hiện trong khối cuối cùng của một câu lệnh try-catch. Cách tiếp cận này từng gây rò rỉ bộ nhớ khi chúng ta quên đóng tài nguyên.Từ Java 7, chúng ta có thể tạo tài nguyên bên trong khối try và sử dụng nó. Java sẽ đóng nó ngay sau khi khối try-catch hoàn tất. Đọc thêm tại Java try-with-resources.
22. Multi-catch block trong java là gì?
Một trong những cải tiến của Java 7 là khối Multi-catch, nơi chúng ta có thể bắt nhiều ngoại lệ trong một khối catch duy nhất. Điều này làm cho mã ngắn hơn và sạch hơn khi mọi khối catch đều có mã tương tự.Nếu một khối catch xử lý nhiều ngoại lệ, bạn có thể phân tách chúng bằng cách sử dụng dấu ngoặc (|) và trong trường hợp này, tham số ngoại lệ (ex) là final, vì vậy bạn không thể thay đổi nó.
Đọc thêm tại Java multi catch block.
23. Static block là gì?
Java static block là nhóm các câu lệnh được thực thi khi lớp được tải vào bộ nhớ bởi Java ClassLoader. Nó được sử dụng để khởi tạo các biến static của lớp. Chủ yếu nó được sử dụng để tạo static resource khi lớp được tải.24. Interface là gì?
Interface là phần cốt lõi của ngôn ngữ lập trình java và được sử dụng rất nhiều không chỉ trong JDK mà còn trong java design pattens, hầu hết các framework và tool. Các interface cung cấp một cách để đạt được tính trừu tượng trong java và được sử dụng để xác định hợp đồng cho các lớp con thực hiện.Các interface tốt cho điểm bắt đầu để xác định Type và tạo hệ thống phân cấp cấp cao nhất trong mã của chúng tôi. Vì một lớp java có thể triển khai nhiều interface, nên tốt hơn là sử dụng các interface làm siêu lớp trong hầu hết các trường hợp. Đọc thêm tại interface java.
25. Lớp abstract là gì?
Các lớp abstract (trừu tượng) được sử dụng trong java để tạo một lớp với một số triển khai phương thức mặc định cho các lớp con. Một lớp trừu tượng có thể có phương thức trừu tượng mà không có phần thân và nó cũng có thể có các phương thức có thực thi.từ khóa abstract được sử dụng để tạo một lớp trừu tượng. Các lớp trừu tượng không thể được khởi tạo và chủ yếu được sử dụng để cung cấp cơ sở cho các lớp con để mở rộng và triển khai các phương thức trừu tượng và ghi đè hoặc sử dụng các phương thức được triển khai trong lớp trừu tượng. Đọc các điểm quan trọng về các lớp trừu tượng tại Java Abstract Class.
👉 Từ khóa abstract được sử dụng để tạo lớp trừu tượng trong khi interface là từ khóa cho các interface.
👉 Các lớp trừu tượng có thể có các triển khai phương thức trong khi các interface thì không.
👉 Một lớp chỉ có thể mở rộng một lớp trừu tượng nhưng nó có thể triển khai nhiều interface.
👉 Chúng ta có thể chạy lớp trừu tượng nếu nó có phương thức main() trong khi chúng ta không thể chạy một interface.
Một số khác biệt chi tiết hơn nằm ở Difference between Abstract Class and Interface.
27. Một interface có thể implement hoặc extend một interface khác không?
Các interface không thể implement interface khác, chúng extends nó. Vì các interface không thể có triển khai phương thức, nên không có vấn đề gì về vấn đề kim cương. Đó là lý do tại sao chúng ta có đa kế thừa trong các interface tức là một interface có thể mở rộng nhiều interface.28. Interface Marker là gì?
Interface Marker là một interface trống không có bất kỳ phương thức nào nhưng được sử dụng để buộc một số chức năng trong việc triển khai các lớp bằng Java. Một số interface Marker nổi tiếng là Serializable và Cloneable.29. Các lớp Wrapper là gì?
Các lớp Wrapper trong Java là biểu diễn Đối tượng của tám kiểu nguyên thủy trong java. Tất cả các lớp wrapper trong java là immutable và final. Tính năng autoboxing và unboxing trong Java 5 cho phép chuyển đổi dễ dàng giữa các kiểu nguyên thủy và các lớp Wrapper tương ứng của chúng.Đọc thêm tại Wrapper class trong Java.
30. Enum trong Java là gì?
Enum đã được giới thiệu trong Java 1.5 như một kiểu mới có các trường bao gồm tập hợp các hằng số cố định. Ví dụ, trong Java, chúng ta có thể tạo Direction dưới dạng enum với các trường cố định là EAST, WEST, NORTH, SOUTH.enum là từ khóa để tạo một kiểu enum và tương tự như class. Các hằng số enum hoàn toàn là static và final. Đọc thêm chi tiết tại java enum.
31. Java Annotations là gì?
Java Annotations cung cấp thông tin về mã và chúng không có ảnh hưởng trực tiếp đến mã mà chúng chú thích. Annotations được giới thiệu trong Java 5. Annotation là siêu dữ liệu về chương trình được nhúng trong chính chương trình. Nó có thể được phân tích cú pháp bằng công cụ phân tích cú pháp chú thích hoặc bằng trình biên dịch. Chúng tôi cũng có thể chỉ định tính khả dụng của chú thích cho thời gian biên dịch chỉ hoặc cho đến thời gian chạy. Các chú thích tích hợp trong Java là @Override, @Deprecated và @SuppressWarnings. Đọc thêm tại Java Annotation.32. Java Reflection API là gì? Tại sao nó rất quan trọng để có?
Java Reflection API cung cấp khả năng kiểm tra và sửa đổi hành vi thời gian chạy của ứng dụng java. Chúng ta có thể kiểm tra một lớp java, interface, enum và lấy các phương thức cũng như chi tiết trường của chúng. Reflection API là một chủ đề nâng cao và chúng ta nên tránh nó trong lập trình thông thường. Việc sử dụng Reflection API có thể phá vỡ mẫu thiết kế chẳng hạn như mẫu Singleton bằng cách gọi phương thức khởi tạo private, tức là vi phạm các quy tắc của công cụ sửa đổi truy cập.Mặc dù chúng tôi không sử dụng Reflection API trong lập trình thông thường, nhưng điều rất quan trọng là phải có. Chúng tôi không thể có bất kỳ frameworks nào như Spring, Hibernate hoặc các máy chủ như Tomcat, JBoss mà không có Reflection API. Họ gọi các phương thức thích hợp và khởi tạo các lớp thông qua Reflection API và sử dụng nó rất nhiều cho các quá trình xử lý khác.
Đọc Hướng dẫn Java Reflection để có kiến thức chuyên sâu về Reflection API.
33. Composition trong java là gì?
Composition là kỹ thuật thiết kế để triển khai mối quan hệ has-a trong các lớp. Chúng ta có thể sử dụng đối tượng Composition để sử dụng lại mã. Java Composition đạt được bằng cách sử dụng các biến thể hiện tham chiếu đến các đối tượng khác(Get, Set). Lợi ích của việc sử dụng Composition là chúng ta có thể kiểm soát khả năng hiển thị của đối tượng khác đối với các lớp khách hàng và chỉ sử dụng lại những gì chúng ta cần. Đọc thêm với ví dụ tại ví dụ về Java Composition34. Lợi ích của Composition so với Inheritance (thừa kế) là gì?
Một trong những phương pháp hay nhất của lập trình java là “ưu tiên composition hơn là Inheritance”. Một số lý do có thể là:👉 Bất kỳ thay đổi nào trong lớp cha có thể ảnh hưởng đến lớp con mặc dù chúng ta có thể không sử dụng các phương thức của lớp cha.
Ví dụ: nếu chúng ta có một phương thức test() trong lớp con và đột nhiên ai đó giới thiệu một phương thức test() trong lớp cha, chúng ta sẽ gặp lỗi biên dịch trong lớp con. Composition sẽ không bao giờ phải đối mặt với vấn đề này vì chúng tôi chỉ đang sử dụng những phương pháp chúng tôi cần.
👉 Kế thừa hiển thị tất cả các phương thức và biến siêu lớp cho máy khách và nếu chúng ta không kiểm soát được việc thiết kế lớp cha, nó có thể dẫn đến các lỗ hổng bảo mật. Composition cho phép chúng tôi cung cấp quyền truy cập hạn chế vào các phương pháp và do đó an toàn hơn.
👉 Chúng ta có thể nhận được ràng buộc thời gian chạy trong composition nơi kế thừa liên kết các lớp tại thời điểm biên dịch. Vì vậy, composition cung cấp sự linh hoạt trong việc gọi các phương thức.
Bạn có thể đọc thêm về các lợi ích ở trên của thành phần so với kế thừa tại Java Composititon vs Inheritance.
35. Làm thế nào để sắp xếp một colection các Objects tùy chỉnh trong Java?
Chúng ta cần implement Comparable interface được để hỗ trợ sắp xếp các đối tượng tùy chỉnh trong một colection. Comparable interface có phương thức CompareTo (T obj) được sử dụng bởi các phương pháp sắp xếp và bằng cách cung cấp triển khai phương pháp này, chúng tôi có thể cung cấp cách mặc định để sắp xếp đối tượng collection tùy chỉnh.Tuy nhiên, nếu bạn muốn sắp xếp dựa trên các tiêu chí khác nhau, chẳng hạn như sắp xếp tập hợp Nhân viên dựa trên lương hoặc tuổi, thì chúng tôi có thể tạo các phiên bản Comparator và chuyển nó làm phương pháp sắp xếp. Để biết thêm chi tiết, hãy đọc Java Comparable and Comparator.
36. Inner class trong java là gì?
Chúng ta có thể định nghĩa một lớp bên trong một lớp và chúng được gọi là nested classes. Bất kỳ non-static nested class nào được gọi là inner class. Inner classes được liên kết với đối tượng của lớp và chúng có thể truy cập tất cả các biến và phương thức của lớp bên ngoài. Vì các lớp bên trong được liên kết với cá thể, chúng ta không thể có bất kỳ biến static nào trong chúng.Chúng ta có thể có local inner class hoặc anonymous inner class bên trong một lớp. Để biết thêm chi tiết, hãy đọc Java inner class.
37. Anonymous inner class là gì?
Một lớp bên trong cục bộ không có tên được gọi là lớp bên trong ẩn danh. Một lớp ẩn danh được định nghĩa và khởi tạo trong một câu lệnh duy nhất. Lớp bên trong ẩn danh luôn mở rộng một lớp hoặc triển khai một interface.Vì một lớp ẩn danh không có tên, nên không thể định nghĩa một phương thức khởi tạo cho một lớp ẩn danh. Các lớp bên trong ẩn danh chỉ có thể truy cập tại điểm mà nó được xác định.
Java Classloader là chương trình mà tải chương trình mã byte vào bộ nhớ khi chúng ta muốn truy cập vào bất kỳ lớp nào. Chúng ta có thể tạo classloader của riêng mình bằng cách mở rộng lớp ClassLoader và ghi đè phương thức loadClass(String name). Tìm hiểu thêm tại Java classloader.
Có ba loại Classloader trong Java:
👉 Bootstrap Class Loader - Nó tải các lớp bên trong JDK, thường tải rt.jar và các lớp lõi khác.
👉 Extensions Class Loader - Nó tải các lớp từ thư mục phần mở rộng JDK, thường là thư mục $ JAVA_HOME / lib / ext.
👉 System Class Loader - Nó tải các lớp từ classpath hiện tại có thể được thiết lập trong khi gọi một chương trình bằng cách sử dụng các tùy chọn dòng lệnh -cp hoặc -classpath.
Toán tử bậc ba trong Java là toán tử điều kiện duy nhất nhận ba toán hạng. Nó là một sự thay thế một lớp lót cho câu lệnh if-then-else và được sử dụng rất nhiều trong lập trình java. Chúng ta có thể sử dụng các điều kiện if-else của toán tử bậc ba hoặc thậm chí chuyển đổi các điều kiện bằng cách sử dụng các toán tử bậc ba lồng nhau. Một ví dụ có thể được tìm thấy tại java ternary operator.
41. Từ khóa super có tác dụng gì?
Chúng ta có thể sử dụng từ khóa super để gọi hàm tạo siêu lớp trong hàm tạo lớp con nhưng trong trường hợp này, nó phải là câu lệnh đầu tiên trong phương thức khởi tạo.
package com.codetimes90.access;
public class SuperClass {
public SuperClass(){
}
public SuperClass(int i){}
public void test(){
System.out.println("super class test method");
}
}
public class ChildClass extends SuperClass {
public ChildClass(String str) {
//
access super class constructor with super keyword super();
//
access child class method test();
// use
super to access super class method super.test();
}
@Override
public void test() {
System.out.println("child class test method");
}
}
42. Câu lệnh break and continue là gì?
Chúng ta có thể sử dụng câu lệnh break để kết thúc vòng lặp for, while hoặc do-while. Chúng ta có thể sử dụng câu lệnh break trong câu lệnh switch để thoát khỏi trường hợp switch. Bạn có thể xem ví dụ về câu lệnh break tại Java break. Chúng ta có thể sử dụng break với label để kết thúc các vòng lặp lồng nhau.
Câu lệnh continue bỏ qua lần lặp hiện tại của vòng lặp for, while hoặc do-while. Chúng ta có thể sử dụng câu lệnh continue với nhãn để bỏ qua lần lặp hiện tại của vòng lặp ngoài cùng.
Từ khóa this cung cấp tham chiếu đến đối tượng hiện tại và nó chủ yếu được sử dụng để đảm bảo rằng các biến đối tượng được sử dụng, chứ không phải các biến cục bộ có cùng tên.
public Point ( int x, int y) { this . x = x; this . y = y; }
public Rectangle ( int width, int height) { this ( 0 , 0 , width, height);}
public Rectangle ( int x, int y, int width, int height) {
this.x = x; this.y = y; this.width = width; this . height = height;
}
44. Default constructor là gì?
Không có constructor nào của một lớp được gọi là default constructor. Khi chúng ta không xác định bất kỳ phương thức khởi tạo nào cho lớp, trình biên dịch java sẽ tự động tạo phương thức default no-args constructor cho lớp. Nếu có các hàm tạo khác được xác định, thì trình biên dịch sẽ không tạo hàm tạo mặc định cho chúng ta.
Có, chúng ta có thể có câu lệnh try-finally và do đó tránh được khối catch.
Garbage Collection là quá trình xem xét bộ nhớ heap, xác định đối tượng nào đang được sử dụng và đối tượng nào không, và xóa các đối tượng không sử dụng. Trong Java, quá trình phân bổ bộ nhớ được xử lý tự động bởi Garbage Collection.
Chúng ta có thể chạy trình thu gom rác với mã Runtime.getRuntime().gc() hoặc sử dụng phương thức tiện ích System.gc(). Để có phân tích chi tiết về Bộ nhớ Heap và Garbage Collection, vui lòng đọc Java Garbage Collection.
47. Serialization và Deserialization là gì?
Chúng ta có thể chuyển đổi một đối tượng Java thành một Stream được gọi là Serialization. Khi một đối tượng được chuyển đổi thành Stream, nó có thể được lưu vào tệp hoặc gửi qua mạng hoặc được sử dụng trong các kết nối socket.
Đối tượng nên triển khai interface Serializable và chúng ta có thể sử dụng java.io.ObjectOutputStream để ghi đối tượng vào tệp hoặc vào bất kỳ đối tượng OutputStream nào. Đọc thêm tại Java Serialization.
Quá trình chuyển đổi dữ liệu Stream được tạo thông qua tuần tự hóa thành Object được gọi là Deserialization. Đọc thêm tại Java Deserialization.
System là lớp cuối cùng nên chúng tôi không thể phân lớp và ghi đè hành vi của nó thông qua kế thừa. System Class không cung cấp bất kỳ hàm tạo công khai nào, vì vậy chúng tôi không thể khởi tạo lớp này và đó là lý do tại sao tất cả các phương thức của nó là static.
Một số phương thức tiện ích của System Class là để sao chép mảng, lấy thời gian hiện tại, đọc các biến môi trường. Đọc thêm tại Java System Class.
Chúng ta có thể sử dụng từ khóa instanceof để kiểm tra xem một đối tượng có thuộc một lớp hay không. Chúng ta nên tránh sử dụng nó càng nhiều càng tốt. Cách sử dụng mẫu là:
public static void main(String args[]) {
Object str = new String("abc");
if (str instanceof String) {
System.out.println("String value:" + str);
}
if (str instanceof Integer) {
System.out.println("Integer value:" + str);
}
}
Một trong những tính năng của Java 7 là cải tiến cho phép trường hợp chuyển đổi của chuỗi. Vì vậy, nếu bạn đang sử dụng phiên bản Java 7 trở lên, bạn có thể sử dụng String trong các câu lệnh switch-case. Đọc thêm tại Java switch-case String example.
Đây là một câu hỏi rất khó hiểu, chúng ta biết rằng các biến đối tượng chứa tham chiếu đến các Object trong không gian heap. Khi chúng ta gọi bất kỳ phương thức nào, một bản sao của các biến này sẽ được chuyển và được lưu trữ trong bộ nhớ ngăn xếp của phương thức Chúng tôi có thể kiểm tra bất kỳ ngôn ngữ nào cho dù đó là pass by reference hay pass by value thông qua một phương pháp hoán đổi chung đơn giản, để tìm hiểu thêm, hãy đọc Java is Pass by Value and Not Pass by Reference.
Sự khác biệt chính giữa bộ nhớ Heap và Stack như sau:
👉 Bộ nhớ Heap được sử dụng bởi tất cả các phần của ứng dụng trong khi bộ nhớ ngăn xếp (Stack) chỉ được sử dụng bởi một luồng thực thi.
👉 Bất cứ khi nào một đối tượng được tạo, nó luôn được lưu trữ trong không gian Heap và bộ nhớ Stack chứa tham chiếu đến nó. Bộ nhớ Stack chỉ chứa các biến nguyên thủy cục bộ và các biến tham chiếu đến các đối tượng trong không gian Heap.
👉 Quản lý bộ nhớ trong ngăn xếp được thực hiện theo cách LIFO trong khi nó phức tạp hơn trong bộ nhớ Heap vì nó được sử dụng trên toàn cầu.
Để được giải thích chi tiết với chương trình mẫu, hãy đọc Java Heap vs Stack Memory.
Nhiệm vụ của Java Compiler là chuyển đổi chương trình java thành bytecode, chúng ta có tệp thực thi javac cho việc đó. Vì vậy, nó phải được lưu trữ trong JDK, chúng ta không cần nó trong JRE và JVM chỉ là thông số kỹ thuật.
1. phương thức static trong lớp
package com.codetimes90.util;
public class Test {
public static String toString(){
System.out.println("Test toString called");
return "";
}
public static void main(String args[]){
System.out.println(toString());
}
}
2. lời gọi phương thức Static
package com.codetimes90.util;
public class Test {
public static String foo(){
System.out.println("Test foo called");
return "";
}
public static void main(String args[]){
Test obj = null;
System.out.println(obj.foo());
}
}
Trả lời : Đây là một tình huống kỳ lạ. Tất cả chúng ta đã thấy NullPointerException khi chúng ta gọi một phương thức trên đối tượng là NULL. Nhưng ở đây chương trình này sẽ hoạt động và in ra "Test foo called".Lý do cho điều này là tối ưu hóa mã trình biên dịch java. Khi mã java được biên dịch thành mã byte được tạo ra, nó phát hiện ra rằng foo() là một phương thức static và nên được gọi bằng cách sử dụng lớp. Vì vậy, nó thay đổi cuộc gọi phương thức obj.foo() thành Test.foo() và do đó không NullPointerException.
Tôi phải thừa nhận rằng đó là một câu hỏi rất phức tạp và nếu bạn đang phỏng vấn một ai đó, điều này sẽ khiến tâm trí anh ta mất hứng.
0 Nhận xét