Trong tài liệu có những câu hỏi - đáp rất hay mà trc h chưa thấy :3. ko ngờ lại có cả 1 cuốn sách viết về các câu hỏi ngu ngơ như thế này
Hỏi. Tại sao là Java?
Đáp. Các chương trình chúng ta đang viết rất giống các chương trình trong một số ngôn ngữ
khác, vì vậy sự lựa chọn ngôn ngữ thật sự không quan trọng. Chúng ta sử dụng Java vì nó khá phổ
biến. Nó bao trùm một bộ đầy đủ các khái niệm trừu tượng trong lập trình hiện đại, và có một loạt
các bộ kiểm tra tự động kiểm soát các lỗi có thể xảy ra. Do đó, Java thích hợp cho nhập môn học
tập lập trình. Nên nhớ, không có ngôn ngữ nào hoàn hảo, và bạn chắc chắn sẽ lập trình bằng các
ngôn ngữ khác trong tương lai.
Hỏi. Tôi có cần gõ lại các chương trình và thử chạy chúng?
Đáp. Lúc mới học, mọi người nên tự gõ lại các chương trình, biên dịch chúng, chạy và sửa lỗi
nếu có. Tuy nhiên, bạn có thể tìm thấy tất cả các đoạn mã trong cuốn sách này trên website
http://introcs.cs.princeton.edu/java
Hỏi. Quy tắc của Java về tab, khoảng trống và các ký tự xuống dòng là gì?
Đáp. Không có nhiều. Trình biên dịch Java coi chúng tương đương nhau. Ví dụ, chúng ta cũng
có thể viết chương trình HelloWorld như sau:
public class HelloWorld {public static void main (String [] args) {System.out.println (“Hello␣World”); }}
Nhưng chúng ta sẽ tuân thủ quy ước về khoảng cách và thụt dòng khi chúng ta viết chương trình,
giống như chúng ta luôn thụt dòng đầu đoạn khi chúng ta viết văn bản.
Hỏi. Các quy tắc về dấu ngoặc kép là gì?
Đáp. Các khoảng trống bên trong 2 dấu ngoặc kép là ngoại lệ cho quy tắc trong câu hỏi bên
trên: các kí tự bên trong 2 dấu ngoặc kép sẽ được in ra chính xác như khi viết. Bao nhiêu khoảng
trắng trong 2 dấu ngoặc kép sẽ được in ra bấy nhiêu. Do đó, nếu bạn quên mất một dấu ngoặc kép,
trình biên dịch sẽ không biết đâu là đoạn ký tự cần in, đâu là phần còn lại của chương trình. Để in
một dấu ngoặc kép, một dòng mới, hoặc dấu tab, sử dụng ", \n, hoặc \t trong dấu ngoặc kép.
Hỏi. Ý nghĩa của các từ static và void?
Đáp. Các từ khóa này chỉ định một số đặc tính của hàm main () mà bạn sẽ được học trong
cuốn sách. Tại thời điểm này, chúng ta cần đưa các từ khóa này vào trong các đoạn mã vì chúng
cần thiết.
Hỏi. Điều gì xảy ra khi bạn bỏ qua một dấu ngoặc hoặc viết sai một trong các từ khóa, như
static và public?
Đáp. Điều đó phụ thuộc vào chính xác những gì bạn làm. Lỗi như vậy được gọi là lỗi cú pháp.
Hãy thử và xem điều gì xảy ra.
Hỏi. Có thể một chương trình sử dụng nhiều hơn một đối số trên dòng lệnh?
Đáp. Có thể, bạn có thể dùng nhiều đối số, mặc dù chúng ta thường sử dụng chỉ một số ít. Bạn
có thể dùng đối số thứ hai bằng args[1], thứ ba bằng args[2], và vân vân. Lưu ý rằng chúng ta
bắt đầu đếm từ 0 trong Java.
Hỏi. Java có thư viện và hàm gì có sẵn cho tôi sử dụng?
Đáp. Có hàng ngàn thư viện cho bạn sử dụng nhưng chúng tôi sẽ giới thiệu chúng cẩn thận để
bạn không bị choáng ngợp bởi quá nhiều lựa chọn.
Hỏi. Tôi nên viết mã Java như thế nào ? Tôi nên viết chú thích trong Java như thế nào?
Đáp. Lập trình viên sử dụng các chỉ dẫn lập trình để chương trình dễ đọc, dễ hiểu, và dễ bảo
trì. Khi bạn có kinh nghiệm, bạn sẽ phát triển một phong cách lập trình riêng của mình, giống như
mỗi nhà văn đều có phong cách riêng. Phụ lục B cung cấp một số chỉ dẫn lập trình và cách chú
thích. Chúng tôi khuyên bạn nên đọc phụ lục này sau khi bạn đã viết một vài chương trình.
Hỏi. Tập tin có đuôi .class chính xác là gì ?
Đáp. Đó là một tập tin nhị phân (chuỗi các số 0 và số 1). Nếu bạn đang sử dụng Unix hay OS
X, bạn có thể kiểm tra nội dung của nó bằng cách gõ
% od HelloWorld.class -x
9
tại dấu nhắc lệnh. Lệnh này sẽ hiển thị nội dung tập tin hệ thập lục phân (cơ sở 16). Bạn có thể
thấy từ đầu tiên của mỗi tập tin .class là cafe.
0000000 c a f e babe 0000 002 e 001d 0a00 0600 0 f09
0000020 0010 0011 0800 120a 0013 0014 0700 1507
0000040 0016 0100 063 c 696 e 6974 3 e01 0003 2829
0000060 5601 0004 436 f 6465 0100 0 f 4 c 696 e 654 e
0000100 756d 6265 7254 6162 6 c65 0100 046d 6169
0000120 6 e01 0016 285b 4 c6a 6176 612 f 6 c61 6 e67
0000140 2 f53 7472 696 e 673b 2956 0100 0a53 6 f75
0000160 7263 6546 696 c 6501 000 f 4865 6 c6c 6 f57
0000200 6 f72 6 c64 2 e6a 6176 610 c 0007 0008 0700
0000220 170 c 0018 0019 0100 0 c48 656 c 6 c 6 f 2 c20
0000240 576 f 726 c 6407 001a 0 c00 1b00 1 c01 000a
0000260 4865 6 c6c 6 f57 6 f72 6 c64 0100 106a 6176
0000300 612 f 6 c61 6 e67 2 f 4 f 626a 6563 7401 0010
0000320 6a61 7661 2 f 6 c 616 e 672 f 5379 7374 656d
0000340 0100 036 f 7574 0100 154 c 6a61 7661 2 f69
0000360 6 f 2 f 5072 696 e 7453 7472 6561 6d3b 0100
0000400 136a 6176 612 f 696 f 2 f50 7269 6 e74 5374
0000420 7265 616d 0100 0770 7269 6 e74 6 c6e 0100
0000440 1528 4 c6a 6176 612 f 6 c61 6 e67 2 f53 7472
0000460 696 e 673b 2956 0021 0005 0006 0000 0000
0000500 0002 0001 0007 0008 0001 0009 0000 001d
0000520 0001 0001 0000 0005 2ab7 0001 b100 0000
0000540 0100 0a00 0000 0600 0100 0000 0 c00 0900
0000560 0b00 0 c00 0100 0900 0000 2500 0200 0100
0000600 0000 09b2 0002 1203 b600 04b1 0000 0001
0000620 000a 0000 000a 0002 0000 000 f 0008 0010
0000640 0001 000d 0000 0002 000 e
0000652
Hỏi. Làm thế nào để đánh dấu | ?
Đáp. Nhấn Shift ⇑ + \ .
Hỏi. Java in ra một tấn của các chữ số khi tôi dùng System.out.println() cho số thực. Làm
thế nào tôi có thể định dạng để nó chỉ hiển thị 3 chữ số phần thập phân?
Đáp. Sử dụng hàm System.out.printf() mô tả trong Chương 5.
Hỏi. Tại sao thương các số nguyên -0/3 cho kết quả 0, nhưng thương các số thực -0.0 / 3.0
cho kết quả -0.0 ?
Đáp. Java biểu diễn số nguyên int bằng phương pháp bù 2 (two’s complement notation). Mỗi số nguyên chỉ có một cách biểu diễn. Trong khi đó, Java biểu diễn số thực double bằng cách sử dụng chuẩn IEEE, và có 2 cách biểu diễn khác nhau cho số 0 và -0.
Hỏi. Điều gì xảy ra nếu tôi sử dụng / và % với tử số là số âm ?
Đáp. Hãy thử nó xem. -47 / 5 = -9 Và -47 % 5 = -2. Các thương luôn làm tròn hướng về số
0. Để đảm bảo tính chất Euclide b * (a / b) + (a % b) = a, kết quả của phép lấy số dư có thể
âm. Quy ước này được thừa hưởng từ ngôn ngữ trước đó như FORTRAN và C. Một số ngôn ngữ
(nhưng không phải Java) có cả phép lấy số dư và phép modulo vì sẽ thuận tiện nếu có một toán tử
trả về số dư không âm.
Hỏi. Tôi có thể sử dụng % với số thực không ?
Đáp. Có. Nếu angle không âm, thì angle % (2 * Math.PI) chuyển đổi các góc về khoảng giữa
0 và 2π.
Hỏi. Làm thế nào để in dấu nháy kép " ?
Đáp. Vì " là kí tự đặc biệt khi làm việc với xâu kí tự, bạn cần viết nó dưới dạng ". Ví dụ,
System.out.println(“The␣pig␣said␣"Oink␣Oink"␣afterwards”);.
Hỏi. Vậy thì làm thế nào để in dấu \ ?
Đáp. Sử dụng “\”.
Hỏi. Có giới hạn gì cho việc đặt tên biến ?
Đáp. Có. Một tên trong Java bắt đầu bằng một kí tự trong bảng chữ cái, tiếp theo là một chuỗi
không giới hạn của các chữ cái và chữ số. Các kí tự này có thể lấy trong bảng Unicode nhưng trong
cuốn sách này ta chỉ dùng các chữ cái tiếng Anh. Theo quy ước, các biến thường bắt đầu bằng một
chữ viết thường. Tên trong Java không được phép dùng các từ dành riêng sau.
abstract default goto package this
assert do if private throw
boolean double implement protected throws
break else import public transient
byte enum instanceof return true
case extends int short try
catch false interface static void
char final long strictfp volatile
class finally native super while
const float new switch
continue for null synchronized
Hỏi. Thứ tự tính toán của các toán tử Java như thế nào ?
Đáp. Xem phụ lục A.
Hỏi. Có khác biệt gì giữa a += b và a = a + b, với a và b là các biến kiểu số cơ bản ?
Đáp. Có nếu a và b có kiểu khác nhau. Câu lệnh gán a += b tương đương với a = (int) (a +
b) nếu a có kiểu int. Như vậy nếu b là double thì a += b hợp lệ trong khi a = a + b gây lỗi biên
dịch.
Hỏi. Tại sao tôi cần khai báo kiểu của biến trong Java?
Đáp. Bằng cách xác định kiểu, trình biên dịch có thể cảnh báo bạn những lỗi tiềm tàng có thể
xảy ra, ví dụ như khi bạn cố gắng để nhân số nguyên với xâu kí tự. Tương tự như thế, trong vật lý,
ta luôn luôn phải kiểm tra các đại lượng có cùng đơn vị (cùng kiểu). Đối với các chương trình nhỏ,
điều này có vẻ như không quan trọng; nhưng với các chương trình lớn, việc này cực kì quan trọng.
Các tên lửa Ariane 5 đã phát nổ 40 giây sau khi cất cánh chỉ vì một lỗi không chuyển đổi chính xác
một số thực 64 bit thành một số nguyên 16 bit trong phần mềm của chúng.
Hỏi. Tại sao là kiểu số thực được gọi là double?
Đáp. Trong lịch sử, kiểu số dấu chấm động là float, nhưng chúng có độ chính xác hạn chế.
Kiểu double được đưa vào với độ chính xác gấp đôi.
Hỏi. Chương trình của tôi mắc kẹt trong vòng lặp vô hạn. Làm thế nào để thoát khỏi nó?
Đáp. Nhấn tổ hợp Ctrl + C .
Hỏi. Làm thế nào để kiểm tra 2 xâu kí tự có bằng nhau.
Đáp. Đây là điểm khác biệt giữa xâu kí tự và các kiểu cơ bản khác như int, double, boolean.
Xem phần 3.
Hỏi. Tại sao lệnh if (a <= b <= c) không chạy ?
Đáp. Hãy dùng if (a <= b && b <= c)
Hỏi. Có ví dụ nào mà ta không thể bỏ dấu ngoặc nhọn sau vòng for.
Đáp. Xem các đoạn mã sau đây, đoạn mã đầu tiên là hợp lệ (nhưng vô nghĩa), đoạn thứ hai gây
lỗi biên dịch. Chính xác mà nói, dòng thứ hai trong đoạn thứ hai là một khai báo chứ không phải
là một câu lện.
// legal
for (int i = 0; i <= N; i++) {
int x = 5;
}
// illegal
for (int i = 0; i <= N; i++)
int x = 5;
Hỏi. Trong Java tôi thấy hai cách khai báo mảng int a[] và int []a. Có gì khác biệt không ?
Đáp. Cả hai cách đều hợp lệ và tương đương nhau. Cách đầu bắt nguồn từ ngôn ngữ C. Cách
thứ hai của Java chỉ rõ đây là khai báo mảng.
Hỏi. Tại sao chỉ số của mảng bắt đầu từ 0 thay vì 1?
Đáp. Quy ước này có nguồn gốc từ các chương trình ngôn ngữ máy với địa chỉ của phần tử
mảng được tính bằng cách cộng chỉ số với địa chỉ của phần tử đầu tiên. Nếu ta bắt đầu từ chỉ số 1
sẽ lãng phí phần tử ở đầu mảng hoặc mất thời gian trừ đi 1.
Hỏi. Điều gì xảy ra nếu tôi sử dụng một số âm làm chỉ số một mảng?
Đáp. Cũng giống như khi bạn sử dụng chỉ số quá lớn. Bất cứ khi nào chương trình dùng chỉ số
mảng không nằm giữa 0 và chiều dài mảng trừ đi một, Java sẽ sinh ngoại lệ
ArrayIndexOutOfBoundsException và chấm dứt chương trình.
Hỏi. Còn lưu ý nào khác khi tôi sử dụng mảng?
Đáp. Bạn nên nhớ Java luôn khởi tạo mảng khi bạn tạo ra chúng, do đó tạo ra một mảng cần
thời gian tỉ lệ thuận với kích thước của mảng.
Hỏi. Nếu a[] là một mảng, tại sao System.out.println(a) in ra một số nguyên hệ thập lục
phân, ví dụ như @f62373, thay vì các phần tử của mảng?
Đáp. Câu hỏi hay. Java in địa chỉ trong bộ nhớ của mảng. Tuy nhiên, khác với C, trong Java
hiếm khi bạn cần địa chỉ này.
vv
Tải tại đây .