1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nghị luận về bác, một tấm gương sáng cho Đồng bào

32 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Sự khác biệt khi sử dụng kế thừa và sử dụng khai báo biến thành viên trong lớp GioHang
Chuyên ngành Lập trình hướng đối tượng
Thể loại Bài giảng
Định dạng
Số trang 32
Dung lượng 42 KB

Nội dung

--- Page 1 --- Có sự khác biệt nhỏ nhưng quan trọng giữa hai cách bạn đề xuất để xóa một sản phẩm khỏi giỏ hàng. Sự khác biệt nằm ở cách bạn sử dụng biến thành viên DSSP so với cách sử dụng this trực tiếp. Phương thức xoa(int ma) với this.remove(tim(ma)): java Copy code public void xoa(int ma) { this.remove(tim(ma)); } Phương thức xoa(int ma) với this.DSSP.remove(this.tim(ma)): java Copy code public void xoa(int ma) { this.DSSP.remove(this.tim(ma)); } Sự khác biệt: Sử dụng this.remove(tim(ma)): Trong lớp GioHang kế thừa từ ArrayList: Phương thức remove sẽ gọi phương thức remove của ArrayList trực tiếp. this ở đây chính là đối tượng GioHang, và vì GioHang là một ArrayList, việc gọi this.remove sẽ hoạt động trên danh sách ArrayList mà GioHang kế thừa. Sử dụng this.DSSP.remove(this.tim(ma)): Khi DSSP là một biến thành viên riêng biệt của lớp GioHang: --- Page 2 --- Phương thức này sử dụng biến thành viên DSSP (một đối tượng Stack hoặc bất kỳ danh sách nào bạn đang sử dụng) để thực hiện việc xóa. Trong trường hợp này, DSSP không cần phải là một ArrayList. Nó có thể là bất kỳ cấu trúc dữ liệu nào mà bạn đã chọn để lưu trữ các sản phẩm. Khi nào sử dụng phương thức nào: this.remove(tim(ma)): Sử dụng khi GioHang kế thừa từ ArrayList và bạn muốn thao tác trực tiếp trên danh sách này. Không cần định nghĩa thêm biến thành viên để lưu trữ danh sách sản phẩm. this.DSSP.remove(this.tim(ma)): Sử dụng khi bạn muốn lưu trữ danh sách sản phẩm trong một cấu trúc dữ liệu riêng biệt (như Stack trong trường hợp này). DSSP là biến thành viên và không liên quan đến việc kế thừa ArrayList. Ví dụ cụ thể: Sử dụng this.remove(tim(ma)): java Copy code package bh3.baigiang; import java.util.ArrayList; public class GioHang extends ArrayList { public void mua(SanPham sp, int soLuongMua) { --- Page 3 --- SanPham found = this.tim(sp.getMa()); if (found == null) { // Thêm mới sp.setSoLuong(soLuongMua); this.add(sp); } else { // Cập nhật số lượng found.setSoLuong(found.getSoLuong() + soLuongMua); } } private SanPham tim(int ma) { for (SanPham s : this) { if (ma == s.getMa()) { return s; } } return null; } public double tongTien() { double t = 0; --- Page 4 --- for (SanPham s : this) { t += s.getSoLuong() * s.getDonGia(); } return t; } public void xoa(int ma) { this.remove(tim(ma)); } public void xoa() { this.clear(); } } Sử dụng this.DSSP.remove(this.tim(ma)): java Copy code package bh3.baigiang; import java.util.Stack; --- Page 5 --- public class GioHang { private Stack DSSP; public GioHang() { this.DSSP = new Stack(); } public void mua(SanPham sp, int soLuongMua) { SanPham found = this.tim(sp.getMa()); if (found == null) { // Thêm mới sp.setSoLuong(soLuongMua); this.DSSP.add(sp); } else { // Cập nhật số lượng found.setSoLuong(found.getSoLuong() + soLuongMua); } } private SanPham tim(int ma) { for (SanPham s : this.DSSP) { --- Page 6 --- if (ma == s.getMa()) { return s; } } return null; } public double tongTien() { double t = 0; for (SanPham s : this.DSSP) { t += s.getSoLuong() * s.getDonGia(); } return t; } public void xoa(int ma) { this.DSSP.remove(this.tim(ma)); } public void xoa() { --- Page 7 --- this.DSSP.clear(); } } Kết luận: Cả hai phương thức đều hoạt động, nhưng sự lựa chọn giữa chúng phụ thuộc vào cách bạn thiết kế lớp GioHang và cách bạn lưu trữ danh sách các sản phẩm. 4o Sự khác biệt khi sử dụng kế thừa và sử dụng khai báo biến thành viên ở trên ChatGPT Sự khác biệt giữa việc sử dụng kế thừa (extends) và khai báo biến thành viên trong lớp GioHang là sự khác biệt cơ bản trong cách tiếp cận lập trình hướng đối tượng. Dưới đây là sự so sánh chi tiết giữa hai phương pháp này: 1. Kế thừa (extends) Khi bạn sử dụng kế thừa, lớp GioHang kế thừa từ một lớp khác, trong trường hợp này là ArrayList. Điều này có nghĩa là GioHang trở thành một loại ArrayList và thừa hưởng tất cả các phương thức và thuộc tính của ArrayList. Ví dụ: java Copy code package bh3.baigiang; import java.util.ArrayList; public class GioHang extends ArrayList { --- Page 8 --- public void mua(SanPham sp, int soLuongMua) { SanPham found = this.tim(sp.getMa()); if (found == null) { // Thêm mới sp.setSoLuong(soLuongMua); this.add(sp); } else { // Cập nhật số lượng found.setSoLuong(found.getSoLuong() + soLuongMua); } } private SanPham tim(int ma) { for (SanPham s : this) { // Duyệt qua tất cả các sản phẩm trong giỏ hàng if (ma == s.getMa()) { return s; // Trả về sản phẩm nếu tìm thấy mã trùng khớp } } return null; // Trả về null nếu không tìm thấy sản phẩm có mã trùng khớp } public double tongTien() {

Trang 1

Có sự khác biệt nhỏ nhưng quan trọng giữa hai cách bạn đề xuất để xóa một sản phẩm khỏi giỏ hàng Sự khác biệt nằm ở cách bạn sử dụng biến thành viên DSSP so với cách sử dụng this trực tiếp.

Phương thức xoa(int ma) với this.remove(tim(ma)):

o Trong lớp GioHang kế thừa từ ArrayList<SanPham>:

 Phương thức remove sẽ gọi phương thức remove của ArrayList<SanPham> trực tiếp

 this ở đây chính là đối tượng GioHang, và vì GioHang là một ArrayList<SanPham>, việc gọi this.remove sẽ hoạt động trên danh sách ArrayList

mà GioHang kế thừa

2 Sử dụng this.DSSP.remove(this.tim(ma)):

o Khi DSSP là một biến thành viên riêng biệt của lớp GioHang:

 Phương thức này sử dụng biến thành viên DSSP (một đối tượng Stack<SanPham> hoặc bất kỳ danh sách nào bạn đang sử dụng) để thực hiện việc xóa

 Trong trường hợp này, DSSP không cần phải là một ArrayList<SanPham> Nó có thể là bất kỳ cấu trúc dữ liệu nào mà bạn đã chọn để lưu trữ các sản phẩm

Khi nào sử dụng phương thức nào:

this.remove(tim(ma)):

Trang 2

o Sử dụng khi GioHang kế thừa từ ArrayList<SanPham> và bạn muốn thao tác trực tiếp trên danh sách này.

o Không cần định nghĩa thêm biến thành viên để lưu trữ danh sách sản phẩm

public class GioHang extends ArrayList<SanPham> {

public void mua(SanPham sp, int soLuongMua) {

SanPham found = this.tim(sp.getMa());

if (found == null) { // Thêm mới

private SanPham tim(int ma) {

for (SanPham s : this) {

Trang 4

public class GioHang {

private Stack<SanPham> DSSP;

public GioHang() {

this.DSSP = new Stack<SanPham>();

}

public void mua(SanPham sp, int soLuongMua) {

SanPham found = this.tim(sp.getMa());

if (found == null) { // Thêm mới

sp.setSoLuong(soLuongMua);

this.DSSP.add(sp);

} else { // Cập nhật số lượng

found.setSoLuong(found.getSoLuong() + soLuongMua); }

}

private SanPham tim(int ma) {

for (SanPham s : this.DSSP) {

Trang 5

for (SanPham s : this.DSSP) {

1 Kế thừa (extends)

Khi bạn sử dụng kế thừa, lớp GioHang kế thừa từ một lớp khác, trong trường hợp này là

ArrayList<SanPham> Điều này có nghĩa là GioHang trở thành một loại ArrayList và thừa hưởng tất cả các phương thức và thuộc tính của ArrayList

Ví dụ:

java

Copy code

Trang 6

package bh3.baigiang;

import java.util.ArrayList;

public class GioHang extends ArrayList<SanPham> {

public void mua(SanPham sp, int soLuongMua) {

SanPham found = this.tim(sp.getMa());

if (found == null) { // Thêm mới

private SanPham tim(int ma) {

for (SanPham s : this) { // Duyệt qua tất cả các sản phẩm trong giỏ hàng

for (SanPham s : this) { // Duyệt qua tất cả các sản phẩm trong giỏ hàng

t += s.getSoLuong() * s.getDonGia(); // Tính tổng tiền

Trang 7

}

return t;

}

public void xoa(int ma) {

this.remove(tim(ma)); // Xóa sản phẩm khỏi giỏ hàng nếu tìm thấy

}

public void xoa() {

this.clear(); // Xóa tất cả các sản phẩm khỏi giỏ hàng

Giới hạn: Bạn chỉ có thể kế thừa từ một lớp (Java không hỗ trợ đa kế thừa trực tiếp).

Không linh hoạt: Mọi phương thức và thuộc tính của ArrayList đều có sẵn trong GioHang, có thể

không cần thiết và làm cho lớp trở nên phức tạp hơn

2 Khai báo biến thành viên

Khi bạn sử dụng khai báo biến thành viên, lớp GioHang sẽ có một biến thành viên chứa danh sách sản phẩm Điều này cung cấp sự linh hoạt hơn trong việc quản lý và mở rộng chức năng của lớp GioHang

Trang 8

public class GioHang {

private Stack<SanPham> DSSP;

public GioHang() {

this.DSSP = new Stack<SanPham>();

}

public void mua(SanPham sp, int soLuongMua) {

SanPham found = this.tim(sp.getMa());

if (found == null) { // Thêm mới

private SanPham tim(int ma) {

for (SanPham s : this.DSSP) { // Duyệt qua tất cả các sản phẩm trong giỏ hàng

Trang 9

for (SanPham s : this.DSSP) { // Duyệt qua tất cả các sản phẩm trong giỏ hàng

t += s.getSoLuong() * s.getDonGia(); // Tính tổng tiền

}

return t;

}

public void xoa(int ma) {

this.DSSP.remove(this.tim(ma)); // Xóa sản phẩm khỏi giỏ hàng nếu tìm thấy

}

public void xoa() {

this.DSSP.clear(); // Xóa tất cả các sản phẩm khỏi giỏ hàng

}

}

Ưu điểm:

Linh hoạt: Bạn có thể thay đổi cấu trúc dữ liệu bên trong mà không ảnh hưởng đến lớp GioHang.

Rõ ràng: Mã nguồn rõ ràng hơn vì bạn biết chính xác danh sách sản phẩm được lưu trữ trong

Kế thừa (extends ArrayList<SanPham>): Phù hợp khi bạn muốn tận dụng toàn bộ các phương

thức và thuộc tính của ArrayList và không cần thêm sự linh hoạt trong việc quản lý cấu trúc dữ liệu

Khai báo biến thành viên (private Stack<SanPham> DSSP): Phù hợp khi bạn cần linh hoạt hơn

trong việc quản lý dữ liệu và muốn kiểm soát cụ thể cách các phương thức hoạt động mà không phụ thuộc hoàn toàn vào lớp cha

Lựa chọn giữa hai phương pháp này phụ thuộc vào yêu cầu cụ thể của dự án và mức độ linh hoạt bạn cần trong việc quản lý dữ liệu

Trang 10

public class Main {

public static void main(String[] args) {

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím

Scanner scanner = new Scanner(System.in);

// Yêu cầu người dùng nhập một số nguyên

System.out.print("Nhập một số nguyên: ");

int soNguyen = scanner.nextInt();

// Hiển thị số nguyên vừa nhập

Trang 11

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím Scanner scanner = new Scanner(System.in);

// Yêu cầu người dùng nhập một số thực

public class Main {

public static void main(String[] args) {

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím Scanner scanner = new Scanner(System.in);

// Yêu cầu người dùng nhập một chuỗi

Trang 12

System.out.print("Nhập một chuỗi: ");

String chuoi = scanner.nextLine();

// Hiển thị chuỗi vừa nhập

System.out.println("Bạn đã nhập chuỗi: " + chuoi);

// Đóng Scanner để giải phóng tài nguyên

 nextLine(): Đọc một chuỗi (kể cả khoảng trắng)

 next(): Đọc một từ (dừng lại khi gặp khoảng trắng)

Hy vọng rằng ví dụ trên sẽ giúp bạn hiểu cách nhập dữ liệu từ bàn phím trong Java!

Trang 13

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím

Scanner scanner = new Scanner(System.in);

// Yêu cầu người dùng nhập số nguyên thứ nhất

System.out.print("Nhập số nguyên thứ nhất: ");

int soNguyen1 = scanner.nextInt();

// Yêu cầu người dùng nhập số nguyên thứ hai

System.out.print("Nhập số nguyên thứ hai: ");

int soNguyen2 = scanner.nextInt();

// Hiển thị hai số nguyên vừa nhập

System.out.println("Bạn đã nhập số thứ nhất: " + soNguyen1); System.out.println("Bạn đã nhập số thứ hai: " + soNguyen2);

// Thực hiện một phép toán ví dụ (cộng hai số)

int tong = soNguyen1 + soNguyen2;

System.out.println("Tổng của hai số là: " + tong);

// Đóng Scanner để giải phóng tài nguyên

scanner.close();

}

}

Giải thích:

Trang 14

1 Tạo đối tượng Scanner: Sử dụng Scanner scanner = new Scanner(System.in); để tạo một đối

tượng Scanner mới để đọc dữ liệu từ bàn phím

2 Nhập số nguyên thứ nhất: Dùng scanner.nextInt(); để đọc số nguyên thứ nhất.

3 Nhập số nguyên thứ hai: Dùng scanner.nextInt(); để đọc số nguyên thứ hai.

4 Hiển thị hai số nguyên vừa nhập: Sử dụng System.out.println(); để hiển thị các số nguyên vừa

được nhập

5 Thực hiện phép toán: Ví dụ thực hiện phép cộng hai số và hiển thị kết quả.

6 Đóng Scanner: Dùng scanner.close(); để đóng Scanner và giải phóng tài nguyên.

Bạn có thể thay đổi hoặc mở rộng chương trình này để thực hiện các thao tác khác với hai số nguyên vừanhập, tùy theo yêu cầu của bạn

// Khai báo biến

DECLARE double celsius

DECLARE double fahrenheit

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím

CREATE Scanner object named scanner

// Yêu cầu người dùng nhập nhiệt độ bằng độ Celsius

PRINT "Nhập nhiệt độ bằng độ Celsius: "

READ celsius from keyboard input

Trang 15

// Chuyển đổi nhiệt độ từ độ Celsius sang độ Fahrenheit

// Công thức: Fahrenheit = (Celsius * 9/5) + 32

SET fahrenheit = (celsius * 9/5) + 32

// Hiển thị kết quả

PRINT "Nhiệt độ tương ứng bằng độ Fahrenheit là: " + fahrenheit

// Đóng Scanner để giải phóng tài nguyên

public class ChuyenDoiNhietDo {

public static void main(String[] args) {

// Khai báo biến

double celsius;

double fahrenheit;

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím

Scanner scanner = new Scanner(System.in);

// Yêu cầu người dùng nhập nhiệt độ bằng độ Celsius

System.out.print("Nhập nhiệt độ bằng độ Celsius: ");

celsius = scanner.nextDouble();

Trang 16

// Chuyển đổi nhiệt độ từ độ Celsius sang độ Fahrenheit

// Công thức: Fahrenheit = (Celsius * 9/5) + 32

fahrenheit = (celsius * 9.0/5.0) + 32;

// Hiển thị kết quả

System.out.println("Nhiệt độ tương ứng bằng độ Fahrenheit là: " + fahrenheit);

// Đóng Scanner để giải phóng tài nguyên

2 Chuyển đổi nhiệt độ:

o Sử dụng công thức chuyển đổi: fahrenheit = (celsius * 9/5) + 32;

3 Hiển thị kết quả:

o In kết quả nhiệt độ bằng độ Fahrenheit ra màn hình bằng System.out.println();

4 Đóng Scanner:

o Dùng scanner.close(); để đóng đối tượng Scanner và giải phóng tài nguyên

Chương trình này sẽ chuyển đổi nhiệt độ từ độ Celsius sang độ Fahrenheit theo yêu cầu của bạn

4o

package bt1; /* Bài 1: Xây dựng class hình tròn với các phương thức tính diện tích và chu vi * */ public class Main { public static void main(String[] args) { Tron t = new Tron(10); String kqChuVi =

String.format("Chu vi = %.2f", t.chuVi()); String kqDienTich = String.format("Diện tích = %.2f",

t.dienTich()); System.out.println(kqChuVi); System.out.println(kqDienTich); } }tôi muốn nhập bán kính từ bàn phím thì thay đổi gì

ChatGPT

Trang 17

Để nhập bán kính từ bàn phím thay vì sử dụng giá trị cố định, bạn cần sử dụng lớp Scanner để đọc dữ liệu từ người dùng Dưới đây là cách bạn có thể thay đổi chương trình của mình để nhập bán kính từ bànphím:

Cập nhật chương trình

1 Thêm lớp Scanner để đọc dữ liệu từ bàn phím.

2 Đọc giá trị bán kính từ bàn phím và truyền giá trị này vào đối tượng Tron.

private double banKinh;

public Tron(double banKinh) {

this.banKinh = banKinh;

}

public double chuVi() {

return 2 * Math.PI * banKinh;

}

public double dienTich() {

return Math.PI * banKinh * banKinh;

}

}

Trang 18

public class Main {

public static void main(String[] args) {

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím

Scanner scanner = new Scanner(System.in);

// Yêu cầu người dùng nhập bán kính

System.out.print("Nhập bán kính của hình tròn: ");

double banKinh = scanner.nextDouble();

// Tạo đối tượng Tron với bán kính nhập từ bàn phím

Tron t = new Tron(banKinh);

// Tính chu vi và diện tích

String kqChuVi = String.format("Chu vi = %.2f", t.chuVi());

String kqDienTich = String.format("Diện tích = %.2f", t.dienTich());

o Thêm import java.util.Scanner; để sử dụng lớp Scanner

o Tạo một đối tượng Scanner trong phương thức main để đọc dữ liệu từ bàn phím

Trang 19

o Yêu cầu người dùng nhập bán kính bằng cách sử dụng System.out.print("Nhập bán kính của hình tròn: ");.

o Đọc giá trị bán kính từ bàn phím bằng double banKinh = scanner.nextDouble();

public Tron(double banKinh) { this.banKinh = banKinh; }giải thích

ChatGPT

Phương thức khởi tạo Tron(double banKinh) là một constructor trong lớp Tron Constructor này được sử dụng để tạo ra các đối tượng của lớp Tron và khởi tạo giá trị cho thuộc tính banKinh của đối tượng đó Hãy cùng giải thích chi tiết từng phần của constructor này:

1 public Tron(double banKinh):

o public: Đây là từ khóa xác định phạm vi truy cập của constructor public có nghĩa là constructor này có thể được gọi từ bất kỳ đâu (từ bên ngoài lớp)

o Tron: Đây là tên của constructor Tên của constructor phải giống hoàn toàn với tên của lớp mà nó thuộc về (trong trường hợp này là lớp Tron) Constructor không có kiểu trả về (không có void, int, double, v.v.)

Trang 20

o (double banKinh): Đây là danh sách tham số mà constructor nhận vào Trong trường hợpnày, constructor nhận một tham số kiểu double có tên là banKinh Giá trị của tham số này sẽ được sử dụng để khởi tạo giá trị cho thuộc tính banKinh của đối tượng.

2 this.banKinh = banKinh;:

o this: Đây là từ khóa đặc biệt trong Java dùng để tham chiếu đến đối tượng hiện tại Nó thường được sử dụng để phân biệt giữa các biến thành viên của lớp và các tham số của phương thức hoặc constructor khi chúng có cùng tên

o this.banKinh: Đây là biến thành viên banKinh của đối tượng hiện tại Biến này là thuộc tính của đối tượng Tron mà bạn đang tạo

o = banKinh;: Đây là giá trị của tham số banKinh được truyền vào constructor Phép gán này sẽ gán giá trị của tham số banKinh cho biến thành viên this.banKinh

Chức năng của constructor:

Constructor Tron(double banKinh) cho phép bạn tạo một đối tượng Tron mới với một giá trị ban đầu cho thuộc tính banKinh Khi bạn tạo một đối tượng Tron bằng cách gọi new Tron(10);, giá trị 10 sẽ được truyền vào constructor và gán cho biến thành viên banKinh của đối tượng Tron mới này

Ví dụ sử dụng constructor:

Dưới đây là ví dụ về cách sử dụng constructor này trong mã nguồn:

java

Copy code

public class Main {

public static void main(String[] args) {

// Tạo đối tượng Tron với bán kính là 10

Tron hinhTron = new Tron(10);

// Sử dụng các phương thức để tính chu vi và diện tích

System.out.println("Chu vi: " + hinhTron.chuVi());

Trang 21

// Constructor khởi tạo giá trị bán kính

public Tron(double banKinh) {

this.banKinh = banKinh;

}

// Phương thức tính chu vi

public double chuVi() {

return 2 * Math.PI * banKinh;

}

// Phương thức tính diện tích

public double dienTich() {

return Math.PI * banKinh * banKinh;

}

}

Trong ví dụ trên, khi bạn tạo đối tượng Tron với new Tron(10);, giá trị 10 sẽ được truyền vào constructor Tron(double banKinh) và được gán cho biến thành viên banKinh của đối tượng Tron mới Sau đó, bạn có thể sử dụng đối tượng này để tính chu vi và diện tích của hình tròn với bán kính 10

Trang 22

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím

CREATE Scanner object named scanner

// Yêu cầu người dùng nhập một số nguyên

PRINT "Nhập một số nguyên để in bảng cửu chương: "

READ so from keyboard input

public class BangCuuChuong {

public static void main(String[] args) {

// Tạo đối tượng Scanner để đọc dữ liệu từ bàn phím

Scanner scanner = new Scanner(System.in);

// Yêu cầu người dùng nhập một số nguyên

System.out.print("Nhập một số nguyên để in bảng cửu chương: ");

Ngày đăng: 28/07/2024, 09:49

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

TÀI LIỆU LIÊN QUAN

w