Các thành phần cơ sở của ngôn ngữ lập trình Java
Nội dung: , Các kiểu nguyên thủy, Các phép toán và các biểu thức tính toán. Định danh (Tên gọi):Tên gọi của các thành phần trong chương trình được gọi là định danh ( Identifier ...
Nội dung:
- ,
- Các kiểu nguyên thủy,
- Các phép toán và các biểu thức tính toán.
- Định danh (Tên gọi):Tên gọi của các thành phần trong chương trình được gọi là định danh (Identifier).Trong Java định danh là một dãy các ký tự gồm các chữ cái, chữ số và một số các ký hiệu như: ký hiệu gạch dưới nối câu ‘_’, các ký hiệu tiền tệ $, Ơ, Ê, Â, và không được bắt đầu bằng chữ số.
Ví dụ các định danh sau là hợp lệ: so_nguyen, $My, danh_sach12, HocSinh, còn những từ sau không phải là định danh 24gio, số_nguyên, Hoc-sinh.
- Xu thế chuẩn hoá cách đặt tên thống nhất như sau:
- Định danh cho các lớp: chữ cái đầu của mỗi từ trong định danh thường được viết hoa, ví dụ MyClass, HocSinh, KhachHang là định danh của các lớp.
- Định danh cho các biến, phương thức, đối tượng: chữ cái đầu của mỗi từ trong định danh đều viết hoa trừ từ đầu tiên, ví dụ myClass, hocSinh, khachHang là định danh của các đối tượng (biến) thuộc các lớp MyClass, HocSinh,KhachHang tương ứng.
Các từ khóa
Các từ khóa của Java có thể chia thành chín nhóm.
- Tổ chức các lớp
- package: Xác định một gói sẽ chứa một số lớp ở trong tệp nguồn.
- import: Yêu cầu một hay một số lớp ở các gói chỉ định cần nhập vào để sử dụng trong ứng dụng hiện thời.
- Định nghĩa các lớp
- interface Định nghĩa các biến, hằng, phương thức chung như là giao diện có thể chia sẻ chung giữa các lớp.
- class Định nghĩa tuyển tập các thuộc tính dữ liệu, phương thức mô tả các đặc tính và các hành vi của tập các đối tượng có quan hệ với nhau.
- extends Chỉ ra một lớp là mở rộng (kế thừa) của một lớp khác, hay còn gọi làlớp con của lớp cho trước.
- implements Xây dựng một lớp mới cài đặt những phương thức từ interface xác định trước.
- Các từ khóa cho các biến và các lớp
- abstract Khai báo lớp trừu tượng không có thể hiện cụ thể.
- public Khai báo lớp, biến dữ liệu, phương thức công khai có thể truy nhập ở mọi nơi trong hệ thống.
- private Khai báo biến dữ liệu, phương thức riêng trong từng lớp và chỉ cho phép truy nhập trong lớp đó.
- protected Khai báo biến dữ liệu, phương thức được bảo vệ, cho phép truy nhập ở lớp chứa chúng và các lớp con của lớp đó.
- static Định nghĩa các biến, phương thức tĩnh của lớp, dùng chung cho tất cả các đối tượng trong một lớp.
- synchronized Chỉ ra là ở mỗi thời điểm chỉ có một đối tượng hoặc một lớp có thể truy nhập đến biến dữ liệu, hoặc phương thức loại đó, nghĩa là chúng được đồng bộ hoá.
- volatile Báo cho chương trình dịch biết là biến khai báo volatile có thể thay đổi dị bộ (tùy ý) trong các luồng (thread).
- final Chỉ ra các biến, phương thức không được thay đổi sau khi đã được định nghĩa.
- native Liên kết một phương thức với mã địa phương (native code), mã được viết trong những ngôn ngữ lập trình khác như C chẳng hạn.
- Các kiểu nguyên thủy (đơn giản)
- long Kiểu số nguyên lớn với các giá trị chiếm 64 bit (8 byte).
- int Kiểu số nguyên với các giá trị chiếm 32 bit (4 byte).
- short Kiểu số nguyên ngắn với các giá trị chiếm 16 bit (2 byte).
- byte Kiểu byte với các giá trị nguyên chiếm 8 bit (1 byte).
- char Kiểu ký tự Unicode, mỗi ký tự chiếm 16 bit (2 byte).
- float Kiểu số thực với các giá trị biểu diễn theo dạng dấu phẩy động 32 bit.
- double Kiểu số thực chính xác gấp đôi với các giá trị biểu diễn theo dạng dấu phẩy động 64 bit (8 byte).
- boolean Kiểu logic với 2 trị: true, false.
- void Kiểu trống sử dụng cho những hàm không trả lại giá trị.
- Những từ khóa cho các giá trị và các biến
- false Giá trị kiểu boolean (sai).
- true Giá trị kiểu boolean (đúng).
- this Biến chỉ tới đối tượng hiện thời.
- super Biến chỉ tới đối tượng ở lớp cha.
- null Chỉ ra đối tượng không tồn tại.
- Xử lý ngoại lệ
- throw, throws Bỏ qua một ngoại lệ.
- try Thử thực hiện cho đến khi gặp một ngoại lệ.
- catch Đón nhận một ngoại lệ.
- finally Thực hiện một khối lệnh đến cùng bất chấp các ngoại lệ có thể xảy ra.
- Tạo lập và kiểm tra các đối tượng
- new Tạo lập một đối tượng.
- instanceof Kiểm tra xem một đối tượng có nằm trong một lớp hay một interface hay không.
- Dòng điều khiển
- switch Chuyển điều khiển chương trình theo các trường hợp ở case.
- case Trường hợp được tuyển chọn theo switch.
- default Trường hợp mặc định.
- break Thoát khỏi các chu trình.
- if Lệnh tuyển chọn theo điều kiện logic.
- else Rẽ nhánh theo điều kiện ngược lại của if.
- continue Tiếp tục thực hiện trong chu trình.
- return Trả lại giá trị cho các phương thức.
- do Thực hiện một chu trình.
- while Kết hợp với do để tạo ra một chu trình.
- for Chu trình for với các bước lặp thường là xác định.
- Những từ khóa chưa được sử dụng
- byvalue future outer
- const genetic rest
- goto inner var
- cast operator
Chú thích (Comment)
- Chú thích trên một dòng: Tất cả các ký tự sau // cho đến cuối dòng là chú thích.
// Từ đây đến cuối dòng là chú thích
- Chú thích trên nhiều dòng: Giống như trong C, phần nằm giữa /* và */ là chú thích.
/* Một chú thích
ghi trên nhiều dòng*/
- Chú thích trong tư liệu: Đây là loại chú thích đặc biệt được đặt vào những chỗ thích hợp trong chương trình để javadoc có thể đọc và sử dụng để tạo ra tư liệu dạng HTML cho chương trình. Phần chú thích trong tư liệu được bắt đầu bằng
/** và kết thúc bằng */.
/**
* Lớp này cài đặt giao diện Demo
* Tác giả: Anh Tuấn,
* Version 1.0*/
Mỗi ngôn ngữ lập trình đều định nghĩa sẵn một số kiểu dữ liệu cơ bản được gọi là kiểu nguyên thủy. Các kiểu nguyên thủy của Java được chia thành 3 nhóm:
- Kiểu nguyên gồm các kiểu số nguyên và kiểu ký tự. Các kiểu số nguyên gồm: byte, short, int, long biểu diễn cho các số nguyên có dấu. Kiểu ký tự được thể hiện bằng kiểu char, biểu diễn cho các ký tự mã Unicode gồm các chữ cái, chữ số và các ký tự đặc biệt. Kiểu char có 65536 (216) ký tự trong tập mã Unicode 16 bit. Mã của 128 ký tự đầu của tập Unicode hoàn toàn trùng với mã của 128 ký tự trong tập mã ASCII 7-bit và mã của 256 ký tự đầu hoàn toàn tương ứng với 256 ký tự của tập mã ISO Latin-1 8 bit.
- Kiểu dấu phẩy động hay kiểu số thực: Loại này có hai kiểu float và double biểu diễn cho các số thập phân có dấu.
- Kiểu boolean: là kiểu boolean có hai giá trị true (đúng) và false (sai).
Các kiểu nguyên thủy trong Java
[Từ khoá phạm vi] <Kiểu dữ liệu của biến> <danh sách biến> [giá trị khởi tạo]
- Từ khoá phạm vi: Thể hiện phạm vi truy xuất dữ lỉệu: public, private, protected, static
- Kiểu dữ liệu của biến:Thể hiện kiểu dữ liệu của biến: int, float…
- danh sách biến:Khai báo tên các biến
- giá trị khởi tạo:Giá trị khởi tạo ban đầu cho các biến
public int n = 10, m; int n = 10, m; private float a = 1.56f; float a = 1.56f; long l = 99999999999999999L; String st = "Toi la TRAN VAN A";ring = "Toi la TRAN VAN LANG";
Trong Java có bốn loại biến:
- Các biến thành phần là các thành phần của lớp và được khởi tạo giá trị mỗi khi một đối tượng của lớp được tạo ra.
- Các biến tham chiếu đối tượng (Object Reference) gọi tắt là biến tham chiếu và kiểu lớp còn được gọi là kiểu tham chiếu, là các biến được sử dụng để xử lý các
- Kiểu nguyên thủy
- Kiểu boolean (logic) Kiểu số
- Kiểu nguyên Kiểu số thực
- Kiểu ký tự Kiểu số nguyên
- boolean char byte short int long float double
- đối tượng. Biến tham chiếu phải được khai báo và khởi tạo giá trị trước khi sử dụng.
- HocSinh hs; // Khai báo biến hs tham chiếu tới lớp HocSinh.
- HocSinh hs = new HocSinh(“Lan Anh”); //Khai báo kết hợp để khởi tạo giá trị
- Các biến tĩnh (static) cũng là các thành viên của lớp nhưng không phải đại diện cho từng đối tượng mà cho cả lớp:
- Bổ từ static gắn thêm phía trước biến hoặc một thành viên để chỉ định thành viên này có ảnh hưởng đến tất cả các đối tượng của lớp, nói cách khác các đối tượng cùng chia xẻ đến thành viên.
- Từ đó, chúng ta có trể truy cập đến nó mà không cần tạo ra đối tượng. Chẳng hạn, hàm main() của một lớp thực thi dạng ứng dụng độc lập sẽ được truy cập đến từ một nơi nào đó (trong trường hợp này, nó được điều khiển bởi máy ảo Java) trước khi chương trình làm việc.
- Điều này có nghĩa là chưa bao giờ có đối tượng của lơp chứa nó được tạo ra. Nên bắt buộc phải có static trước hàm main() của lớp.
- Dữ liệu thành viên co thêm từ khoá static được coi là biến lớp ( classs variables)
- Chúng ta thường hay sử dụng biến lớp để trao đổi thông tin giữa các đối tượng thuộc cùng một lơp.
- Bởi do mang thuộc tính tĩnh ( static) nghĩa là được tạo ra một lần khi có lơp, chứ không phải được tạo khi đối tượng được tạo ra.
- Các biến cục bộ (local) là những biến được khai báo trong các phương thức và trong các khối. Trong Java các biến local phải được khai báo trước khi sử dụng.
Khi khai báo cũng có thể kết hợp để khởi tạo các giá trị cho các biến.
Các giá trị mặc định cho các biến thành phần
- Các biến tĩnh trong lớp luôn được khởi tạo với các giá trị mặc định nếu chúng không được gán giá trị tường minh .
- Các biến thành phần cũng được khởi tạo mặc định mỗi khi đối tượng của lớp có thành phần đó được khởi tạo nếu chúng không được giá trị tường minh.
- Biến tham chiếu được gán mặc định là null nếu không tạo lập tường minh theo toán tử new và toán tử tạo lập (constructor).
-
Để đọc các giá trị số vào cho chương trình, phải khai báo một biến tham chiếu thuộc lớp
String
và biến tham chiếu thuộc lớp
DataInputStream
có dạng như sau:
String str; DataInputStream stream = new DataInputStream(System.in);
- Vấn đề nhập dữ liệu vào từ bàn phím cũng thường gây ra nhiều ngoại lệ, như thay vì phải gõ các chữ số, chữ cái lại gõ vào ký hiệu điều khiển hay vượt phạm vi xác định chẳng hạn. Việc kiểm soát các ngoại lệ vào/ra trong Java có thể thực hiện theo lệnh:
-
try{
-
str = stream.readLine();
-
catch(IOException e){str = "0.0";}
-
Để hiển thị giá trị ra màn hình sử dụng hàm:
System.out.print; trong trường hợp hiển thị giá trị theo từng dòng sử dụng hàm: System.out.println
System.out.print("Chao ban"); System.out.println("Chao ban va xuong dong duoi");
// Light.java class Light { // Các biến tĩnh static int boDem; // Giá trị 0 được gán mặc định khi lớp được nạp //Các biến thể hiện int soWatts =100; // gán tường minh là 100 boolean bieuHien; // gán mặc định giá trị false String viTri; // gán mặc định giá trị null public static void main(String args[]) { Light b1 = new Light();// Biến tham chiếu local System.out.println("Bien tinh boDem: " +Light.counter); System.out.println("Bien thanh phan soWatts:" +b1.soWatts); System.out.println("Bien thanh phan bieuHien: " +b1.bieuHien); System.out.println("Bien thanh phan viTri: " +b1.viTri); } }
Tệp chương trình Java có thể có các phần được đặc tả như sau:
- Định nghĩa một gói là tùy chọn thông qua định danh của gói (package).
- Một số lệnh nhập import (0 hoặc nhiều).
- Một số định nghĩa lớp và interface có thể định nghĩa theo thứ tự bất kỳ. Cấu trúc chương trình Java vì vậy có thể khái quát như sau:
NewApp.java
// Filename:
- Tệp chương trình Java luôn có tên trùng với tên của một lớp công khai
- (lớp chứa hàm main() nếu là ứng dụng độc lập) và có đuôi là .java.
- Tệp NewApp.java nếu là chương trình ứng dụng độc lập thì phải có một lớp có tên là NewApp và lớp này phải có phương thức main(). Phương thức này luôn có dạng:
public static void main(String args[])
{
// Nội dung cần thực hiện của chương trình ứng dụng
}
- Khi dịch (javac) thì mỗi lớp trong tệp chương trình sẽ được dịch thành byte code và được ghi thành tệp riêng có tên trùng với tên của lớp và có đuôi .class. Những lớp này sẽ được nạp vào chương trình lúc thông dịch và thực hiện theo yêu cầu.
- Trong chương trình Java không có các khai báo biến, hàm tách biệt khỏi lớp và chỉ có các khai báo và định nghĩa các lớp, interface. Như thế chương trình Java được xem như là tập các lớp, interface và các đối tượng của chúng trao đổi thông điệp với nhau (bằng các lời gọi hàm) để thực hiện các nhiệm vụ của ứng dụng.
// Phần 1: Tùy chọn
// Định nghĩa gói
package GoiNhaTruong;
// Phần 2: (0 hoặc nhiều hơn)
// các gói cần sử dụng
import java.io.*;
// Phần 3: (0 hoặc nhiều hơn)
// Định nghĩa các lớp và các interface
public class NewApp{ ...}
class C1{...}
interface I1{...}
//
class Cn {...}
interface Im{...}
// Tệp Display.java
import java.io.*; // Nhập vào gói java.io
class Display{ // Xây dựng lớp Display để hiển thị thông tin
public static void main(String args[])
{
String hTen = "Lan Anh"; // Biến tham chiếu cục bộ được gán trị đầu
int tuoi = 20; // Biến cục bộ được gán trị đầu
float diem = 8.5F; // Biến cục bộ kiểu float được gán trị đầu số thực
// Hiển thị các thông tin biết trước
System.out.println("Ho va ten: " + hTen);
System.out.println("Tuoi: " + tuoi);
System.out.println("Diem thi: " + diem);
}
}
float t = 3.14; // Lỗi vì không tương thích kiểu
Vì thế, hoặc phải thông báo tường minh là số thực kiểu float (3.14F): float t = 3.14F; hoặc phải thực hiện ép sang kiểu (float)3.14, float t = (float)3.14;
// Tệp InputOutput.java
import java.io.*;
class InputOutput{
public static void main(String args[]){
float x, y;
String str;
// Đọc dữ liệu vào dưới dạng 1 xâu
DataInputStream stream = new DataInputStream(System.in);
// Hiển thị thông báo “x = “ và không xuống dòng
System.out.print("x = ");
try{ // Thử thực hiện
str = stream.readLine(); // Đọc vào 1 dãy các chữ số (xâu)
}catch(IOException e){str="0.0";} // Đón nhận khi gặp ngoại lệ
// Chuyển dãy các chữ số về số thực kiểu float
try{
// Chuyển dãy các chữ số sang giá trị kiểu float
x = Float.valueOf(str).floatValue();
}catch(NumberFormatException e){x = 0.0F;}
System.out.print("y = ");
try{
str = stream.readLine();
}catch(IOException e){str = "0.0F";}
// Chuyển dãy các chữ số về số thực kiểu float
try{
y = Float.valueOf(str).floatValue();
}catch(NumberFormatException e){y = 0.0F;}
System.out.println(“Gia tri trung binh cong cua “ +
x + " va " + y + " la " + (x + y)/2);
}
}
Thứ tự ưu tiên và qui tắc kết hợp thực hiện của các phép toán
Bảng 1 Các phép toán trong Java
STT | Tên gọi | Các phép toán | Qui tắc kết hợpthực hiện |
1 | Phép toán 1 ngôi hậu tố (postfix) | [] . (tham_so) exp++ exp-- | Thực hiện từ trái qua phải |
2 | Phép toán 1 ngôi tiền tố (prefix) | ++exp --exp +exp -exp ~! | Thực hiện từ phải qua trái |
3 | Tạo lập đối tượng và ép kiểu | new() (type) | Thực hiện từ phải qua trái |
4 | Loại phép nhân | * / % | Thực hiện từ trái qua phải |
5 | Loại phép cộng | + - | Thực hiện từ trái qua phải |
6 | Phép toán quan hệ | < <= >>= instanceof | Thực hiện từ trái qua phải |
7 | Phép so sánh đẳng thức | == != | Thực hiện từ trái quaphải |
8 | Phép và (AND) trênbitwise/boolean | & | Thực hiện từ trái qua phải |
9 | Phép hoặc loại trừ(XOR) trên bitwise/boolean | ^ | Thực hiện từ trái qua phải |
10 | Phép hoặc (OR) trênbitwise/boolean | | | Thực hiện từ trái qua phải |
11 | Phép hoặc (OR) logic | || | Thực hiện từ phải qua trái |
12 | Phép và (AND) logic | && | Thực hiện từ phải qua trái |
13 | Phép toán điều kiện | ?: | Thực hiện từ phải qua trái |
14 | Các phép gán | = += -= *= /=%= <<= >>= >>>=&= ^= |= | Thực hiện từ phải qua trái |
Các qui tắc chuyển đổi kiểu
Ép kiểu
Qui tắc ép kiểu có dạng:
(<type>) <exp>
- Lúc thực hiện hệ thống sẽ chuyển kết quả tính toán của biểu thức <exp> sangkiểu được ép là <type>.
float f = (float) 100.15D; // Chuyển số 100.15 dạng kiểu double sang float
- Không cho phép chuyển đổi giữa các kiểu nguyên thủy với kiểu tham chiếu, ví dụ kiểu double không thể ép sang các kiểu lớp như HocSinh được.
- Kiểu giá trị boolean (logic) không thể chuyển sang các kiểu dữ liệu số và ngược lại.
Mở rộng và thu hẹp kiểu
- Giá trị của kiểu hẹp hơn (chiếm số byte ít hơn) có thể được chuyển sang những kiểu rộng hơn (chiếm số byte nhiều hơn) mà không tổn thất thông tin. Cách chuyển kiểu đó được gọi là mở rộng kiểu.
char c = ‘A’;
int k = c; // mở rộng kiểu char sang kiểu int (mặc định)
- Chuyển đổi kiểu theo chiều ngược lại, từ kiểu rộng về kiểu hẹp hơn được gọi là thu hẹp kiểu.
- Cuối cùng chúng ta cũng cần lưu ý về ngữ cảnh phải thực hiện chuyển đổi kiểu:
- Thực hiện các phép gán đối với các biến kiểu nguyên thủy hoặc kiểu tham chiếu,
- Thực hiện các lời gọi hàm (phương thức) với các tham biến kiểu nguyên thủy hay kiểu tham chiếu,
- Thực hiện tính toán các biểu thức số học,
- Ghép các xâu kết hợp các đối tượng của lớp String và các kiểu dữ liệukhác.
Các phép toán số học
Các phép toán số học được chia thành hai loại:
- Các phép toán 1 ngôi (đơn nguyên): + (cộng) và - (trừ), các phép đổi dấu,
- Các phép toán 2 ngôi (nhị nguyên): * (nhân), / (chia), % (lấy modul – phép chia lấy số dư), + (cộng) và - (trừ).
- Thứ tự kết hợp thực hiện của các phép toán số học đơn nguyên là từ phải qua trái:
int val = - -20; // (- (-20)) cho 20
- Chú ý giữa 2 phép toán đơn nguyên là phải có dấu cách.
- Thứ tự kết hợp thực hiện của các phép toán số học nhị nguyên là từ trái qua phải:
int newVal = 10 % 4 * 4; // ((10 % 4) * 4) cho 8
int iVal = newVal / 5; // Thực hiện chia nguyên và cho kết quả là 1
- Lúc thực hiện, các toán hạng phải được tính toán từ trái qua phải trước khi áp dụng với phép toán. Khi 2 toán hạng khác nhau về kiểu thì thực hiện chuyển đổi kiểu như trên đã đề cập.
- Phép chia nguyên (2 toán hạng đều là kiểu nguyên) đòi hỏi số chia phải khác 0.
int iV = 10 / 0;
// Sinh lỗi ngoại lệ số học: ArithmeticException
- Phép chia số thực (ít nhất một toán hạng kiểu số thực) cho phép chia cho 0 và kết quả phép chia cho 0.0 là INF (số lớn vô cùng) hoặc –INF (số âm vô cùng), hai hằng đặc biệt trong Java.
float n, m = 4.5 / 0.0; // Cho m là INF
n = -4.5 /0.0; // Cho n là -INF
- Trong Java, phép chia lấy số dư % thực hiện được cả đối với số thực.
float m = 11.5 % 2.5; // Cho m là 1.5
- Khi sử dụng các phép toán đơn nguyên đối với các đối số kiểu byte, short, hoặc char thì trước tiên toán hạng phải được tính rồi chuyển về kiểu int và kết quả là kiểu int.
- byte b1, b = 4; // OK số 4 kiểu int nhưng cho phép thu hẹp kiểu mặc định về byte
- b = - b; // Lỗi vì -b có kết quả kiểu int do vậy thu hẹp kiểu đòi hỏi phải tường minh
- b1 = (byte) -b; // Hoàn toàn đúng
- short h = 30; // OK: 30 kiểu int chuyển về short (mặc định đối với hằng nguyên
- h = h + 4; // Lỗi vì h + 4 cho kết quả kiểu int vì thế không thể gán trực tiếp và cho h kiểu short. Nhưng,
- h = (short) (h+4); // lại đúng hoặc có thể viết h = h + (short)4;
Các phép gán số học mở rộng
- Đối với các phép gán số học mở rộng thì qui tắc cú pháp trên tương đương ngữ nghĩa với lệnh sau:
<var> = (<type>) (<var> <op> (<exp>));
- Trong đó <type> là các kiểu số và <op> là phép toán số học +, -, *, /, %. Hình 7 mô tả chi tiết hơn các phép gán số học mở rộng.
Hình 6: Các phép gán số học mở rộng
Các phép gán logic mở rộng
- Các phép gán logic mở rộng được định nghĩa chi tiết như trong bảng B3.6.
- Hình 7: Các phép gán logic mở rộng
- Các lệnh gán Cho b và biểu thức e kiểu boolean
int v0 = - 42;
char v1 = ‘)’; // 41
byte v2 = 13;
Các phép toán so sánh đẳng thức
- Các phép toán so sánh <, <=, >, >= của Java được định nghĩa giống như trong các ngôn ngữ lập trình khác (như C chẳng hạn). Trong đó chỉ cần lưu ý là 2 đối số phải là các biểu thức số.
- So sánh đẳng thức trên các giá trị kiểu nguyên thủy: ==, != Cho trước hai toán hạng a, b có kiểu dữ liệu nguyên thủy.
- a == b a và b có bằng nhau không?, nghĩa là nếu chúng có các giá trị kiểu nguyên thủy bằng nhau thì cho kết quả đúng (true), ngược lại cho sai(false).
- a != b a và b có khác nhau không?, nghĩa là nếu chúng có các giá trị kiểu nguyên thủy không bằng nhau thì cho kết quả đúng (true),ngược lại cho sai (false).
(<boolean value> ==c)sẽ không hợp lệ nếu c có kiểu số.
int a, b, c;
a = b = c = 10;
boolean hl = a == b == c; // Sai bởi phải thực hiện a == b cho giá trị true,
// sau đó so với c (giá trị số) thì 2 đối số khác kiểu.
boolean hl1 = a == b == true; // Lại hợp lệ.
So sánh đẳng thức trên các tham chiếu đối tượng: ==, !=
- Cho trước r và s là hai biến tham chiếu. Các phép so sánh đẳng thức trên các biến tham chiếu được xác định như sau:
r == s Cho giá trị true nếu r, s cùng tham chiếu tới cùng một trị (đối tượng), ngược lại sẽ cho giá trị false.
r != s Cho giá trị true nếu r, s không cùng tham chiếu tới cùng một trị (đối tượng), ngược lại sẽ cho giá trị false.
- Hai phép toán này được sử dụng để kiểm tra xem hai biến có chỉ tới cùng một đối tượng hay không.
class SV{ String hTen; int tuoi; SV(String ht){ // Toán tử tạo lập đối tượng mới hTen = ht; } public static void main(String[] args){ SV sv1 = new SV("Lan Anh"); // Tạo ra 1 đối tượng mới SV sv2 = new SV("Lan Anh'); // Tạo ra 1 đối tượng mới SV sv3 = new SV("Tran Anh"); // Tạo ra 1 đối tượng mới boolean t1 = sv1 == sv2; // false boolean t2 = sv1 == sv3; // false SV sv4 = sv2; boolean t3 = sv4 == sv2; // true System.out.println(" t1 = " + t1); System.out.println(" t2 = " + t2); System.out.println(" t3 = " + t3); } }
- Như phần đầu chúng ta đã đề cập, các đối tượng trong chương trình trao đổi với nhau bằng cách trao đổi các thông điệp (message). Một thông điệp được cài đặt như là lời gọi hàm (phương thức) trong chương trình, gọi tới hàm thành phần của đối tượng đối tác. Những hàm tĩnh có thể gọi với tên của lớp. Các tham số trong các lời gọi hàm cung cấp cách thức trao đổi thông tin giữa đối tượng gửi và đối tượng nhận thông điệp.
- Cú pháp các lời gọi hàm có các dạng sau:
- <Tham chiếu đối tượng >.<Tên hàm> (<danh sách tham biến hiện thời>)
- <Tên lớp>. <Tên hàm tĩnh> (<danh sách tham biến hiện thời>)
- <Tên hàm> (<danh sách tham biến hiện thời>)
hinhTron.ve(); // hinhTron là đối tượng của lớp HinhTron int i = java.lang.Math.abs(-4);// Gọi đầy đủ tên của lớp Math int j = Math.abs(-4); // Gọi theo tên của lớp Math someMethod(ofValue); // Đối tượng hoặc lớp không tường minh
Hai danh sách hình thức và thực sự phải tương thích với nhau:
- Số các tham biến của danh sách hình thức phải bằng số các tham biến của danh sách thực sự. Kiểu của các tham biến thực sự phải tương thích với kiểu của tham biến hình thức tương ứng. Bảng B3.9 tóm tắt cách truyền các giá trị phụ thuộc vào kiểu của các tham biến hình thức.
Hình 8: Truyền tham số
- Trong Java, mọi tham biến đều được truyền theo tham trị (passed by value).
Truyền các giá trị kiểu nguyên thủy
- Bởi vì các biến hình thức là cục bộ trong định nghĩa của một hàm nên mọi thay đổi của biến hình thức không ảnh hưởng đến các tham biến thực sự. Các tham biến có thể là các biểu thức và chúng phải được tính trước khi truyền vào lời gọi hàm.
class KhachHang1{ // Lớp khách hàng public static void main(String[] arg){ HangSX banh = new HangSX(); // Tạo ra một đối tượng int giaBan = 20; double tien = banh.tinh(10,giaBan); System.out.println("Gia ban: " + giaBan);// giaBan không đổi System.out.println("Tien ban duoc : " + tien); } } // Lớp Hãng sản xuất class HangSX{ double tinh(int num, double gia){ gia = gia /2; return num * gia;// Thay đổi gia nhưng không ảnh hưởng tới giaBan, // nhưng số tiền vẫn bị thay đổi theo } }
Cơ chế truyền tham biến đối với các giá trị nguyên thủy có thể minh hoạ như sau:
Mô tả cơ chế truyền tham biến đối với các trị nguyên thủy.Truyền các giá trị tham chiếu đối tượng
//KhachHang2.java class KhachHang2{ // Lớp khách hàng public static void main(String[] arg){ Banh banhMoi = new Banh(); // Tạo ra một đối tượng (1) System.out.println("Nhoi thit vao banh truoc khi nuong:" + banhMoi.thit); nuong(banhMoi); // (2) System.out.println("Thit cua banh sau khi nuong:"+banhMoi.thit); } public static void nuong(Banh banhNuong){ // (3) banhNuong.thit = "Thit vit"; // Người nướng bánh đổi nhân thành thịt vit banhNuong = null; // (4) } } class Banh{ // Lớp Banh (5) String thit = "Thit ga"; // Qui định của hãng làm nhân bánh bằng thịt gà }
Truyền các tham chiếu theo mảng
Mảng (array) trong Java được xem như là đối tượng. Các phần tử của mảng có thể có kiểu nguyên thủy hoặc kiểu tham chiếu (kiểu lớp).
// Loc.java class Loc{ public static void main(String[] args){ int[] day = {8, 1, 4, 3, 2, 5};// Khởi tạo mảng day và gán trị đầu // Hiển thị các phần tử của dãy trước khi lọc for (int i = 0; i < day.length; i++) System.out.print(" " + day[i]); System.out.println(); // Xuống dòng mới int maxIndex = 0; // Lọc ra phần tử cực đại và đưa về cuối for (int index = 1; index < day.length; index++) { if (day[maxIndex] > day[index]) doiCho(day, maxIndex, index); // (1) maxIndex = index; } // Hiển thị dãy sau khi lọc for (int i = 0; i < day.length; i++) System.out.print(" " + day[i]); System.out.println(); banhNuong:Ref(Banh) banhMoi: Ref(Banh) :Banh thit = "Thit vit" Sau lời gọi hàm, giá trị của tham biến hiện thời ký hiệu cho cùng đối tượng đã bị thay đổi } public static void doiCho(int[] bang,int i, int k){ // (2) int tg = bang[i]; bang[i] = bang[k]; bang[k] = tg; } }
Các tham biến final
- Tham biến hình thức có thể khai báo với từ khóa final đứng trước. Tham biến loại này được gọi là biến cuối “trắng”, nghĩa là nó không được khởi tạo giá trị (là trắng) cho đến khi nó được gán một trị nào đó và khi đã được gán trị thì giá trị đó là cuối cùng, không thay đổi được.
//KhachHang3.java class KhachHang3{ // Lớp khách hàng public static void main(String[] arg){ HangSX banh = new HangSX(); // Tạo ra 1 đối tượng int giaBan = 20; double tien = banh.tinh(10,giaBan); System.out.println("Gia ban: "+ giaBan);// giaBan không đổi System.out.println("Tien ban duoc : " + tien); } } // Lớp Hãng sản xuất class HangSX{ double tinh(int num,final double gia){ // (1) gia = gia /2.0; // (2) return num * gia;// Thay đổi gia nhưng không ảnh hưởng tới giaBan, nhưng số tiền vẫn bị thay đổi theo } }
Các đối số của chương trình
- Giống như chương trình C, chúng ta có thể truyền các tham số cho chương trình trên dòng lệnh,
java TinhTong 12 23 45
- Chương trình java thông dịch lớp TinhTong để tính tổng các đối số 12, 23, 45.
Chương trình TinhTong có thể viết như sau:
Truyền tham số cho chương trình// TinhTong.java class TinhTong{ public static void main(String args[]){ float s = 0.0F; for (int i = 0; i < args.length; i++) s += Float.valueOf(args[i]).floatValue(); // Chuyển dãy chữ số thành số System.out.print("Tong cua " + args[0]); for (int i = 1; i < args.length; i++) System.out.print(" + " + args[i]); System.out.println(" = " + s); } }
Khi thực hiện chương trình cho kết quả
Tong cua 12 + 23 + 45 = 80.00
- Viết chương trình nhập dữ liệu từ bàn phím dưới dạng các kiểu dữ liệu khác nhau như : char, int, float, double, String. char, int, float, double, String. Hướng dẫn : Coi thêm chương trình ReadData.java với các lưu ý như sau:
- Để nhập dữ liệu cần phải có:
BufferedReader cin = new BufferedReader( new BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ));
- Nhập ký tự:
char c = cin.readLine().charAt(0); char c = cin.readLine().charAt(0);
- Nhập chuỗi ký tự:
String s = cin.readLine();
- Nhập số nguyên int, long
st = new String( cin.readLine() ); st = new String( cin.readLine() );
int i = Interger.parseInt(st); int i = Interger.parseInt(st);
long l = Long.parseLong(st); long l = Long.parseLong(st);
- Nhập số nguyên byte, short: Như kiểu int sau đó chuyển đổi kiểu đến byte và short.
- Nhập số thực float, double, luận lý boolean:
st = new String( cin.readLine() ); st = new String( cin.readLine() );
float f = new Float(st).floatValue(); float f = new Float(st).floatValue();
double d = new Double(st).doubleValue();
boolean b = new Boolean(st).booleanValue();
- Chương trình tạo dãy số nguyên ngẫu nhiên co giá trị khác nhau. ngẫu nhiên co giá trị khác nhau.