Programming - Lập Trình Giao Thức, Đường WAN Phần 3 - Pdf 19

Sưu tầm bởi:

www.daihoc.com.vn 19
 Lớp do người dùng định nghĩa (user-defined)
Định nghĩa phương thức
Hành vi của các đối tượng của một lớp được xác định bởi các phương thức của lớp đó.
Cú pháp định nghĩa phương thức
[<Phạm vi hoặc thuộc tính kiểm soát truy nhập>]<Kiểu trả về><Tên phương thức>
([<Danh sách tham biến hình thức>])[<Mệnh đề throws>]
{
<Nội dung phương thức>
}

Trong đó
<Kiểu trả về> có thể là kiểu nguyên thủy, kiểu lớp hoặc không có giá trị trả lại (kiểu void)
<Danh sách tham biến hình thức> bao gồm dãy các tham biến (kiểu và tên) phân cách
với nhau bởi dấu phẩy.
Các kiểu phạm vi hay kiểm soát truy cập
 public: Các thành phần được khai báo là public có thể được truy cập ở bất kỳ nơi
nào có thể truy cập được và chúng được thừa kế bởi các lớp con của nó.
 private: Các thành phần được khai báo là private chỉ có thể được truy cập trong
chính lớp đó
 protected: Các thành phần được khai báo là protected có thể được truy cập và
thừa kế bởi các lớp con và có thể truy xuất bởi mã lệnh của cùng gói đó.
Constructor
Constructor là một phương thức đặc biệt không có giá trị trả về và có tên trùng
với tên lớp. Trường hợp không có constructor nào được đưa ra trình biên dịch cung cấp
constructor mặc định cho lớp đó.

}
public static void main(String[] args)
{
Point p=new Point(3.0,6.0);
System.out.println("Thong tin ve toa do diem ban dau:");
p.print();
p.move(-1.5,2.0);
System.out.println("Thong tin ve toa do diem sau khi tinh tien theo vec
to:");
p.print();
}
}
C:\>java Point
Thong tin ve toa do diem ban dau:
x=3.0, y=6.0
Thong tin ve toa do diem sau khi tinh tien theo vec to:
x=1.5, y=8.0
Tham chiếu this
Thông thường, đối tượng nhận phương thức cần phải biết tham chiếu của nó.
Sưu tầm bởi:

www.daihoc.com.vn 21
Trong lớp Point có constructor
public Point(double x,double y)
{
this.x=x;
this.y=y;

www.daihoc.com.vn 22
System.out.print(" z="+z);
}
public static void main(String[] args)
{
Point3C p=new Point3C(3.0,4.5,5.0);
System.out.println("Toa do ban dau:");
p.print();
System.out.println();
p.move(-1.0,0.5,-1.0);
System.out.println("Toa do sau khi tinh tien:");
p.print();
System.out.println();

}
}
 Từ khóa super
Từ khóa super được sử dụng để gọi constructor của lớp cha hoặc truy xuất tới các
thành phần của lớp cha được che dấu bởi một thành phần của lớp con.
Ở trên ta đã xét hai đoạn mã, đoạn mã thứ nhất khai báo lớp Point2C biểu diễn một đối
tượng điểm hai chiều, đoạn mã thứ hai khai báo lớp Point3C biểu diễn một đối tượng
điểm ba chiều. Lớp Point3C được kế thừa lớp từ lớp Point2C. Lời gọi super(x,y) trong
lớp Point3C gọi tới constructor Point2C hay super.move(dx,dy) gọi tới phương thức
move(dx,dy) của lớp Point2C.
Biên dịch chương trình
C:\>javac Point3C.java
Thực thi chương trình

System.out.println("Gia tri a va b truoc khi goi phuong thuc:"+a+" "+b);
cbl.test(a,b);
System.out.println("Gia tri a va b truoc sau goi phuong thuc:"+a+" "+b);

}
}
C:\MyJava>javac CallByValue.java
C:\MyJava>java CallByValue
Gia tri a va b truoc khi goi phuong thuc:10 30
Gia tri a va b truoc sau goi phuong thuc:10 30
Tất cả các tham số đối với các phương thức Java là “gọi theo trị”. Nghĩa là, các giá trị
của các biến tham số trong một phương thức là các bản sao của các giá trị do người gọi
xác định.
Ví dụ:
class TruyenThamTri
{
public static void main(String[] args)
{
double one =1.0;
System.out.println("Truoc khi goi ham:one="+one);
Sưu tầm bởi:

www.daihoc.com.vn 24
chia(one);
System.out.println("Sau loi goi ham chia:one ="+one);

}

public static void main(String[] args)
{
Sưu tầm bởi:

www.daihoc.com.vn 25
HangSX banh = new HangSX();
int giaBan=20;
double tien = banh.tinh(10,giaBan);
System.out.println("Gia ban: "+giaBan);
System.out.println("Tien ban duoc: "+tien);

}
}
class HangSX
{
double tinh(int so, final double gia)
{
gia = gia/2.0;
return so*gia;
}
};
Khi biên dịch hàm tinh(), chương trình dịch sẽ thông báo lỗi và không được phép thay
đổi giá trị của biến final gia.
 Các đối trong chương trình
Chúng ta có thể truyền các tham số cho chương trình trên dòng lệnh
Ví dụ
class TinhTong

c.add(10,20);
c.add(40.0f,35.65f);
c.add("Good ","Morning");

}
}
class Tinh
{
public void add(int a, int b)
{
int c = a+b;
System.out.println("Phep cong hai so nguyen :"+c);
}
public void add(float a, float b)
{
float c = a+b;
System.out.println("Phep cong hai so dau phay dong :"+c);
}
public void add(String a, String b)
{
String c = a+b;
System.out.println("Phep cong hai xau :"+c);
}
};
Sưu tầm bởi:

www.daihoc.com.vn 27

System.out.println("Bien dem count="+count);
StaticVariable c2=new StaticVariable();
System.out.println("Bien dem count="+count);
StaticVariable c3=new StaticVariable();
System.out.println("Bien dem count="+count);
}
}
Sưu tầm bởi:

www.daihoc.com.vn 28
Biến count được khai báo là static nên nó chỉ có một bản sao trong mọi đối tượng, vì
vậy khi đối tượng được tạo ra thì các biến count được tăng lên 1 do trong hàm
constructor biến count được tăng lên 1.
 Phương thức static
Các phương thức được khai báo static có một số hạn chế sau:
o Chúng chỉ có thể gọi các phương thức static khác.
o Chúng chỉ truy xuất tới các dữ liệu static
o Chúng không thể tham chiếu tới this và super
Ví dụ
class StaticMethod
{
public static void main(){
System.out.println("Hello");
}
public static void main(String[] args)
{
main();

Vì khối static luôn được xử lý trước nên kết quả in ra của chương trình trên sẽ là:
Khoi static 1
Hello World!
Khoi static 2

2.4.6. Các thành phần final
 Biến final
Một biến được khai báo final. Làm như vậy sẽ ngăn ngừa nội dung của biến bị sửa đổi.
Điều này nghĩa là ta phải khai báo một biến final khi nó được khai báo.
Ví dụ
final double pi=3.1416;
 Sử dụng final với thừa kế
Mặc dù nạp chồng phương thức là một trong các đặc trưng mạnh của Java, nhưng sẽ
có những lúc ta cần ngăn ngừa điều này xảy ra. Để không cho phép một phương thức
được nạp chồng, xác định từ khóa final như là một bổ từ tại đầu mỗi khai báo của nó.
Các phương thức được khai báo là final không thể được nạp chồng.
Ví dụ
class A {
final void method(){
}
}
class B extends A{
final void method(){
}
}
Khai báo lớp B có lỗi, vì ở lớp A, phương thức method đã được khai báo với từ khóa
final nên nó không thể được nạp chồng trong lớp B.
Sử dụng từ khóa final để cấm thừa kế
Đôi khi ta cần cấm một số lớp không có lớp con. Ta có thể thực hiện điều này bằng
cách khai báo lớp với từ khóa final.

return Math.PI*r*r;
}
public double chuvi()
{
return Math.PI*2*r;
}
}
class HinhChuNhat extends Hinh2D
{
public HinhChuNhat(double a,double b)
{
this.a=a;
this.b=b;
Sưu tầm bởi:

www.daihoc.com.vn 31
}
public double dientich()
{
return a*b;
}
public double chuvi()
{
return (a+b)*2;
}
}
class AbstractDemo

Thừa kế đóng một vai trò rất quan trọng trong việc tiết kiệm thời gian và công sức của
người lập trình. Hầu hết các chương trình trong thực tế đều sử dụng đa thừa kế. Trong
đa thừa kế, chúng ta có thể thừa kế các phương thức và thuộc tính từ một số lớp khác
nhau. Java không hỗ trợ đa thừa kế. Tuy nhiên, nhận thấy tầm quan trọng của đa thừa
kế trong Java, Java đã đưa ra khái niệm interface. Với giao tiếp ta có thể xác định một
lớp phải làm gì nhưng không xác định cách làm thế nào.
 Định nghĩa
Một giao tiếp là một tập hợp các định nghĩa phương thức (không có cài đặt). Một giao
tiếp cũng có thể định nghĩa các hằng.
Ta cũng có thể đặt câu hỏi vậy giao tiếp khác gì so với các lớp trừu tượng? Dưới đây là
những sự khác biệt giữa giao tiếp và các lớp trừu tượng:
o Một giao tiếp không thể thực thi bất kỳ phương thức nào, ngược lại
một lớp trừu tượng có thể thực thi một số phương thức nào đó.
o Một lớp có thể thực thi nhiều giao tiếp nhưng một lớp chỉ có một lớp
cha.
o Một giao tiếp không phải là bộ phận của sơ đồ phân cấp lớp, các lớp
có thể thực thi cùng một giao tiếp.
 Khai báo một giao tiếp
Cú pháp chung khi khai báo một giao tiếp là
public interface InterfaceName extends SuperInterfaces
{
//Thân giao tiếp
}
Hai thành phần bắt buộc trong một khai báo giao tiếp là-từ khóa interface và tên của
giao tiếp. Từ khóa bổ trợ truy xuất là public chỉ ra rằng giao tiếp có thể được sử dụng
bởi bất kỳ lớp nào bất kỳ gói nào. Nếu không xác định giao tiếp là public thì giao tiếp sẽ
chỉ có thể truy xuất bởi các lớp được định nghĩa trong cùng gói với giao tiếp.
Một khai báo giao tiếp có thể có một thành phần khác: danh sách các giao tiếp cha. Một
giao tiếp có thể thừa kế các giao tiếp khác, giống như một lớp có thể thừa kế hoặc là
lớp của lớp khác. Danh sách các giao tiếp cha được phân cách bởi dấu phẩy.

Chú ý: Mệnh đề implements đứng sau mệnh đề extends nếu tồn tại mệnh đề extends.
class CalculatorTest implements CalculatorInterface
{
public double add(double x, double y)
{
return x+y;
}
public double sub(double x, double y)
{
return x-y;
}
public double mul(double x, double y)
{
return x*y;
}
public double div(double x, double y)
{return x/y;

}

public static void main(String[] args) throws Exception
{
CalculatorInterface cal=new CalculatorTest();
if(args.length!=2)
{
Sưu tầm bởi:

www.daihoc.com.vn
MyInterface mi;
2.7. Các gói và sử dụng gói trong Java
Các gói có các thành phần là các lớp, các interface, và các gói con có liên quan với
nhau. Việc tổ chức thành các gói có một số lợi ích sau đây:
o Các gói cho phép ta tổ chức các lớp thành các đơn vị nhỏ hơn (như
các thư mục), và giúp cho việc định vị và sử dụng các lớp tương ứng
trở nên dễ dàng hơn.
o Tránh được các vấn đề về xung đột tên.
o Cho phép ta bảo vệ các lớp, dữ liệu và các phương thức theo một
quy mô lớn hơn so với phạm vi lớp.
Sưu tầm bởi:

www.daihoc.com.vn 35
o Các tên gói có thể được sử dụng để định danh các lớp của bạn.
 Truy xuất tới các thành phần của gói trong Java
Để truy xuất tới thành phần của gói trong Java ta có thể sử dụng cú pháp sau:
MyPackage.MyClass
MyPackage là tên gói, MyClass là tên lớp nằm trong gói MyPackage.
 Khai báo các gói trong chương trình
Để có thể sử dụng các thành phần của một gói trong chương trình Java, ta cần phải
khai báo gói cụ thể chứa lớp đó:
import ten_goi.*;// ten_goi: tên gói
Với khai báo như trên, ta có thể truy xuất tới tất cả các lớp, các interface nằm trong gói
đó. Để khai báo sử dụng một lớp cụ thể trong chương trình ta khai báo dòng lệnh sau:
import ten_goi.ten_lop; // ten_lop: tên lớp
Giả sử ta có gói MyPackge, bên trong gói MyPackage lại có một số gói con như
SubPackage1, SubPackage2, ta có thể khai báo sử dụng các thành phần trong gói con


}
Bước 2: Biên dịch
C:\>javac -d C:\MyJava Calculator.java
Một vài điều cần lưu ý khi khai báo các thành viên của gói.
Thứ nhất, các thành phần của gói cần được khai báo với thuộc tính public, nếu cần truy
xuất chúng từ bên ngoài.
2.6. Quản lý ngoại lệ (Exception Handling)
 Khái niệm
Trong quá trình xử lý, các ứng dụng có thể bất ngờ gặp các lỗi với các mức độ nghiêm
trọng khác nhau. Khi một phương thức tác động trên một đối tượng, đối tượng có thể
phát hiện các vấn đề trạng thái bên trong (chẳng hạn các giá trị không nhất quán, như
lỗi chia 0), phát hiện các lỗi với các đối tượng hay dữ liệu mà nó thao tác (như file hay
địa chỉ mạng) xác định nó vi phạm các qui tắc cơ bản (như đọc dữ liệu từ một luồng đã
bị đóng), Rất nhiều người lập trình không thể kiểm tra tất cả các trạng thái lỗi có thể
xảy ra.
Exception cung cấp một cách để kiểm tra các lỗi mà không chia cắt mã. Exception cũng
đưa ra một cơ chế báo lỗi một cách trực tiếp chứ không sử dụng các cờ hay các hiệu
ứng phụ.

 Các ngoại lệ trong Java
Trong Java có một lớp Exception, mọi lớp ngoại lệ là lớp con của lớp này. Lớp
Exception là lớp con của lớp Throwable


stmt2;
try{
stmt3;
stmt4;
}
catch(Exception e)
{
}
}
catch(Exception e)
{
}
Khi các khối try được lồng nhau, khối try bên trong được xử lý trước và một ngoại lệ
được đưa ra trong khối đó được đón bắt trong các khối try catch con. Nếu khối catch
bên trong không thỏa mãn thì các khối try bên ngoài được kiểm tra. Nếu một khối catch
phù hợp được tìm thấy, thì ngoại lệ được quản lý trong khối đó ngược lại thì môi trường
Java Runtime quản lý ngoại lệ.

try
{
doFileProcessing();
Sưu tầm bởi:

www.daihoc.com.vn 38
displayResults();
}
catch(Exception e)

System.out.println("x="+x);
}
Sưu tầm bởi:

www.daihoc.com.vn 39
catch(ArithmeticException e)
{
System.out.println("Khong the chia cho 0");
System.err.println(e);
}
}
}
Kết quả 1
C:\MyJava\Baitap>java TryCatch 18 9
x=2
Kết quả 2
C:\MyJava\Baitap>java TryCatch 9 0
Khong the chia cho 0
java.lang.ArithmeticException: / by zero
 Khối finally
Khối finally là khối mà chúng ta thấy các lệnh trả về các tài nguyên cho hệ thống và các
lệnh khác để in ra bất kỳ thông báo nào.
Các lệnh trong khối finanally có thể là:
o Đóng một file.
o Đóng một resultset (Lập trình cơ sở dữ liệu).
o Ngắt liên kết được thiết lập với cơ sở dữ liệu.


System.out.println(e);
}
}
void checkSize() throws ArraySizeException
{
if(size<0) throw new ArraySizeException();
a= new int[3];
for(int i=0;i<3;i++)a[i]=i+1;
}

public static void main(String[] args)
{
new ThrowDemo(Integer.parseInt(args[0]));
}
}
Kết quả thực hiện chương trình
C:\MyJava\Baitap>java ThrowDemo -1
ArraySizeException: Nhap kich thuoc mang khong hop le
Giải thích:
Chúng ta đã tạo ra một lớp có tên ArraySizeException, lớp này là lớp con của lớp
NegativeArraySizeException. Bằng cách tạo ra một đối tượng của lớp này, chúng ta đã
in ra thông báo ngoại lệ. Phương thức checkSize() có thể đưa ra ngoại lệ
ArraySizeException. không có ngoại lệ có ngoại lệ


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status