JavaRush /Blog Java /Random-VI /Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấ...

Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java. Phần 3

Xuất bản trong nhóm
Xin chào! Giống như không thể học lái máy bay nếu không được đào tạo đặc biệt, cũng không thể trở thành nhà phát triển Java nếu không dành nhiều thời gian để nghiên cứu cơ sở lý thuyết cần thiết. Hôm nay chúng ta sẽ làm việc chính xác về vấn đề này: chúng ta sẽ tiếp tục phân tích hơn 250 câu hỏi phỏng vấn dành cho các nhà phát triển Java và theo đó là câu trả lời cho chúng. Dưới đây là phần đầu tiên và phần thứ hai của phân tích. Có, tất nhiên, bạn có thể trở thành một nhà phát triển Java giỏi mà không cần phải trả lời tất cả những câu hỏi này. Tuy nhiên, nếu bạn hiểu rõ về ngôn ngữ Java, nó sẽ mang lại cho bạn một lợi thế, khiến bạn trở thành một ứng viên đáng mơ ước hơn trong mắt nhà tuyển dụng tương lai.Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java.  Phần 3 - 1

20. Yếu tố ngôn ngữ nào chịu trách nhiệm đóng gói?

Như chúng ta nhớ, tính đóng gói đang che giấu các chi tiết triển khai của một lớp. Nghĩa là, khi lớp của chúng ta được sử dụng bên ngoài, nội dung và logic bên trong không rõ ràng. Và những yếu tố nào của ngôn ngữ chịu trách nhiệm cho điều này? Đương nhiên, truy cập các công cụ sửa đổi ! Chúng tôi đánh dấu những gì chúng tôi cần ẩn bằng công cụ sửa đổi riêng tư . Ví dụ: các trường riêng tư của một lớp hoặc một số phương thức nội bộ giúp triển khai một số chức năng nội bộ nhất định. Và đối với những gì chúng tôi muốn cung cấp quyền truy cập bên ngoài, chúng tôi thêm công cụ sửa đổi quyền truy cập công khai . Ví dụ: một phương thức chịu trách nhiệm cung cấp một số chức năng (trong đó có thể sử dụng nhiều phương thức riêng tư) hoặc các getters và setters giống nhau để truy cập các trường riêng tư của một lớp. Ồ, và chúng tôi cũng có các công cụ sửa đổi mặc địnhđược bảo vệ , có thể được sử dụng để cấu hình quyền truy cập cụ thể và linh hoạt hơn vào các phần được chọn của lớp.

21. Yếu tố ngôn ngữ nào chịu trách nhiệm kế thừa?

Kế thừa là một cơ chế cho phép bạn tạo các lớp dựa trên một lớp khác. Trong Java, từ khóa mở rộng được sử dụng cho mục đích này . Ví dụ: chúng tôi có một lớp nhất định Cat và chúng tôi muốn tạo lớp kế nhiệm của nó - Lion . Trong mã nó sẽ trông giống như thế này:
public class Lion extends Cat
Và điều này có nghĩa là lớp Lion kế thừa tất cả các phương thức và biến của lớp Cat , ngoại trừ các phương thức và biến tĩnh. Ngoài ra, các thành phần ngôn ngữ chịu trách nhiệm kế thừa bao gồm super . Đây là một tham chiếu tương tự như this , nhưng trong khi this đề cập đến đối tượng mà nó được gọi thì super đề cập đến đối tượng cha hiện tại. Thông thường super được sử dụng:
  1. Để gọi một hàm tạo siêu lớp: ví dụ, lớp Cat có một tên biến nội bộ cần được khởi tạo trong hàm tạo. Trong hàm tạo của lớp Lion , nó sẽ trông như thế này:

    public Lion(final String name) {
       super(name);
    }
  2. Để truy cập các trường và phương thức cha: ví dụ: trong lớp Cat , chúng ta có trường age được khởi tạo :

    public class Cat {
       int age = 10;
Đồng thời, chúng ta có trường khởi tạo tương tự trong Lion :
public class Lion extends Cat {
   int age = 15;
Và nếu chúng ta muốn truy cập biến age của đối tượng cha từ đối tượng Lion , chúng ta cần thực hiện điều này thông qua super :
super.name

22. Yếu tố ngôn ngữ nào tạo nên tính đa hình?

Đa hình là khả năng một đối tượng của một chữ ký có nhiều dạng (nhiều triển khai). Chúng ta có thể nói một cách an toàn rằng trong Java, các từ khóa triển khaimở rộngPhân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java.  Phần 3 - 2 chịu trách nhiệm về tính đa hình . thực hiện - khi chúng ta tạo giao diện, chúng ta triển khai một trong các dạng có thể có của nó trong một số lớp, nhưng đó không phải là dạng duy nhất, phải không? Chúng ta hãy nhớ các dụng cụ triển khai trông như thế nào :
public class Cat implements Animal
Và trong lớp Cat chúng ta phải triển khai tất cả các phương thức trừu tượng được trình bày trong giao diện Animal . Điều tương tự cũng xảy ra với tính kế thừa: trong lớp con, chúng ta có thể ghi đè việc triển khai một phương thức đã có sẵn. Ví dụ: một số hậu duệ -> một số phần ghi đè khác nhau của cùng một phương thức. Chà, hoặc siêu lớp là trừu tượng và nó có một phương thức nhất định cần được triển khai theo cách đặc biệt cho mỗi lớp con của nó. Nghĩa là, chúng ta có thể nói rằng phương pháp này sẽ có nhiều dạng. Ngoài ra, chú thích @Override có thể giúp chúng ta thực hiện điều này , chú thích này được đặt phía trên các phương thức đã triển khai và cho biết rằng chúng ta muốn triển khai hoặc ghi đè (nếu việc triển khai đã tồn tại trong siêu lớp) một hoặc một phương thức khác của siêu lớp hoặc giao diện. Nó là tùy chọn và được sử dụng để giúp phát hiện lỗi dễ dàng hơn. Với chú thích này, bạn cho trình biên dịch biết rằng bạn muốn ghi đè/triển khai một phương thức siêu lớp/giao diện và nó sẽ đảm bảo rằng bạn không mắc lỗi trong chữ ký phương thức.

23. RẮN là gì? Cho ví dụ

SOLID là từ viết tắt của Năm nguyên tắc thiết kế cơ bản cho OOP, được đặt ra bởi Robert Martin. S - Nguyên tắc trách nhiệm duy nhất - nguyên tắc trách nhiệm duy nhất, trong đó nêu rõ rằng một lớp chỉ nên có một mục tiêu và một mục đích duy nhất. Tức là bạn không nên tạo các lớp làm được mọi việc. Trong trường hợp này, bạn có thể tái tạo phản mẫu “Đối tượng thần thánh”. Nếu bạn có một đối tượng Cat , đối tượng đó phải chứa các phương thức chỉ tương tác với chức năng bên trong của nó chứ không phải logic nghiệp vụ không liên quan đến phiên bản này. Ví dụ, một số loại lưu các đối tượng thuộc loại này ở đâu đó. Chức năng bên ngoài này (liên quan đến Cat ) cần được chuyển sang các lớp khác, một số dịch vụ có nhiệm vụ cung cấp logic nghiệp vụ cho các đối tượng thuộc loại này. O – Nguyên lý đóng mở – nguyên lý đóng/mở. Điều đó có nghĩa là các thực thể phần mềm (lớp, giao diện) phải mở để mở rộng nhưng đóng để sửa đổi. Ví dụ: chúng tôi cần chức năng tương tự như chức năng của lớp Cat hiện có , nhưng hơi khác một chút. Thay vì thay đổi chức năng của lớp Cat , phá vỡ những vị trí đã được sử dụng, chúng tôi sử dụng tính kế thừa hoặc thành phần . Kết quả là chúng tôi đã đạt được mục tiêu của mình với chức năng được sửa đổi của lớp Cat , nhưng đồng thời chúng tôi không thay đổi hoặc phá vỡ bất cứ điều gì. L - Nguyên lý thay thế Liskov - Nguyên tắc thay thế của Barbara Liskov. Nguyên tắc nêu rõ rằng một hàm sử dụng loại cơ sở sẽ có thể sử dụng các kiểu con của loại cơ sở mà không cần biết. Ví dụ: lớp Cat của chúng ta có thể được hoán đổi với bất kỳ lớp con cháu nào của nó, chẳng hạn như Lion , mà không làm thay đổi hành vi về cơ bản. Logic (hành vi) chung vẫn giữ nguyên, nhưng chi tiết về việc triển khai chức năng này hoặc chức năng kia sẽ thay đổi. I – Nguyên tắc phân tách giao diện – nguyên tắc phân tách giao diện. Nguyên tắc này nêu rõ rằng tốt hơn là nên có nhiều giao diện chuyên biệt (tập trung hẹp) hơn là một giao diện phổ quát. Ví dụ: người dùng triển khai một số giao diện, trong đó anh ta chỉ cần phương thức này, nhưng giao diện này có thêm chín phương thức không liên quan gì đến logic của phương thức mong muốn. Trong trường hợp này, người dùng sẽ cần triển khai mười phương thức giao diện, chín trong số đó là không cần thiết đối với anh ta! Thay vào đó, tốt hơn là tạo ra mười giao diện khác nhau để có thể triển khai nếu cần thiết. Chà, hoặc không phải mười, mà là một số, sẽ có các phương thức liên quan chặt chẽ đến mục đích chung của giao diện. D - Nguyên tắc đảo ngược phụ thuộc- nguyên tắc đảo ngược sự phụ thuộc. Nguyên tắc nêu rõ các mô-đun ở cấp độ cao hơn không nên phụ thuộc vào các mô-đun ở cấp độ thấp hơn. Nguyên tắc này còn được mô tả là “sự trừu tượng không nên phụ thuộc vào chi tiết, chi tiết nên phụ thuộc vào sự trừu tượng”. Nghĩa là, chúng ta phải xây dựng logic của mình bằng cách tham khảo các giao diện và chỉ sau đó chuyển các đối tượng cụ thể cho chức năng này, các lớp trong đó triển khai giao diện được yêu cầu. Ví dụ: nếu chúng ta có giao diện Cat và một số cách triển khai của nó, chẳng hạn như LionHomeCat , thì chúng ta sẽ xây dựng logic tương tác cụ thể bằng loại giao diện Cat và chỉ sau đó thay thế việc triển khai cụ thể của Lion hoặc HomeCat chứ không phải ngược lại.

24. Lớp, đối tượng, giao diện là gì?

Như chúng ta nhớ, Java là ngôn ngữ OOP. Nghĩa là, các chương trình Java được xây dựng dựa trên sự tương tác giữa các đối tượng. Hóa ra chương trình này giống như một tổ kiến, trong đó mỗi con kiến ​​là một đồ vật. Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java.  Phần 3 - 3Đối tượng là một số dữ liệu được nhóm chứa nhiều phương thức (hàm) khác nhau để tương tác với dữ liệu nội bộ này. Và các lớp là những hướng dẫn, mẫu để tạo đối tượng. Nghĩa là, có thể có nhiều đối tượng được xây dựng theo cùng một lệnh, chứa đầy các giá trị dữ liệu giống nhau hoặc khác nhau. Để đưa ra một ví dụ từ cuộc sống, chúng ta có thể nói rằng một lớp là một bản vẽ của một tòa nhà và một đối tượng là một tòa nhà được tạo cụ thể dựa trên bản vẽ này. Các giao diện tương tự như các lớp với điểm khác biệt là các đối tượng không thể được tạo bằng cách sử dụng chúng. Mục tiêu của họ là thêm một yếu tố trừu tượng vào Java. Chính xác hơn là để tăng thêm tính linh hoạt trong mối quan hệ giữa các lớp và đối tượng. Bằng tính linh hoạt, chúng tôi muốn nói đến tính đa hình và tính trừu tượng được mô tả trước đây, từ đó mở ra nhiều cơ hội để xây dựng kiến ​​trúc bên trong của ứng dụng.

25. Lớp POJO là gì? Cho một ví dụ về một lớp như vậy

Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java.  Phần 3 - 4POJO - Đối tượng Java cũ đơn giản - một đối tượng Java cũ tốt: một đối tượng đơn giản của một lớp không được kế thừa từ bất kỳ lớp cụ thể nào và không triển khai bất kỳ giao diện dịch vụ nào ngoài những giao diện cần thiết cho mô hình kinh doanh. Nói cách khác , lớp POJO chỉ là lớp không có yêu cầu đặc biệt. Yêu cầu duy nhất là không có nhiều chuông và còi khác nhau gắn liền với một khuôn khổ cụ thể. Theo quy định, các lớp như vậy không kế thừa từ các lớp khác (ngoại trừ các lớp POJO từ cùng một gói), không triển khai giao diện - đôi khi một ngoại lệ được tạo cho các giao diện điểm đánh dấu từ thư viện chuẩn như Serializable hoặc Cloneable - không sử dụng chú thích và không phụ thuộc vào thư viện của bên thứ ba. Nhưng tôi lưu ý rằng POJO có thể có các phương thức với logic nghiệp vụ và các hàm tạo thuộc bất kỳ loại nào. Nếu bạn cho phép các chú thích không thực hiện thay đổi về ngữ nghĩa của lớp (không có mục đích của đối tượng và logic hoạt động của nó sẽ không thay đổi), POJO cũng có thể bao gồm các thực thể Thực thể JPA và các đối tượng DTO được giải tuần tự hóa từ XML hoặc JSON , các quy tắc được chỉ định trong các chú thích. Bạn cũng nên ghi đè bằnghashCode cho các lớp POJO vì điều này có thể giúp chúng thực hiện vai trò của mình tốt hơn. Ví dụ về lớp POJO :
public class User {
   private Long id;
   private String firstName;
   private String lastName;
   private Long age;

   public User(final Long id, final String firstName, final String lastName, final long age) {
       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }

   public Long getId() {
       return this.id;
   }

   public String getFirstName() {
       return this.firstName;
   }

   public String getLastName() {
       return this.lastName;
   }

   public Long getAge() {
       return this.age;
   }

   @Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || this.getClass() != o.getClass()) return false;
       final User user = (User) o;
       return Objects.equals(this.id, user.id) &&
               Objects.equals(this.firstName, user.firstName) &&
               Objects.equals(this.lastName, user.lastName) &&
               Objects.equals(this.age, user.age);
   }

   @Override
   public int hashCode() {
       return Objects.hash(this.id, this.firstName, this.lastName, this.age);
   }
}

26. Một lớp có thể chứa những thành phần nào?

Lớp có thể chứa các phần tử sau:
  • trường lớp;
  • trường lớp tĩnh;
  • khối khởi tạo;
  • khối khởi tạo tĩnh;
  • hàm tạo (trống luôn được xác định theo mặc định);
  • phương pháp;
  • phương pháp tĩnh;
  • các chú thích khác nhau (có thể treo phía trên chính lớp đó hoặc các thành phần của nó);
  • thuốc generic ;
  • kế thừa từ các lớp khác ( mở rộng ) hoặc triển khai từ giao diện ( thực hiện ).

27. Giải thích tính kế thừa trong Java. Lợi ích của việc sử dụng từ khóa siêu là gì?

Ở trên tôi đã nói về tính kế thừa và từ khóa super trong Java. Hãy để tôi đề cập đến một vài điểm quan trọng hơn:
  1. Chỉ có thể kế thừa một lớp: không có tính đa kế thừa trong Java (nhưng với sự ra đời của các phương thức mặc định trong Java 8, câu lệnh này sẽ trở nên rất gây tranh cãi).
  2. Các phương thức và trường riêng tư cũng được kế thừa, chúng sẽ không có quyền truy cập vào chúng từ người thừa kế (nhưng chẳng hạn, nếu chúng ta có một trường riêng tư và có các getter và setters công khai hoặc được bảo vệ cho nó, thì trường đó có thể được làm việc với thông qua họ).
  3. các lớp cuối cùng không được kế thừa.
  4. các phương thức cuối cùng không bị ghi đè (nhưng chúng có thể được kế thừa và nạp chồng).
  5. các phương thức và biến tĩnh không được kế thừa (vì chúng không được gắn với các đối tượng mà với các lớp).
  6. Khi kế thừa từ các lớp trừu tượng, việc triển khai các phương thức trừu tượng của chúng là bắt buộc hoặc lớp hiện tại cũng phải được khai báo là trừu tượng.
  7. Nếu có các hàm tạo không mặc định trong lớp cha, thì chúng phải được ghi đè trong lớp con (nhưng @Override không được ghi đè lên chúng).
  8. Các phương thức được ghi đè trong phần con có thể được mở rộng bằng công cụ sửa đổi truy cập: riêng tư -> mặc định -> được bảo vệ -> công khai .
  9. Các phương thức được ghi đè trong phần con có thể thu hẹp các ngoại lệ được viết, ví dụ: Exception -> IOException -> FileNotFoundException.
Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java.  Phần 3 - 5

28. Chữ ký phương thức là gì? Cho ví dụ về chữ ký đúng và sai

Chữ ký của một phương thức là tên của phương thức cộng với các loại tham số đến (và thứ tự của các tham số quan trọng). Chữ ký phương thức không bao gồm giá trị trả về hoặc các ngoại lệ mà nó đưa ra. Ví dụ về chữ ký đúng:
doSomething(int, double, double)
Ví dụ về chữ ký sai:
void doSomething(int firstArg, int secondArg) throws Exception
Chữ ký phương thức, kết hợp với kiểu trả về và danh sách các ngoại lệ được ném ra, được gọi là hợp đồng phương thức . Đó là tất cả cho ngày hôm nay. Hẹn gặp lại!Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java.  Phần 3 - 6
Các tài liệu khác trong loạt bài:
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION