Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
244,58 KB
Nội dung
Lớp người dùng định nghĩa (user-defined) Định nghĩa phương thức Hành vi đối tượng lớp xác định phương thức lớp Cú pháp định nghĩa phương thức [] ([])[] { } Trong kiểu ngun thủy, kiểu lớp khơng có giá trị trả lại (kiểu void) bao gồm dãy tham biến (kiểu tên) phân cách vớ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 khai báo public truy cập nơi truy cập chúng thừa kế lớp private: Các thành phần khai báo private truy cập lớp protected: Các thành phần khai báo protected truy cập thừa kế lớp truy xuất mã lệnh gói Constructor Constructor phương thức đặc biệt khơng có giá trị trả có tên trùng với tên lớp Trường hợp khơng có constructor đưa trình biên dịch cung cấp constructor mặc định cho lớp Một đối tượng tạo cho trước giá trị khởi đầu Các trường khởi tạo giá trị chúng khai báo, điều đủ để đảm bảo trạng thái khởi đầu đắn Các phương thức Các phương thức lớp thường chứa mã hiểu thao tác trạng thái đối tượng Một số lớp có trường public để người lập trình thao tác trực tiếp, hầu hết trường hợp điều ý tưởng tốt public class Point 19 Sưu t m b i: www.daihoc.com.vn { protected double x,y; public Point(double x,double y) { this.x=x; this.y=y; } public void move(double dx, double dy) { x=x+dx; y=y+dy; } public void print() { System.out.println("x="+x+", y="+y); } public static void main(String[] args) { Point p=new Point(3.0,6.0); System.out.println("Thong tin ve toa diem ban dau:"); p.print(); p.move(-1.5,2.0); System.out.println("Thong tin ve toa diem sau tinh tien theo vec to:"); p.print(); } } C:\>java Point Thong tin ve toa diem ban dau: x=3.0, y=6.0 Thong tin ve toa diem sau 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 20 Sưu t m b i: www.daihoc.com.vn Trong lớp Point có constructor public Point(double x,double y) { this.x=x; this.y=y; } Giả sử sửa đổi constructor cách thay đổi sau: public Point(double x,double y) { x=x; y=y; } Khi biên dịch chương trình báo lỗi có nhập nhằng lệnh gán Tham chiếu this khắc phục điều này, this.x this.y muốn đề cập tới trường thơng tin lớp Point cịn x, y tham biến truyền vào constructor 2.4.2 Thừa kế Java class Point3C extends Point2C { protected double z; public Point3C(double x, double y, double z) { super(x,y); this.z=z; } public void move(double dx, double dy, double dz) { super.move(dx,dy); z+=dz; } public void print() { super.print(); 21 Sưu t m b i: www.daihoc.com.vn 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 ban dau:"); p.print(); System.out.println(); p.move(-1.0,0.5,-1.0); System.out.println("Toa sau tinh tien:"); p.print(); System.out.println(); } } Từ khóa super Từ khóa super sử dụng để gọi constructor lớp cha truy xuất tới thành phần lớp cha che dấu thành phần lớp Ở ta xét hai đoạn mã, đoạn mã thứ khai báo lớp Point2C biểu diễn đối tượng điểm hai chiều, đoạn mã thứ hai khai báo lớp Point3C biểu diễn đối tượng điểm ba chiều Lớp Point3C kế thừa lớp từ lớp Point2C Lời gọi super(x,y) 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) lớp Point2C Biên dịch chương trình C:\>javac Point3C.java Thực thi chương trình C:\>java Point3C Kết chương trình Toa ban dau: x=3.0, y=4.5 z=5.0 Toa sau tinh tien: x=2.0, y=5.0 z=4.0 2.4.3 Truyền tham số Java 22 Sưu t m b i: www.daihoc.com.vn Thông thường, ngôn ngữ lập trình thường có hai cách truyền tham biến cho thủ tục: truyền theo tham trị truyền theo tham chiếu Truyền theo tham trị Phương thức chép giá trị tham biến vào tham biến hình thức thủ tục Vì vậy, thay đổi tham số thủ tục không ảnh hưởng tới tham số thực class CallByValue { void test(int i,int j) { i*=2; j*=2; } public static void main(String[] args) { CallByValue cbl=new CallByValue(); int a=10, b=30; System.out.println("Gia tri a va b truoc 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 goi phuong thuc:10 30 Gia tri a va b truoc sau goi phuong thuc:10 30 Tất tham số phương thức Java “gọi theo trị” Nghĩa là, giá trị biến tham số phương thức giá trị 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 goi ham:one="+one); 23 Sưu t m b i: www.daihoc.com.vn chia(one); System.out.println("Sau loi goi ham chia:one ="+one); } public static void chia(double x) { x/=2.0; System.out.println("Sau chia:x="+x); } } C:\MyJava\Baitap>java TruyenThamTri Truoc goi ham:one=1.0 Sau chia:x=0.5 Sau loi goi ham chia:one =1.0 Truyền theo tham chiếu Một tham chiếu tới tham biến truyền cho tham số Bên thủ tục, tham chiếu sử dụng để truy xuất tới tham số thực xác định lời gọi Điều nghĩa thay đổi tham biến ảnh hưởng tới tham số sử dụng để gọi phương thức Mảng Java xem đối tượng Các phần tử mảng có kiểu nguyên thủy kiểu tham chiếu (kiểu lớp) Ví dụ: Lọc phần tử lớn mảng đưa cuối mảng C:\MyJava\Baitap>java Loc 814325 143258 Vì Java lời gọi hàm thực theo tham trị (call by value) với kiểu nguyên tố tham chiếu kiểu lớp nên hàm doiCho() thay đổi phần tử day Các tham biến final Tham biến hình thức khai báo với từ khóa final đứng trước Tham biến final tham biến không khởi tạo giá trị gán trị gán trị khơng thể thay đối giá trị Ví dụ class BienFinal { public static void main(String[] args) { 24 Sưu t m b i: www.daihoc.com.vn 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 thông báo lỗi không phép thay đổi giá trị biến final gia Các đối chương trình Chúng ta truyền tham số cho chương trình dịng lệnh Ví dụ class TinhTong { public static void main(String[] args) { float s=0.0f; for(int i=0; ijava TinhTong 12 34 56 Tong cua day so la 102.0 25 Sưu t m b i: www.daihoc.com.vn 2.4.4 Đa hình Java Các phương thức nạp chồng (overloaded method) Các phương thức nạp chồng phương thức nằm lớp có tên khác danh sách tham số Các phương thức nạp chồng dạng tính đa hình thời gian biên dịch Ví dụ class TinhToan { public static void main(String[] args) { Tinh c = new Tinh(); 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); } }; 26 Sưu t m b i: www.daihoc.com.vn Kết quả: C:\MyJava\Baitap>java TinhToan Phep cong hai so nguyen :30 Phep cong hai so dau phay dong :75.65 Phep cong hai xau :Good Morning Giải thích: Trong chương trình phương thức add() phương thức nạp chồng Có ba phương thức có tên add() có tham số khác Khi gọi phương thức add()…???? 2.4.5 Các thành phần static Đôi thành phần static ta cần phải định nghĩa thành phần lớp sử dụng độc lập với đối tượng lớp Thông thường thành phần lớp phải truy xuất thông qua đối tượng lớp Tuy nhiên, ta có thể tạo thành phần mà sử dụng độc lập Để tạo thành phần trước khai báo thành phần ta đặt từ khóa static Khi thành phần khai báo static, truy xuất trước đối tượng tạo không cần tham chiếu tới đối tượng Các thành phần static bao gồm: biến static, phương thức static, khối static Biến static Biến static biến tổng thể Khi đối tượng lớp khai báo, khơng có biến đối tượng tạo Thay vào đó, tất đối tượng chung biến static Ví dụ biến static class StaticVariable { static int count=20; StaticVariable(){ count++; } public static void main(String[] args) { StaticVariable c1=new StaticVariable(); 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); } } 27 Sưu t m b i: www.daihoc.com.vn Biến count khai báo static nên có đối tượng, đối tượng tạo biến count tăng lên hàm constructor biến count tăng lên Phương thức static Các phương thức khai báo static có số hạn chế sau: o Chúng gọi phương thức static khác o Chúng truy xuất tới liệu static o Chúng khơng thể tham chiếu tới this super Ví dụ class StaticMethod { public static void main(){ System.out.println("Hello"); } public static void main(String[] args) { main(); System.out.println("Hello World!"); } } Trong ví dụ ta thấy khai báo hai phương thức main phương thức tĩnh Phương thức main gọi tới phương thức main khác Khối static Nếu cần tính tốn để khởi tạo biến static, ta khai báo khối static để xử lý tức thời lớp lần tải vào nhớ Các khối static ln xử lý trước Ví dụ class StaticDemo { static{ System.out.println("Khoi static 1"); } public static void main(String[] args) { System.out.println("Hello World!"); 28 Sưu t m b i: www.daihoc.com.vn } static { System.out.println("Khoi static 2"); } } Vì khối static xử lý trước nên kết in chương trình là: Khoi static Hello World! Khoi static 2.4.6 Các thành phần final Biến final Một biến khai báo final Làm ngăn ngừa nội dung biến bị sửa đổi Điều nghĩa ta phải khai báo biến final 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 đặc trưng mạnh Java, có lúc ta cần ngăn ngừa điều xảy Để không cho phép phương thức nạp chồng, xác định từ khóa final bổ từ đầu khai báo Các phương thức khai báo final khơng thể 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, lớp A, phương thức method khai báo với từ khóa final nên nạp chồng lớp B Sử dụng từ khóa final để cấm thừa kế Đơi ta cần cấm số lớp khơng có lớp Ta thực điều cách khai báo lớp với từ khóa final Ví dụ 29 Sưu t m b i: www.daihoc.com.vn final class A { } Lúc này, lớp khác thừa kế từ lớp A 2.5 Các lớp trừu tượng Trong lập trình Java, có lúc ta cần định nghĩa lớp cha khai báo cấu trúc cách khái quát mà không cài đặt cụ thể cho phương thức Các lớp cha định nghĩa dạng tổng quát hóa dùng chung lớp nó, việc cài đặt chi tiết phương thức thực lớp cụ thể Ví dụ: abstract class Hinh2D { double a,b,r; public abstract double dientich(); public abstract double chuvi(); } class HinhTron extends Hinh2D { public HinhTron(double r) { this.r=r; } public double dientich() { 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; 30 Sưu t m b i: www.daihoc.com.vn } public double dientich() { return a*b; } public double chuvi() { return (a+b)*2; } } class AbstractDemo { public static void main(String args[]) { Hinh2D ht=new HinhTron(1); System.out.println("Dien tich hinh tron ban kinh 1.0 la:"+ht.dientich()); System.out.println("Chu vi hinh tron ban kinh 1.0 la:"+ht.chuvi()); Hinh2D hcn=new HinhChuNhat(3,4); System.out.println("Dien tich hinh chu nhat la:"+hcn.dientich()); System.out.println("Chu vi hinh chu nhat la "+hcn.chuvi()); } }; Kết thực chương trình C:\MyJava>java AbstractDemo Dien tich hinh tron ban kinh 1.0 la:3.141592653589793 Chu vi hinh tron ban kinh 1.0 la:6.283185307179586 Dien tich hinh chu nhat la:12.0 Chu vi hinh chu nhat la 14.0 Trong chương trình ta khai báo lớp trừu tượng Hinh2D, lớp có phương thức trừu tượng dientich() để tính diện tích hình lớp chuvi() để tính chu vi Các lớp trừu tượng không cài đặt mã lệnh Các lớp HinhTron HinhChuNhat lớp cụ thể lớp trừu tượng Hinh2D Các lớp cài đặt phương thức tính diện tích chu vi cụ thể 2.6 Giao tiếp (Interface) 31 Sưu t m b i: www.daihoc.com.vn Thừa kế đóng vai trò quan trọng việc tiết kiệm thời gian cơng sức người lập trình Hầu hết chương trình thực tế sử dụng đa thừa kế Trong đa thừa kế, thừa kế phương thức thuộc tính từ số lớp khác Java không hỗ trợ đa thừa kế Tuy nhiên, nhận thấy tầm quan trọng đa thừa kế Java, Java đưa khái niệm interface Với giao tiếp ta xác định lớp phải làm khơng xác định cách làm Định nghĩa Một giao tiếp tập hợp định nghĩa phương thức (khơng có cài đặt) Một giao tiếp định nghĩa Ta đặt câu hỏi giao tiếp khác so với lớp trừu tượng? Dưới khác biệt giao tiếp lớp trừu tượng: Một giao tiếp thực thi phương thức nào, ngược lại lớp trừu tượng thực thi số phương thức o Một lớp thực thi nhiều giao tiếp lớp có lớp cha o Một giao tiếp phận sơ đồ phân cấp lớp, lớp thực thi giao tiếp Khai báo giao tiếp o Cú pháp chung khai báo giao tiếp public interface InterfaceName extends SuperInterfaces { //Thân giao tiếp } Hai thành phần bắt buộc khai báo giao tiếp là-từ khóa interface tên giao tiếp Từ khóa bổ trợ truy xuất public giao tiếp sử dụng lớp gói Nếu khơng xác định giao tiếp public giao tiếp truy xuất lớp định nghĩa gói với giao tiếp Một khai báo giao tiếp có thành phần khác: danh sách giao tiếp cha Một giao tiếp thừa kế giao tiếp khác, giống lớp thừa kế lớp lớp khác Danh sách giao tiếp cha phân cách dấu phẩy Thân giao tiếp Thân giao tiếp chứa khai báo phương thức cho tất phương thức có giao tiếp Một khai báo phương thức giao tiếp kết thúc dấu chấm phẩy (;) giao tiếp không cung cấp cách cài đặt cho phương thức khai báo Một giao tiếp chứa khai báo ngồi khai báo phương thức Các khai báo thành phần giao tiếp không phép sử dụng số từ khóa bổ trợ private, protected transient, volatile, synchronized khai báo thành phần giao tiếp Trong ví dụ sau ta tìm hiểu cách định nghĩa giao tiếp cách thực thi giao tiếp public interface CalculatorInterface { 32 Sưu t m b i: www.daihoc.com.vn public double add(double x, double y); public double sub(double x, double y); public double mul(double x, double y); public double div(double x, double y); } Thực thi giao tiếp Một giao tiếp định nghĩa tập hợp hợp quy ước hành vi Một lớp thực thi giao tiếp tuân theo quy ước khai báo giao tiếp Để khai báo lớp thực thi giao tiếp, ta đưa vào mệnh đề implements khai báo lớp Một lớp thực thi nhiều giao tiếp (Java hỗ trợ đa thừa kế giao tiếp), sau từ khóa implements danh sách giao tiếp thực thi lớp Chú ý: Mệnh đề implements đứng sau mệnh đề extends tồn 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) { 33 Sưu t m b i: www.daihoc.com.vn System.out.println("Cach chay chuong trinh: java CalculatorImpl so1 so2"); return; } else { double x,y,z; x=Double.parseDouble(args[0]); y=Double.parseDouble(args[1]); System.out.println(x+"+"+y+"="+cal.add(x,y)); System.out.println(x+"-"+y+"="+cal.sub(x,y)); System.out.println(x+"*"+y+"="+cal.mul(x,y)); System.out.println(x+"/"+y+"="+cal.div(x,y)); } } } Kết thực chương trình C:\MyJava>java CalculatorTest 12 12.0+3.0=15.0 12.0-3.0=9.0 12.0*3.0=36.0 12.0/3.0=4.0 Sử dụng giao tiếp kiểu Khi ta định nghĩa giao tiếp mới, ta định nghĩa kiểu liệu tham chiếu Giao tiếp sử dụng khai báo biến tham chiếu Giả sử MyInterface giao tiếp ta khai báo sau: MyInterface mi; 2.7 Các gói sử dụng gói Java Các gói có thành phần lớp, interface, gói có liên quan với Việc tổ chức thành gói có số lợi ích sau đây: o o o Các gói cho phép ta tổ chức lớp thành đơn vị nhỏ (như thư mục), giúp cho việc định vị sử dụng lớp tương ứng trở nên dễ dàng Tránh vấn đề xung đột tên Cho phép ta bảo vệ lớp, liệu phương thức theo quy mô lớn so với phạm vi lớp 34 Sưu t m b i: www.daihoc.com.vn o Các tên gói sử dụng để định danh lớp bạn Truy xuất tới thành phần gói Java Để truy xuất tới thành phần gói Java ta sử dụng cú pháp sau: MyPackage.MyClass MyPackage tên gói, MyClass tên lớp nằm gói MyPackage Khai báo gói chương trình Để sử dụng thành phần gói 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 trên, ta truy xuất tới tất lớp, interface nằm gói Để khai báo sử dụng lớp cụ thể 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 gói MyPackage lại có số gói SubPackage1, SubPackage2, ta khai báo sử dụng thành phần gói SubPackage1 sau: import MyPackage.SubPackage1.*; Cách tạo gói Java Bước 1: Khai báo gói Java Giả sử ta khai báo gói có tên mypackage, bên gói có lớp Calculator package mypackage; public class Calculator { public double cong(double a,double b) { return a+b; } public double nhan(double a, double b) { return a*b; } public double tru(double a,double b) { return a-b; } public double chia(double a,double b) throws Exception { 35 Sưu t m b i: www.daihoc.com.vn return a/b; } } Bước 2: Biên dịch C:\>javac -d C:\MyJava Calculator.java Một vài điều cần lưu ý khai báo thành viên gói Thứ nhất, thành phần gói cần khai báo với thuộc tính public, cần truy xuất chúng từ bên 2.6 Quản lý ngoại lệ (Exception Handling) Khái niệm Trong trình xử lý, ứng dụng bất ngờ gặp lỗi với mức độ nghiêm trọng khác Khi phương thức tác động đối tượng, đối tượng phát vấn đề trạng thái bên (chẳng hạn giá trị không quán, lỗi chia 0), phát lỗi với đối tượng hay liệu mà thao tác (như file hay địa mạng) xác định vi phạm qui tắc (như đọc liệu từ luồng bị đóng), Rất nhiều người lập trình khơng thể kiểm tra tất trạng thái lỗi xảy Exception cung cấp cách để kiểm tra lỗi mà không chia cắt mã Exception đưa chế báo lỗi cách trực tiếp không sử dụng cờ hay hiệu ứng phụ Các ngoại lệ Java Trong Java có lớp Exception, lớp ngoại lệ lớp lớp Lớp Exception lớp lớp Throwable Throwable Exception 36 Sưu t m b i: www.daihoc.com.vn Hình 2.7 Lớp Throwable chứa xâu sử dụng để mô tả ngoại lệ Ngoại lệ phân thành hai loại: Ngoại lệ kiểm tra (checked exception) ngoại lệ không kiểm tra (unchecked exception) Ngoại lệ kiểm tra ngoại lệ mà trình biên dịch kiểm tra phương thức người lập trình đưa ngoại lệ chúng thông báo để đưa Ngoại lệ không kiểm tra lớp lớp Error; RuntimeException Java cung cấp mơ hình quản lý ngoại lệ cho phép kiểm tra lỗi vị trí có liên quan Khối try catch Cú pháp o Khối try Bao gồm tập hợp lệnh phát sinh ngoại lệ xử lý Một phương thức, đưa ngoại lệ đặt try Các khối try lồng try{ stmt1; stmt2; try{ stmt3; stmt4; } catch(Exception e) { } } catch(Exception e) { } Khi khối try lồng nhau, khối try bên xử lý trước ngoại lệ đưa khối đón bắt khối try catch Nếu khối catch bên khơng thỏa mãn khối try bên kiểm tra Nếu khối catch phù hợp tìm thấy, ngoại lệ quản lý khối ngược lại mơi trường Java Runtime quản lý ngoại lệ try { doFileProcessing(); 37 Sưu t m b i: www.daihoc.com.vn displayResults(); } catch(Exception e) { System er.println(e.getMessage()); } Bất kỳ lỗi xảy trình xử lý doFileProcessing() hay displayResult() đựơc đón bắt khối catch xử lý Nếu có lỗi xảy trình xử lý doFileProcessing(), phương thức displayResult() không gọi, khối catch xử lý Một khối try có nhiều khối catch xử lý kiểu khác try { } catch(Exception e) { } catch(Exception e) { } finally { //Thực công việc thu dọn } Ví dụ: class TryCatch { public static void main(String[] args) {int x,y; try{ x=Integer.parseInt(args[0]); y=Integer.parseInt(args[1]); x=x/y; System.out.println("x="+x); } 38 Sưu t m b i: www.daihoc.com.vn catch(ArithmeticException e) { System.out.println("Khong the chia cho 0"); System.err.println(e); } } } Kết C:\MyJava\Baitap>java TryCatch 18 x=2 Kết C:\MyJava\Baitap>java TryCatch Khong the chia cho java.lang.ArithmeticException: / by zero Khối finally Khối finally khối mà thấy lệnh trả tài nguyên cho hệ thống lệnh khác để in thơng báo Các lệnh khối finanally là: o Đóng file o Đóng resultset (Lập trình sở liệu) o Ngắt liên kết thiết lập với sở liệu … Khối finally ln xử lý dù ngoại lệ có xảy hay không Mệnh đề throw Các ngoại lệ đưa cách sử dụng lệnh throw, nhận đối tượng làm tham số, đối tượng thuộc lớp lớp lớp Throwable Ví dụ: class ArraySizeException extends NegativeArraySizeException { ArraySizeException() { super("Nhap kich thuoc mang khong hop le"); } } 39 Sưu t m b i: www.daihoc.com.vn class ThrowDemo { int size, a[]; ThrowDemo(int s) { size =s; try{ checkSize(); } catch(ArraySizeException e) { System.out.println(e); } } void checkSize() throws ArraySizeException { if(size