1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình hướng đối tượng: Chương 4.1 - ĐH Bách Khoa Hà Nội

22 9 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Bài giảng Lập trình hướng đối tượng: Chương 4.1 Các kỹ thuật xây dựng lớp và sử dụng đối tượng với mục tiêu giúp các bạn nêu được bản chất, vai trò và biết sử dụng kỹ thuật chồng phương thức, chồng phương thức khởi tạo; Thành viên đối tượng, thành viên lớp; Hiểu về cách thức quản lý bộ nhớ và đối tượng trong Java; Nắm về cách thức truyền tham số phương thức; Biết cách sử dụng package, một số lớp tiện ích trong Java: Wrapper class, Math, System, String vs. StringBuffer.

9/18/17 Mục tiêu học n Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội n n LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 04 Các kỹ thuật xây dựng lớp sử dụng đối tượng n n Nêu chất, vai trò biết sử dụng kỹ thuật chồng phương thức, chồng phương thức khởi tạo Thành viên đối tượng, thành viên lớp Hiểu cách thức quản lý nhớ đối tượng Java Nắm cách thức truyền tham số phương thức Biết cách sử dụng package, số lớp tiện ích Java: Wrapper class, Math, System, String vs StringBuffer Nội dung Nội dung Chồng phương thức Thành viên ĐT thành viên lớp Quản lý nhớ Java Truyền tham số cho phương thức Một số lớp tiện ích Java Chồng phương thức Thành viên ĐT thành viên lớp Quản lý nhớ Java Truyền tham số cho phương thức Một số lớp tiện ích Java 9/18/17 Nhắc lại phương thức n n 1.1 Chồng phương thức Mỗi phương thức phải có chữ ký riêng Chữ ký phương thức bao gồm: n n n Tên phương thức Số lượng đối số kiểu chúng Chồng phương thức (Method Overloading): Các phương thức lớp trùng tên chữ ký phải khác nhau: n n n Số lượng tham số khác Nếu số lượng tham số kiểu liệu tham số phải khác Mục đích: n n Tên trùng để mơ tả chất cơng việc Thuận tiện cho lập trình khơng cần phải nhớ nhiều tên phương thức mà cần nhớ tên lựa chọn tham số cho phù hợp 1.1 Chồng phương thức (2) n 1.1 Chồng phương thức (3) Ví dụ 1: n n n Phương thức println() System.out.println() có 10 khai báo với tham số khác nhau: boolean, char[], char, double, float, int, long, Object, String, khơng có tham số Không cần sử dụng tên khác (chẳng hạn "printString“ "printDouble“) cho kiểu liệu muốn hiển thị Ví dụ 2: class MyDate { int year, month, day; public boolean setMonth(int m) { …} public boolean setMonth(String s) { …} } public class Test{ public static void main(String args[]){ MyDate d = new MyDate(); d.setMonth(9); d.setMonth(”September”); } } 9/18/17 Thảo luận Một số ý với chồng phương thức n n n Các phương thức xem xét chồng chúng thuộc lớp Chỉ nên sử dụng kỹ thuật với phương thức có mục đích, chức năng; tránh lạm dụng Khi dịch, trình dịch vào số lượng kiểu liệu tham số để định gọi phương thức phù hợp Nếu không chọn chọn nhiều phương thức báo lỗi n n Cho phương thức sau đây: public double test(String a, int b) Hãy chọn phương thức chồng cho phương thức trên: 10 Thảo luận void void void void void void void void n n n n n Thảo luận prt(String s) { System.out.println(s); } f1(char x) { prt("f1(char)"); } f1(byte x) { prt("f1(byte)"); } f1(short x) { prt("f1(short)"); } f1(int x) { prt("f1(int)"); } f1(long x) { prt("f1(long)"); } f1(float x) { prt("f1(float)"); } f1(double x) { prt("f1(double)"); } Điều xảy thực hiện: f1(5); char x=‘a’; f1(x); byte y=0; f1(y); float z = 0; f1(z);… void test(String b, int a) public double test(String a) private int test(int b, String a) private int test(String a, int b) double test(double a, int b) double test(int b) public double test(String a, long b) void void void void void n Điều xảy thực hiện: n n int n n n 11 prt(String s) { System.out.println(s); } f2(short x) { prt("f3(short)"); } f2(int x) { prt("f3(int)"); } f2(long x) { prt("f5(long)"); } f2(float x) { prt("f5(float)"); } f2(5); char x=‘a’; f2(x); byte y=0; f2(y); float z = 0; f2(z); Điều xảy gọi f2(5.5)? Error: cannot find symbol: method f2(double) 12 9/18/17 1.2 Chồng phương thức khởi tạo n n Trong nhiều tình khác cần khởi tạo đối tượng theo nhiều cách khác Cần xây dựng phương thức khởi tạo khác cho đối tượng theo nguyên lý chồng phương thức (constructor overloading) 13 1.3 Từ khóa this n n Nhắc lại: Tự tham chiếu đến đối tượng tại, sử dụng bên lớp tương ứng với đối tượng muốn tham chiếu Sử dụng thuộc tính phương thức đối tượng thơng qua tốn tử “.”, ví dụ: Gọi đến phương thức khởi tạo khác lớp: n this(danh_sach_tham_so); //neu co tham so public class BankAccount{ private String owner; private double balance; public BankAccount(){owner = “noname”;} public BankAccount(String o, double b){ owner = o; balance = b; } } public class Test{ public static void main(String args[]){ BankAccount acc1 = new BankAccount(); BankAccount acc2 = new BankAccount(“Thuy”, 100); } } 14 Ví dụ public class BankAccount{ private String owner; public void setOwner(String owner){ this.owner = owner; } public BankAccount() { this.setOwner(“noname”); } … } n Ví dụ 15 public class Ship { private double x=0.0, y=0.0 private double speed=1.0, direction=0.0; public String name; public Ship(String name) { this.name = name; } public Ship(String name, double x, double y) { this(name); this.x = x; this.y = y; } public Ship(String name, double x, double y, double speed, double direction) { this(name, x, y); this.speed = speed; this.direction = direction; } //continue… 16 9/18/17 //(cont.) private double degreeToRadian(double degrees) { return(degrees * Math.PI / 180.0); } public void move() { move(1); } public void move(int steps) { double angle = degreesToRadians(direction); x = x + (double)steps*speed*Math.cos(angle); y = y + (double)steps*speed*Math.sin(angle); } public void printLocation() { System.out.println(name + " is at (" + x + "," + y + ")."); } } //end of Ship class Nội dung 17 18 2.1 Thành viên static n n n Ví dụ lớp JOptionPane javax.swing Trong Java n Chồng phương thức Thành viên ĐT thành viên lớp Quản lý nhớ Java Truyền tham số cho phương thức Một số lớp tiện ích Java Các thành viên bình thường thành viên thuộc đối tượng Thành viên thuộc lớp khai báo static n Thuộc tính n Phương thức: Cú pháp khai báo thành viên static: chi_dinh_truy_cap static kieu_du_lieu tenBien; n Ví dụ: 19 20 9/18/17 Ví dụ - sử dụng thuộc tính phương thức static lớp JOptionPane (2) Ví dụ - sử dụng thuộc tính phương thức static lớp JOptionPane JOptionPane.showMessageDialog(null,"Ban da thao tac loi", "Thong bao loi", JOptionPane.ERROR_MESSAGE); n n JOptionPane.showConfirmDialog(null,"Ban co chac chan muon thoat?", "Hay lua chon", JOptionPane.YES_NO_OPTION); Object[] options = { "OK", "CANCEL" }; JOptionPane.showOptionDialog(null,“Nhan OK de tiep tuc", "Canh bao", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,null,option s,options[0]); 21 2.1 Thành viên static (2) n n 22 Ví dụ Thay đổi giá trị thành viên static đối tượng lớp thay đổi giá trị thành viên tất đối tượng khác lớp Các phương thức static truy cập vào thuộc tính static gọi phương thức static lớp 23 class TestStatic{ public static int iStatic; public int iNonStatic; } public class TestS { public static void main(String[] args) { TestStatic obj1 = new TestStatic(); obj1.iStatic = 10; obj1.iNonStatic = 11; System.out.println(obj1.iStatic+”,”+obj1.iNonStatic); TestStatic obj2 = new TestStatic(); System.out.println(obj2.iStatic+”,”+obj2.iNonStatic); obj2.iStatic = 12; System.out.println(obj1.iStatic+”,”+obj1.iNonStatic); } } 24 9/18/17 Ví dụ 2.2 Thành viên public class Demo { int i = 0; void tang(){ i++; } public static void main(String[] args) { tang(); n n chi_dinh_truy_cap final kieu_du_lieu TEN_HANG = gia_tri; System.out.println("Gia tri cua i la" + i); } } n non-static method tang() cannot be referenced from a static contex non-static variable i cannot be referenced from a static context Ví dụ: final double PI = 3.141592653589793; public final int VAL_THREE = 39; private final int[] A = { 1, 2, 3, 4, 5, }; 25 2.2 Thành viên (2) n Một thuộc tính/phương thức khơng thể thay đổi giá trị/nội dung trình sử dụng Cú pháp khai báo: 26 Instance member vs Class member Thông thường số liên quan đến lớp khai báo static final nhằm giúp truy cập dễ dàng 27 Thành viên đối tượng n Thuộc tính/phương thức truy cập thơng qua đối tượng n Mỗi đối tượng có riêng thuộc tính đối tượng n Giá trị thuộc tính đối tượng đối tượng khác khác Thành viên lớp n Thuộc tính/phương thức truy cập thơng qua lớp n Các đối tượng có chung thuộc tính lớp n Giá trị thuộc tính lớp đối tượng khác giống 28 9/18/17 Nội dung Quản lý nhớ Java n Chồng phương thức Thành viên ĐT thành viên lớp Quản lý nhớ Java Truyền tham số cho phương thức Một số lớp tiện ích Java n n Java không sử dụng trỏ nên địa nhớ bị ghi đè lên cách ngẫu nhiên cố ý Các vấn đề định vị tái định vị nhớ, quản lý nhớ JVM kiểm sốt, hồn tồn suốt với lập trình viên Lập trình viên khơng cần quan tâm đến việc ghi dấu phần nhớ cấp phát heap để giải phóng sau 29 30 3.1 Bộ nhớ Heap 3.1 Bộ nhớ Heap String s = new String(“hello”); n String s = new String(“hello”); String t = s; Bộ nhớ Heap sử dụng để ghi thông tin tạo toán tử new n Bộ nhớ Heap 31 Bộ nhớ Heap sử dụng để ghi thông tin tạo toán tử new Bộ nhớ Heap 32 9/18/17 3.2 Bộ nhớ Stack 3.3 Bộ thu gom rác (Garbage Collector) String s = new String(“hello”); String t = s; int i = 201; int j = i; n n Giá trị cục nhớ Stack sử dụng trỏ i tham chiếu tới Heap Giá trị liệu j nguyên thủy ghi trực tiếp Stack n n n 201 201 Bộ nhớ Stack Một tiến trình chạy ngầm gọi đến “thu gom rác” để phục hồi lại phần nhớ mà đối tượng không tham chiếu đến (tái định vị) Các đối tượng khơng có tham chiếu đến gán null Bộ thu gom rác định kỳ quét qua danh sách đối tượng JVM phục hồi tài nguyên đối tượng tham chiếu Bộ nhớ Heap33 34 3.3 Bộ thu gom rác (2) n JVM định thực thu gom rác: n n n Phương thức void finalize() n n Thông thường thực thi thiếu nhớ Tại thời điểm khơng dự đốn trước Lớp có phương thức finalize() – thực thi trình thu gom xảy Thường sử dụng cho trường hợp đặc biệt để “tự d ọn dẹp” tài nguyên sử dụng đối tượng gc giả i phóng n Khơng thể ngăn trình thực thu gom rác yêu cầu thực sớm hơn: n Ví dụ cần đóng socket, file, nên xử lý luồng trước đối tượng bị ngắt bỏ tham chiếu Có thể coi hàm hủy (destructor) lớp Java khơng có khái niệm System.gc(); Runtime.gc(); 35 36 9/18/17 3.4 So sánh đối tượng n n 3.4 So sánh đối tượng (2) Đối với kiểu liệu nguyên thủy, tốn tử == kiểm tra xem chúng có giá trị hay khơng Ví dụ: n n Đối với đối tượng, toán tử == kiểm tra xem hai đối tượng có đồng hay khơng, có tham chiếu đến đối tượng hay khơng Ví dụ: Employee a = new Employee(1); Employee b = new Employee(1); if (a==b) // false int a = 1; int b = 1; if (a==b) // true Employee a = new Employee(1); Employee b = a; if (a==b) // true 37 3.4 So sánh đối tượng (3) n Ví dụ == equals – Lớp Integer Phương thức equals n n Đối với kiểu liệu nguyên thủy Không tồn Đối với đối tượng: Bất kỳ đối tượng có phương thức n 38 So sánh giá trị đối tượng 39 public class Equivalence { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1 == n2); System.out.println(n1.equals(n2)); } } 40 10 9/18/17 Nội dung Ví dụ – equals lớp tự viết class Value { int i; } public class EqualsMethod2 { public static void main(String[] args) { Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 100; System.out.println(v1.equals(v2)); } } Chồng phương thức Thành viên ĐT thành viên lớp Quản lý nhớ Java Truyền tham số cho phương thức Một số lớp tiện ích Java 41 42 Truyền tham số cho phương thức n Có thể sử dụng kiểu liệu cho tham số phương thức constructor n n n Truyền tham số cho phương thức (2) n Kiểu liệu nguyên thủy Kiểu liệu tham chiếu: mảng đối tượng Java truyền tham số cho phương thức dạng giá trị (pass-by-value): Truyền giá trị/bản tham số thực n Ví dụ public Polygon polygonFrom(Point[] corners) { // method body goes here } n Với tham số có kiểu liệu tham trị (kiểu liệu nguyên thủy): Truyền giá trị/bản biến nguyên thủy truyền vào Với tham số có kiểu liệu tham chiếu (mảng đối tượng): Truyền giá trị/bản tham chiếu gốc truyền vào Thay đổi tham số hình thức khơng làm ảnh hưởng đến tham số thực 43 44 11 9/18/17 4.1 Với kiểu liệu tham trị n n 4.2 Với kiểu liệu tham chiếu Các giá trị nguyên thủy thay đổi truyền tham số n Phương thức swap có hoạt động khơng? public void swap(int var1, int var2) { int temp = var1; var1 = var2; var2 = temp; } n Sau truyền cho phương thức, đối tượng có tham chiếu 45 4.2 Với kiểu liệu tham chiếu-ví dụ 46 4.2 Với kiểu liệu tham chiếu-ví dụ public class Student { private int year; private String name; public class Test { public static void change(Student std){ std.setYear(2000); } public static void main(String[] args) { Student std = new Student("Nam", 1990); System.out.println(std.getYear()); change(std); System.out.println(std.getYear()); } } public Student(String name, int year) { this.year = year; this.name = name; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } } Thực truyền tham chiếu gốc, truyền tham chiếu gốc truyền đối tượng (pass the references by value, not the original reference or the object) 47 48 12 9/18/17 Ví dụ 4.2 Với kiểu liệu tham chiếu-ví dụ public class Point { private double x; private double y; public Point() { } public Point(double x, double y) { this.x = x; this.y = y; } public void setX(double x) { this.x = x; } public void setY(double y) { this.y = y; } public void printPoint() { System.out.println("X: " + x + " Y: " + y); } } public class Test { public static void change(Student std){ std = new Student("Hung", 1995); } public static void main(String[] args) { Student std = new Student("Nam", 1990); System.out.println(std.getYear()); change(std); System.out.println(std.getYear()); } } 49 50 public class Test { public static void tricky(Point arg1, Point arg2) { arg1.setX(100); arg1.setY(100); Point temp = arg1; arg1 = arg2; arg2 = temp; } public static void main(String [] args) { Point pnt1 = new Point(0,0); Point pnt2 = new Point(0,0); pnt1.printPoint(); pnt2.printPoint(); System.out.println(); tricky(pnt1, pnt2); pnt1.printPoint(); pnt2.printPoint(); } n Chỉ có tham chiếu phương thức tráo đổi, tham chiếu gốc } 51 52 13 9/18/17 n 4.3 Truyền số lượng tham số tùy ý n public Polygon polygonFrom(Point corners) { int numberOfSides = corners.length; double squareOfSide1, lengthOfSide1; squareOfSide1 = (corners[1].x - corners[0].x) *(corners[1].x - corners[0].x) + (corners[1].y - corners[0].y) Được gọi varargs Cú pháp: n n Ví dụ ten_phuong_thuc(Kieu_dl ten_tham_so) Ví dụ 1: n *(corners[1].y - corners[0].y) ; lengthOfSide1 = Math.sqrt(squareOfSide1); //create & return a polygon connecting the Points Khai báo: public PrintStream printf(String format, Object args) n } Sử dụng n n n System.out.printf ("%s: %d, %s\n", name, idnum, address); System.out.printf ("%s: %d, %s, %s, %s\n", name, idnum, address, phone, email); Nhận xét n n corners coi mảng Phương thức gọi cách truyền mảng loạt tham số truyền vào 53 54 Bài tập: Tính tổng số lượng số nguyên Nội dung public class Test { public static int plus(int arr) { int result = 0; for (int i : arr) { result += i; } return result; } Chồng phương thức Thành viên ĐT thành viên lớp Quản lý nhớ Java Truyền tham số cho phương thức Một số lớp tiện ích Java public static void main(String[] args) { System.out.println(plus(1, 2, 3, 4, 5)); } } 55 56 14 9/18/17 5.1 Package Java n Package giống thư mục giúp: n n Tổ chức xác định vị trí lớp dễ dàng sử dụng lớp cách phù hợp Tránh cho việc đặt tên lớp bị xung đột (trùng tên) n n n 5.1 Package Java (2) n Tên đầy đủ lớp bao gồm tên gói tên lớp: Các package khác chứa lớp có tên Bảo vệ lớp, liệu phương thức mức rộng so với mối quan hệ lớp Một package chứa package khác 57 58 a Tham chiếu lớp n n a Tham chiếu lớp (2) Trong package: Sử dụng tên lớp Khác package: Phải cung cấp tên đầy đủ cho lớp định nghĩa package khác Ví dụ: n public class HelloNameDialog{ public static void main(String[] args){ String result; result = javax.swing.JOptionPane.showInputDialog (“Hay nhap ten ban:”); javax.swing.JOptionPane.showMessageDialog(null, ”Xin chao “+ result + “!”); } } 59 n Lệnh import: Sử dụng lệnh import để khai báo package lớp để sử dụng không cần nêu tên đầy đủ n Ví dụ: import javax.swing.JOptionPane; n public class HelloNameDialog{ public static void main(String[] args){ String result; result = JOptionPane.showInputDialog (“Hay nhap ten ban:”); JOptionPane.showMessageDialog(null, ”Xin chao “+ result + “!”); System.exit(0); } } 60 15 9/18/17 b Các package Java •java.applet •java.awt •java.beans •java.io •java.lang •java.math •java.net •java.nio •java.rmi •java.security •java.sql •java.text •java.util •javax.accessibility •javax.crypto •javax.imageio •javax.naming •javax.net •javax.print •javax.rmi •javax.security •javax.sound •javax.sql •javax.swing •javax.transaction •javax.xml •org.ietf.jgss •org.omg.CORBA •org.omg.CosNaming •org.omg.Dynamic •org.omg.IOP •org.omg.Messaging •org.omg.PortableInterceptor •org.omg.PortableServer •org.omg.SendingContext •org.omg.stub.java.rmi •org.w3c.dom •org.xml b Các package Java (2) n Các package Java n n n n n n n 62 n Cung cấp lớp thực thi phép toán với số nguyên phép toán thập phân n Cung cấp API cho phép truy nhập xử lý liệu lưu trữ nguồn liệu (thường sử dụng sở liệu quan hệ) Các kiểu liệu ngun thủy khơng có phương thức liên quan đến Mỗi kiểu liệu nguyên thủy có lớp tương ứng gọi lớp bao: n javax.swing n n 5.2 Các lớp bao (Wrapper class) n java.sql n Cung cấp khả vào/ra hệ thống với luồng liệu hệ thống file 61 java.math n Bao gồm tập hợp framework, mơ hình kiện, date time, nhiều tiện ích khác java.io n Các package Java n Cung cấp lớp cho thiết kế ngôn ngữ lập trình Java Bao gồm wrapper classes, String StringBuffer, Object, Import ngầm định vào tất lớp java.util n b Các package Java (3) n java.lang Cung cấp lớp giao diện cho phép tạo ứng dụng đồ họa n … n 63 Các lớp bao “gói” liệu nguyên thủy cung cấp phương thức thích hợp cho liệu Mỗi đối tượng lớp bao đơn giản lưu trữ biến đơn đưa phương thức để xử lý Các lớp bao phần Java API 64 16 9/18/17 5.2 Các lớp bao (2) a Chuyển đổi kiểu liệu n n Sử dụng toString() để chuyển giá trị số thành xâu Sử dụng Value() để chuyển từ đối tượng lớp bao thành giá trị nguyên thủy đối tượng tương ứng Float objF = new Float(“4.67”); float f = objF.floatValue(); // f=4.67F int i = objF.intValue(); n //i=4 Sử dụng parse() valueOf() để chuyển xâu thành giá trị số int i = Integer.parseInt(“123”); double //i=123 d = Double.parseDouble(“1.5”) ; // d=1.5 Double objF2 = Double.valueOf(“-36.12”); long l = objF2.longValue(); // l=-36L 65 a Chuyển đổi kiểu liệu (2) 66 b Các số n Boolean n n n n n n n n n n int MAX_RADIX char MAX_VALUE int MIN_RADIX char MIN_VALUE Unicode classification constants Double n n n n n 67 n byte MIN_VALUE byte MAX_VALUE Character n double double double double double Float n Byte n n n Boolean FALSE Boolean TRUE MAX_VALUE MIN_VALUE NaN NEGATIVE_INFINITY POSITIVE_INFINITY n n float float float float float n Integer n Long n Short n n n n n n MAX_VALUE MIN_VALUE NaN NEGATIVE_INFINITY POSITIVE_INFINITY int MIN_VALUE int MAX_VALUE long MIN_VALUE long MAX_VALUE short MIN_VALUE short MAX_VALUE 68 17 9/18/17 Ví dụ 5.3 Xâu (String) double d = (new Integer(Integer.MAX_VALUE)) doubleValue(); System.out.println(d); // 2.147483647E9 n n String input = "test 1-2-3"; int output = 0; for (int index=0;index

Ngày đăng: 20/06/2021, 09:05

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN