Java: An Introduction to Problem Solving & Programming (6th Edition)

Tổng quan về giáo trình

Giáo trình Java: An Introduction to Problem Solving & Programming (Tái bản lần thứ 6) được biên soạn bởi tác giả Walter Savitch thuộc Đại học California, San Diego cùng sự cộng tác của Kenrick Mock thuộc Đại học Alaska Anchorage. Tài liệu do nhà xuất bản Pearson/Prentice Hall phát hành (ISBN-10: 0-132-16270-9; ISBN-13: 978-0-132-16270-8), giữ vị trí tài liệu giảng dạy nền tảng cho học phần Nhập môn Lập trình và Khoa học Máy tính (CS1 và CS2) tại các trường đại học và cao đẳng. Thiết kế của tài liệu có tính thích ứng cao, phù hợp với các khóa học có thời lượng từ một học kỳ ngắn (quarter) đến một năm học đầy đủ.

Mục tiêu học tập trọng tâm của giáo trình là trang bị các kỹ thuật giải quyết vấn đề (problem-solving techniques) song song với việc xây dựng năng lực lập trình trên ngôn ngữ Java. Người học không bị yêu cầu phải có kinh nghiệm lập trình từ trước hay kiến thức toán học phức tạp ngoài phạm vi đại số trung học cơ sở. Tài liệu hướng đến việc giúp người học nắm vững cú pháp chuẩn của Java, hiểu rõ kiến trúc thực thi phần mềm, làm chủ tư duy hướng đối tượng và có khả năng thiết kế, gỡ lỗi các chương trình ứng dụng hoàn chỉnh.

Cấu trúc giáo trình áp dụng mô hình tiếp cận lớp đối tượng sớm (Early Introduction to Classes), giới thiệu cách sử dụng lớp ngay từ Chương 1 và Chương 2, đi sâu vào định nghĩa lớp ở Chương 5 và hoàn thiện nền tảng kế thừa ở Chương 8. Điểm đặc sắc trong cấu trúc là sự tích hợp của các phần phụ lục đồ họa (Graphics Supplements) ở cuối mỗi chương từ Chương 1 đến Chương 10. Phần bổ trợ này cho phép giảng viên linh hoạt giảng dạy lập trình giao diện đồ họa (GUI thông qua JFrameJApplet) song song với lập trình truyền thống hoặc có thể tạm hoãn mà không làm gián đoạn mạch kiến thức chính.


Nội dung kiến thức cốt lõi

Các chương và chủ đề chính

Nội dung cuốn sách gồm 12 chương chính trong ấn bản in và 3 chương mở rộng trên nền tảng trực tuyến, được tổ chức theo lộ trình phát triển logic chặt chẽ:

  • Chương 1: Introduction to Computers and Java: Giới thiệu cấu trúc phần cứng, bộ nhớ, phân biệt ngôn ngữ bậc cao và mã máy. Trình bày cơ chế biên dịch sang mã bytecode và vai trò của máy ảo Java (JVM), trình nạp lớp (Class Loader), cấu trúc một chương trình Java cơ bản (FirstProgram) sử dụng Scanner, cùng ứng dụng đồ họa đầu tiên (HappyFace).
  • Chương 2: Basic Computation: Khảo sát các kiểu dữ liệu nguyên thủy, biểu thức số học, thứ tự ưu tiên của toán tử, ép kiểu (type casting), thao tác với lớp String, nhập xuất dữ liệu qua bàn phím/màn hình với Scanner và định dạng System.out.printf. Phần đồ họa giới thiệu lớp JFrame và hộp thoại JOptionPane.
  • Chương 3 & 4: Flow of Control (Branching & Loops): Xây dựng cấu trúc điều khiển rẽ nhánh (if-else, switch, kiểu dữ liệu boolean) và cấu trúc lặp (while, do-while, for, for-each). Phân tích các trường hợp nghiên cứu như đánh giá chỉ số khối cơ thể (Body Mass Index) và kiểm soát lặp bằng biến cờ hiệu logic.
  • Chương 5 & 6: Defining Classes and Methods & More About Objects: Trình bày chi tiết cách định nghĩa lớp, biến thực thể (instance variables), phương thức trả về giá trị và phương thức void, từ khóa this, cơ chế đóng gói thông qua các bổ từ truy cập publicprivate. Phân tích hàm khởi tạo (constructors), nạp chồng phương thức (overloading), biến và phương thức tĩnh (static), các lớp bao bọc (Wrapper Classes) và lớp Math.
  • Chương 7: Arrays: Cung cấp kiến thức về mảng một chiều và mảng nhiều chiều, cơ chế truyền mảng vào phương thức, mảng không đều (ragged arrays), cùng các thuật toán tìm kiếm và sắp xếp cơ bản như sắp xếp chọn (Selection Sort).
  • Chương 8: Inheritance, Polymorphism and Interfaces: Trình bày cơ chế kế thừa thông qua lớp dẫn xuất, ghi đè phương thức (overriding), từ khóa final, lớp Object, tính đa hình với cơ chế liên kết động (dynamic binding), lớp trừu tượng (abstract classes) và giao diện (interfaces như Comparable).
  • Chương 9 & 10: Exception Handling & Streams and File I/O: Kỹ thuật kiểm soát lỗi thời gian chạy thông qua các khối lệnh try-catch-finally, định nghĩa ngoại lệ tùy biến; xử lý tệp văn bản và tệp nhị phân, kiểm soát điểm kết thúc tệp bằng EOFException và tuần tự hóa đối tượng (serialization).
  • Chương 11 & 12: Recursion, Dynamic Data Structures and Generics: Kỹ thuật đệ quy với thuật toán tìm kiếm nhị phân (Binary Search) và sắp xếp trộn (Merge Sort); cấu trúc dữ liệu động như danh sách liên kết (LinkedList), tổng quan về Java Collections Framework (HashSet, HashMap), giao diện Iterator và lập trình tổng quát (Generics).
  • Chương 13, 14 & 15 (Trực tuyến): Mở rộng chuyên sâu về giao diện cửa sổ bằng Swing, ứng dụng Applet tương tác với HTML và mô hình xử lý sự kiện nâng cao.
flowchart TD
    Ch1["Chương 1: Giới thiệu Máy tính & Java"] --> Ch2["Chương 2: Tính toán Cơ bản & Kiểu dữ liệu"]
    Ch2 --> Ch3["Chương 3: Điều khiển Rẽ nhánh (if-else, switch)"]
    Ch3 --> Ch4["Chương 4: Điều khiển Vòng lặp (while, for)"]
    Ch4 --> Ch5["Chương 5: Định nghĩa Lớp & Phương thức"]
    Ch5 --> Ch6["Chương 6: Đối tượng, Static, Overloading"]
    Ch5 --> Sec71["Mục 7.1: Mảng Cơ bản"]
    Ch6 --> Ch7["Chương 7: Mảng Toàn diện & Giải thuật"]
    Ch6 --> Ch8["Chương 8: Kế thừa, Đa hình & Interface"]
    Ch6 --> Ch9["Chương 9: Xử lý Ngoại lệ (Exception)"]
    Ch7 --> Ch10["Chương 10: Luồng Nhập/Xuất & File I/O"]
    Ch8 --> Ch11["Chương 11: Đệ quy (Recursion)"]
    Ch8 --> Ch12["Chương 12: Cấu trúc Dữ liệu Động & Generics"]
    Ch8 --> Ch13["Chương 13-15: Lập trình GUI Swing & Applets"]

Kiến thức nền tảng được xây dựng

Giáo trình thiết lập hệ thống lý thuyết nền tảng vững chắc thông qua ba trục kiến thức chính:

  1. Mô hình kiến trúc và biên dịch: Người học nắm bắt bản chất của bộ nhớ máy tính (đơn vị byte, bit, địa chỉ bộ nhớ), sự khác biệt giữa bộ nhớ chính biến đổi (RAM) và bộ nhớ phụ lưu trữ vĩnh viễn (đĩa cứng, tệp). Hệ thống làm rõ cơ chế biên dịch mã nguồn Java thành mã bytecode độc lập với phần cứng máy tính và cách JVM thông dịch sang lệnh máy cục bộ, mang lại tính khả chuyển (portability).
  2. Nguyên lý hướng đối tượng: Giáo trình xây dựng nền tảng về tính đóng gói (encapsulation), che giấu thông tin (information hiding) bằng phạm vi truy cập private, thiết kế các phương thức truy xuất (accessor) và biến đổi (mutator). Nền tảng này được mở rộng thành mô hình phân cấp kế thừa, đa hình và thiết kế kiểu dữ liệu trừu tượng (ADT) qua giao diện Java, được trực quan hóa bằng sơ đồ lớp UML.
  3. Kỹ thuật phân rã và kiểm thử phần mềm: Đặt nền tảng cho phương pháp thiết kế từ trên xuống (top-down design), phân rã nhiệm vụ phức tạp của phương thức main thành các phương thức con, cùng quy trình kiểm thử đơn vị (Unit Testing) và kiểm thử hồi quy (regression testing).

Kỹ năng phát triển

Thông qua các bài tập và ví dụ hoàn chỉnh, giáo trình rèn luyện các nhóm kỹ năng cụ thể:

  • Kỹ năng kỹ thuật (Technical Skills): Viết mã nguồn, biên dịch và thực thi ứng dụng Java bằng công cụ dòng lệnh JDK hoặc các môi trường phát triển tích hợp (IDE); cấu hình và thao tác luồng dữ liệu vào/ra tệp tin nhị phân và tệp phân tách bằng dấu phẩy (CSV); triển khai các cấu trúc danh sách có tham số kiểu dữ liệu (Generics).
  • Kỹ năng phân tích (Analytical Skills): Phân tích và biểu diễn thuật toán, lần vết giá trị biến (tracing variables) để xác định lỗi logic trong cấu trúc lặp lồng nhau, nhận diện cạm bẫy rò rỉ quyền riêng tư (privacy leaks) khi tham chiếu đối tượng, và thiết kế các trường hợp kiểm thử biên.
  • Kỹ năng thực hành chuyên nghiệp (Practical Competencies): Áp dụng chuẩn phong cách lập trình (quy ước đặt tên định danh, thụt lề, chú thích tiền điều kiện precondition và hậu điều kiện postcondition), viết tài liệu kỹ thuật tự động thông qua công cụ javadoc, và xử lý ngoại lệ an toàn để ngăn ngừa sự cố sụp đổ chương trình.

Phương pháp giảng dạy và học tập

Giáo trình triển khai phương pháp sư phạm dựa trên sự kết hợp giữa lý thuyết cú pháp, phân tích ca điển hình (Case Studies) và phản hồi thực hành tức thì. Quy trình tiếp cận bài giảng đi từ việc phát biểu bài toán, phân tích giải thuật, hiện thực hóa bằng mã nguồn Java hoàn chỉnh, đến việc kiểm thử và mở rộng ứng dụng.

flowchart LR
    A["Phát biểu Bài toán<br/>(Problem Statement)"] --> B["Phát triển Giải thuật<br/>(Algorithm Design)"]
    B --> C["Hiện thực Mã nguồn<br/>(Java Implementation)"]
    C --> D["Kiểm thử & Gỡ lỗi<br/>(Testing & Debugging)"]
    D --> E["Tự đánh giá & Đồ án<br/>(Self-Test & Projects)"]

Cấu trúc mỗi chương được chuẩn hóa với các khối công cụ sư phạm chuyên biệt:

  • Recaps: Tóm lược ngắn gọn cú pháp Java và các khái niệm cốt lõi (ví dụ: nguyên lý địa chỉ byte, cú pháp khai báo khối lệnh).
  • Remembers: Nhắc nhở người học về các quy tắc then chốt, chẳng hạn như phân biệt giữa biến cú pháp (syntactic variables) và từ khóa cố định.
  • Programming Tips: Cung cấp các lời khuyên thực hành tối ưu, ví dụ như quy tắc luôn khởi tạo giá trị biến ngay khi khai báo để tránh lỗi trình biên dịch.
  • Gotchas: Cảnh báo sớm các lỗi sai phổ biến mà người mới học thường gặp, như việc ngộ nhận một chương trình chạy thành công không có nghĩa là logic đã hoàn toàn chính xác (Hidden Errors), hoặc lỗi khi sử dụng phương thức nextLine() sau khi đọc số.
  • FAQs & Asides: Giải thích nguyên lý bản chất (như lý do máy tính dùng hệ nhị phân 0 và 1) và chuẩn hóa cách sử dụng thuật ngữ (phân biệt giữa formal parameter trong định nghĩa phương thức và argument khi truyền giá trị).

Về mặt thực hành và đánh giá, giáo trình cung cấp hệ thống câu hỏi tự kiểm tra (Self-Test Questions) rải đều trong mỗi chương với đáp án chi tiết ở phần cuối chương. Đối với việc giảng dạy trên lớp, hệ thống bài tập cuối chương bao gồm các câu hỏi lý thuyết chỉ dành riêng đáp án cho giảng viên (Exercises) và hàng loạt đồ án lập trình mở rộng (Programming Projects).

Học tập tự định hướng được hỗ trợ bởi hệ sinh thái video hướng dẫn trực quan (VideoNotes) giải thích từng bước cách giải bài toán từ thiết kế đến viết mã. Đồng thời, nền tảng thực hành trực tuyến MyProgrammingLab (hợp tác cùng Turing's Craft) cung cấp môi trường nộp bài tự động, nhận diện lỗi cú pháp/logic theo thời gian thực và ghi nhận tiến độ học tập qua sổ điểm trực tuyến.


Điểm nổi bật và cập nhật

Ấn bản lần thứ 6 của giáo trình mang lại các cập nhật quan trọng nhằm tương thích với chuẩn phát triển phần mềm và nâng cao hiệu quả sư phạm:

  • Tích hợp chuẩn Java SE 7: Toàn bộ mã nguồn trong sách đã được kiểm tra trên bộ phát triển Oracle JDK 7. Cập nhật các tính năng mới của ngôn ngữ như cho phép sử dụng biến chuỗi String trong cấu trúc điều khiển switch và áp dụng cơ chế suy luận kiểu dữ liệu (type inference) khi khởi tạo các thể hiện tổng quát (generic instances).
  • Bổ sung các nghiên cứu tình huống thực tiễn: Tích hợp các bài học chuyên sâu về quy trình kiểm thử đơn vị tự động (Unit Testing), triển khai giao diện Comparable cho đối tượng, và xử lý dữ liệu từ tệp tin dạng bảng phân tách bằng dấu phẩy (Comma-Separated Values - CSV).
  • Tái cấu trúc sư phạm trong các chương trọng tâm:
    • Chương 5 được thiết kế lại, mở đầu bằng việc xây dựng một lớp đơn giản nhằm tạo bước đệm chuyển tiếp mềm dẻo cho người học khi tiếp cận khái niệm đối tượng.
    • Chương 8 được tái cấu trúc hoàn toàn nhằm tăng cường các ví dụ thực tế và làm sâu sắc thêm bản chất của tính đa hình (polymorphism) và giao diện (interfaces).
  • Mở rộng công cụ xuất nhập và toán học: Bổ sung nội dung hướng dẫn phương thức xuất có định dạng System.out.printf tại Chương 2; tích hợp phương thức sinh số ngẫu nhiên Math.random tại Chương 6.
  • Mở rộng đồ án và công cụ học tập số: Bổ sung 20 đồ án lập trình mới (Programming Projects) mang tính ứng dụng cao; hệ thống biểu tượng VideoNotes được mở rộng xuyên suốt các trang sách, hỗ trợ giải đáp trực tiếp các bài tập phức tạp.

Đối tượng sử dụng giáo trình

Giáo trình được thiết kế nhằm phục vụ đa dạng các nhóm đối tượng trong môi trường giáo dục đại học:

  • Sinh viên đại học và cao đẳng: Phù hợp cho sinh viên năm nhất hoặc năm hai thuộc các ngành Khoa học Máy tính, Kỹ thuật Phần mềm, Hệ thống Thông tin và Công nghệ Thông tin đang theo học học phần nhập môn lập trình. Tài liệu cũng được thiết kế phù hợp cho những sinh viên đã từng học một ngôn ngữ lập trình khác (như C hoặc C++) muốn chuyển sang Java; Phụ lục 6 của sách cung cấp bảng đối chiếu chi tiết sự khác biệt cú pháp và cơ chế quản lý bộ nhớ giữa C++ và Java.
  • Điều kiện tiên quyết: Người học không bắt buộc phải có kinh nghiệm lập trình từ trước. Yêu cầu tiên quyết duy nhất là kiến thức toán đại số ở bậc trung học cơ sở và khả năng thao tác cơ bản trên máy tính cá nhân.
  • Giảng viên: Giảng viên có thể khai thác sơ đồ phụ thuộc (Dependency Chart) ở đầu sách để linh hoạt điều chỉnh thứ tự bài giảng (chẳng hạn như dời phần đồ họa xuống cuối kỳ, hoặc dạy khái niệm mảng trước khi dạy toàn diện về lớp). Pearson cung cấp tài nguyên độc quyền gồm hệ thống slide bài giảng PowerPoint, tài liệu thực hành (Lab Manual), đáp án bài tập và ngân hàng câu hỏi trên MyProgrammingLab.
  • Người tự học: Giáo trình cung cấp đầy đủ các chương trình mẫu hoàn chỉnh kèm dữ liệu đầu vào/đầu ra mẫu, bộ câu hỏi tự kiểm tra có lời giải, cùng đĩa tài nguyên IDE Resource Kit hỗ trợ cài đặt và hướng dẫn sử dụng 7 môi trường lập trình phổ biến (JDK, Eclipse, NetBeans, jGRASP, DrJava, BlueJ, TextPad).

Câu hỏi thường gặp

1. Giáo trình này phù hợp với ai?

Giáo trình phù hợp cho sinh viên đại học bắt đầu học khoa học máy tính, người mới làm quen với lập trình, cũng như những lập trình viên đã nắm các ngôn ngữ như C/C++ cần một tài liệu học tập Java bài bản, chú trọng kỹ thuật giải quyết vấn đề.

2. Cần kiến thức nền nào để học?

Người học không cần kiến thức lập trình trước đó. Yêu cầu nền tảng duy nhất là kiến thức toán học ở mức đại số cơ bản trung học và có một máy tính cá nhân có thể cài đặt môi trường Java JDK.

3. Điểm khác biệt với giáo trình khác?

Tài liệu không chỉ đơn thuần liệt kê cú pháp ngôn ngữ mà tập trung sâu vào kỹ thuật giải quyết vấn đề (problem-solving), tiếp cận lớp đối tượng sớm (early classes), đồng thời cung cấp các mô-đun đồ họa tùy chọn (Graphics Supplements) và sơ đồ phụ thuộc linh hoạt giúp dễ dàng thay đổi lộ trình dạy học.

4. Làm sao để tự học hiệu quả?

Người học nên tự viết và chạy các chương trình mẫu trong văn bản, hoàn thành các câu hỏi Self-Test Questions trước khi xem đáp án ở cuối chương, theo dõi các video VideoNotes khi gặp các bài toán phức tạp và tham khảo các mục Gotchas để phòng tránh lỗi logic.

5. Có tài liệu bổ trợ nào kèm theo?

Hệ thống tài liệu bổ trợ bao gồm nền tảng trực tuyến MyProgrammingLab, mã nguồn chương trình mẫu, cẩm nang thực hành (Student Lab Manual), hệ thống video giải bài tập VideoNotes, 3 chương chuyên sâu mở rộng về GUI trên website và gói công cụ IDE Resource Kit tích hợp 7 môi trường lập trình Java.


Kết luận

Giáo trình Java: An Introduction to Problem Solving & Programming (6th Edition) của Walter Savitch cung cấp một khung chương trình học thuật chuẩn mực, kết hợp hài hòa giữa lý thuyết khoa học máy tính cơ bản, kỹ thuật thiết kế hướng đối tượng và kỹ năng lập trình Java SE 7 thực tế.

Lộ trình học tập đề xuất bắt đầu từ việc nắm vững cấu trúc máy tính và cú pháp điều khiển (Chương 1–4), xây dựng năng lực thiết kế lớp và hướng đối tượng (Chương 5–8), sau đó hoàn thiện các kỹ năng nâng cao về ngoại lệ, vào/ra tệp tin, đệ quy và cấu trúc dữ liệu tổng quát (Chương 9–12). Người học và giảng viên có thể khai thác thêm các chương mở rộng về Swing/Applet (Chương 13–15) cùng nền tảng đánh giá tương tác MyProgrammingLab để tối ưu hóa hiệu quả đào tạo.