Xu Hướng 5/2023 # Luyện Tập Về Thừa Kế Trong Java # Top 13 View | Ictu-hanoi.edu.vn

Xu Hướng 5/2023 # Luyện Tập Về Thừa Kế Trong Java # Top 13 View

Bạn đang xem bài viết Luyện Tập Về Thừa Kế Trong Java được cập nhật mới nhất trên website Ictu-hanoi.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.

   4. Luyện Tập về Thừa Kế Trong Java

4.1  Ex: The 

Circle

 and 

Cylinder

 Classes

Bài tập này sẽ hướng dẫn bạn thông qua các khái niệm quan trọng trong thừa kế.

Trong bài tập này, một lớp con được gọi 

Cylinder

là bắt nguồn từ siêu lớp 

Circle

như được hiển thị trong sơ đồ lớp (trong đó một mũi tên hướng lên từ lớp con đến siêu lớp của nó). 

Nghiên cứu cách lớp con 

Cylinder

gọi các hàm tạo của lớp cha (thông qua 

super()

và 

super(radius)

) và kế thừa các biến và phương thức từ lớp cha 

Circle

.

Bạn có thể sử dụng lại 

Circle

lớp mà bạn đã tạo trong bài tập trước. 

Đảm bảo rằng bạn giữ “ 

Circle.class

” trong cùng thư mục.

public class Cylinder extends Circle { private double height; public Cylinder() { super(); height = 1.0; } public Cylinder(double height) { super(); this.height = height; } public Cylinder(double radius, double height) { super(radius); this.height = height; } public double getHeight() { return height; } public double getVolume() { return getArea()*height; } }

Viết chương trình kiểm tra (

TestCylinder

) để kiểm tra lớp 

Cylinder

 đã tạo, như sau:

public class TestCylinder { public static void main (String[] args) { Cylinder c1 = new Cylinder(); System.out.println("Cylinder:" + " radius=" + c1.getRadius() + " height=" + c1.getHeight() + " base area=" + c1.getArea() + " volume=" + c1.getVolume()); Cylinder c2 = new Cylinder(10.0); System.out.println("Cylinder:" + " radius=" + c2.getRadius() + " height=" + c2.getHeight() + " base area=" + c2.getArea() + " volume=" + c2.getVolume()); Cylinder c3 = new Cylinder(2.0, 10.0); System.out.println("Cylinder:" + " radius=" + c3.getRadius() + " height=" + c3.getHeight() + " base area=" + c3.getArea() + " volume=" + c3.getVolume()); } }

Method Overriding and “Super”

:

 Lớp con 

lớp 

Cylinder

 kế thừa 

getArea()

phương thức từ Vòng tròn siêu lớp của nó. 

Hãy thử 

cách ghi đè

 các 

getArea()

phương pháp trong các lớp con 

Cylinder

để tính diện tích bề mặt (= 2π × bán kính × chiều cao + 2 × cơ sở khu vực) của xi lanh thay vì của vùng căn cứ. 

Đó là, nếu 

getArea()

được gọi bởi một 

Circle

thể hiện, nó trả về khu vực. 

Nếu 

getArea()

được gọi bởi một 

Cylinder

thể hiện, nó trả về diện tích bề mặt của hình trụ.

Nếu bạn ghi đè lên 

getArea()

trong lớp con 

Cylinder

, nó 

getVolume()

không còn hoạt động. 

Điều này là do 

getVolume()

sử dụng 

phương thức

 ghi đè 

được tìm thấy trong cùng một lớp. 

(Thời gian chạy Java sẽ chỉ tìm kiếm siêu lớp nếu nó không thể định vị phương thức trong lớp này). 

Sửa lỗi 

.

getArea()

getVolume()

Gợi ý: Sau khi ghi đè lên 

getArea()

lớp con 

Cylinder

, bạn có thể chọn gọi 

getArea()

siêu lớp 

Circle

bằng cách gọi 

super.getArea()

.

THỬ:

Cung cấp một 

toString()

phương thức cho 

Cylinder

lớp, ghi đè lên 

toString()

kế thừa từ siêu lớp 

Circle

, ví dụ:

cách ghi đè

@Override public String toString() { return "Cylinder: subclass of " + super.toString() + " height=" + height; }

Hãy thử 

toString()

phương pháp trong 

TestCylinder

.

Lưu ý: 

@Override

được gọi là 

chú thích

 (được giới thiệu trong JDK 1.5), yêu cầu trình biên dịch kiểm tra xem có phương thức nào như vậy trong siêu lớp được ghi đè không. 

Điều này giúp rất nhiều nếu bạn viết sai tên của 

toString()

Nếu 

@Override

không được sử dụng và 

toString()

bị sai chính tả 

ToString()

, nó sẽ được coi là một phương thức mới trong lớp con, thay vì ghi đè lên lớp cha. 

Nếu 

@Override

được sử dụng, trình biên dịch sẽ báo hiệu lỗi. 

@Override

chú thích là tùy chọn, nhưng chắc chắn tốt đẹp để có.

4.2 Ví dụ: Superclass 

Person

 và các lớp con của nó

4.3  Ex: 

Point2D

 and 

Point3D

4.4  Ex: 

Point

 and 

MovablePoint

4.5  Ex: Superclass 

Shape

 and its subclasses 

Circle

Rectangle

 and 

Square

Viết một siêu lớp được gọi 

Shape

(như thể hiện trong sơ đồ lớp), chứa:

Hai biến đối tượng 

color

String

) và 

filled

boolean

).

Hai hàm tạo: một hàm tạo không có đối số (không đối số) khởi tạo 

color

thành “xanh” và 

filled

đến 

true

và một hàm tạo khởi tạo 

color

và 

filled

cho các giá trị đã cho.

Getter và setter cho tất cả các biến thể hiện. 

Theo quy ước, getter cho một 

boolean

biến 

xxx

được gọi 

isXXX()

(thay vì 

getXxx()

cho tất cả các loại khác).

Một 

toString()

phương thức trả về “ 

A Shape with color of xxx and filled/Not filled

“.

Viết chương trình kiểm tra để kiểm tra tất cả các phương thức được định nghĩa trong 

Shape

.

Viết hai lớp con 

Shape

được gọi 

Circle

và 

Rectangle

, như thể hiện trong sơ đồ lớp.

Các 

Circle

lớp học bao gồm:

Một biến đối tượng 

radius

double

).

Ba Constructor như hình. Trong constructor

 không có đối số thì khởi tạo bán kính tới 

1.0

.

Getter và setter cho biến thể hiện (instance variable) 

radius

.

Phương thức 

getArea()

và 

getPerimeter()

.

Ghi đè 

toString()

phương thức được kế thừa, để trả về “ 

A Circle with radius=xxx, which is a subclass of yyy

“, đây 

yyy

là đầu ra của 

toString()

phương thức từ lớp cha.

Các lớp 

Rectangle

 bao gồm:

Hai biến đối tượng 

width

double

) và 

length

double

).

Ba Constructor như hình. Trong constructor

 không có đối số 

khởi tạo 

width 

và 

length 

bằng 

1.0

.

Getter và setter cho tất cả các biến thể hiện.

Phương thức 

getArea()

và 

getPerimeter()

.

Ghi đè 

toString()

phương thức được kế thừa, để trả về “ 

A Rectangle with width=xxx and length=zzz, which is a subclass of yyy

“, đây 

yyy 

là đầu ra của 

toString()

phương thức từ lớp cha.

Viết một lớp được gọi 

Square

, như là một lớp con của 

Rectangle

Tự thuyết phục bản thân 

Square 

có thể được mô hình hóa như là một lớp con của 

Rectangle

Square 

không có biến đối tượng, nhưng kế thừa chiều rộng và chiều dài của biến đối tượng từ hình chữ nhật siêu lớp của nó.

Cung cấp các constructor thích hợp (như thể hiện trong sơ đồ lớp). 

Dấu:

public Square(double side) { super(side, side); }

Ghi đè 

toString()

phương thức để trả về “ 

A Square with side=xxx, which is a subclass of yyy

“, đây 

yyy

là đầu ra của 

toString()

phương thức từ lớp cha.

Bạn có cần ghi đè lên 

getArea()

và 

getPerimeter()

Thử chúng và in ra kết quả 😉

Ghi đè 

setLength()

và 

setWidth()

thay đổi cả 

width

và 

length

, để duy trì hình dạng vuông.

5.  Exercises on Composition vs Inheritance

Chúng có hai cách để sử dụng lại một lớp trong các ứng dụng của bạn: 

thành phần

 và 

kế thừa

 .

5.1  Ex: The 

Point

 and 

Line

 Classes

Chúng ta hãy bắt đầu với 

thành phần

 với tuyên bố “một dòng gồm hai điểm”.

Hoàn thành định nghĩa của hai lớp sau: 

Point

và 

Line

Lớp 

Line

bao gồm 2 trường hợp của lớp 

Point

, đại diện cho điểm bắt đầu và điểm kết thúc của dòng. 

Cũng viết các lớp kiểm tra cho 

Point

và 

Line

(nói 

TestPoint

và 

TestLine

).

public class Point { private int x; private int y; public Point (int x, int y) {......} public String toString() { return "Point: (" + x + "," + y + ")"; } public int getX() {......} public int getY() {......} public void setX(int x) {......} public void setY(int y) {......} public void setXY(int x, int y) {......} } public class TestPoint { public static void main(String[] args) { Point p1 = new Point(10, 20); System.out.println(p1); ...... } } public class Line { private Point begin; private Point end; public Line (Point begin, Point end) { this.begin = begin; ...... } public Line (int beginX, int beginY, int endX, int endY) { begin = new Point(beginX, beginY); ...... } public String toString() { ...... } public Point getBegin() { ...... } public Point getEnd() { ...... } public void setBegin(......) { ...... } public void setEnd(......) { ...... } public int getBeginX() { ...... } public int getBeginY() { ...... } public int getEndX() { ...... } public int getEndY() { ...... } public void setBeginX(......) { ...... } public void setBeginY(......) { ...... } public void setBeginXY(......) { ...... } public void setEndX(......) { ...... } public void setEndY(......) { ...... } public void setEndXY(......) { ...... } public int getLength() { ...... } public double getGradient() { ...... } } public class TestLine { public static void main(String[] args) { Line l1 = new Line(0, 0, 3, 4); System.out.println(l1); Point p1 = new Point(...); Point p2 = new Point(...); Line l2 = new Line(p1, p2); System.out.println(l2); ... } }

Sơ đồ lớp cho 

thành phần

 như sau (trong đó một mũi tên đầu kim cương rỗng chỉ vào thành phần của nó):

Thay vì 

thành phần

 , chúng ta có thể thiết kế một 

Line

lớp bằng cách sử dụng 

inheritance

Thay vì “một dòng gồm hai điểm”, chúng ta có thể nói rằng “một dòng là một điểm được mở rộng bởi một điểm khác”, như thể hiện trong sơ đồ lớp sau:

Chúng ta hãy thiết kế lại 

Line

lớp (được gọi 

LineSub

) là một lớp con của lớp 

Point

LineSub

kế thừa điểm bắt đầu từ siêu lớp của nó 

Point

và thêm điểm kết thúc. 

Hoàn thành định nghĩa lớp. 

Viết một lớp kiểm tra được gọi 

TestLineSub

để kiểm tra 

LineSub

.

public class LineSub extends Point { Point end; public LineSub (int beginX, int beginY, int endX, int endY) { super(beginX, beginY); chúng tôi = new Point(endX, endY); } public LineSub (Point begin, Point end) { super(begin.getX(), begin.getY()); chúng tôi = end; } public String toString() { ... } public Point getBegin() { ... } public Point getEnd() { ... } public void setBegin(...) { ... } public void setEnd(...) { ... } public int getBeginX() { ... } public int getBeginY() { ... } public int getEndX() { ... } public int getEndY() { ... } public void setBeginX(...) { ... } public void setBeginY(...) { ... } public void setBeginXY(...) { ... } public void setEndX(...) { ... } public void setEndY(...) { ... } public void setEndXY(...) { ... } public int getLength() { ... } public double getGradient() { ... } }

Tóm tắt: Có hai cách tiếp cận mà bạn có thể thiết kế một dòng, 

composition 

hoặc 

inheritance

“Một dòng gồm hai điểm” hoặc “Một dòng là một điểm được mở rộng bằng một điểm khác”. 

So sánh 

Line

và 

LineSub 

thiết kế: 

Line 

sử dụng 

thành phần

 và 

LineSub 

sử dụng 

kế thừa

 . 

Thiết kế nào tốt hơn?

5.2  Ex: The 

Circle

 and 

Cylinder

 Classes Using Composition

Hãy thử viết lại 

Circle-Cylinder

các bài tập trước sử dụng 

thành phần

 (như thể hiện trong sơ đồ lớp) thay vì 

thừa kế

 . 

Đó là, “một hình trụ bao gồm một vòng tròn cơ sở và chiều cao”.

public class Cylinder { private Circle base; private double height; public Cylinder() { base = new Circle(); height = 1.0; } ...... }

Thiết kế nào (kế thừa hoặc thành phần) là tốt hơn?

Giải Phương Trình Bậc Hai Trong Java

Trong bài tập này chúng ta sẽ thực hiện chương trình giải phương trình bậc hai trong Java. Đây là một bài tập phổ biến khi bắt đầu học ngôn ngữ lập trình.

Phương trình bậc hai có 3 hệ số là a, b, c có dạng như sau:

Ví dụ: Chương trình giải phương trình bậc hai trong Java.

Giải thích:

Đầu tiên chúng ta sẽ yêu cầu người dùng nhập vào các hệ số a, b, c cho phương trình bậc hai.

Tiếp đến tính Delta = b*b-4*a*c

Sau đó xét điều kiện cho Delta:

Nếu Delta < 0 thì phương trình vô nghiệm.

Nếu Delta = 0 thì phương trình có nghiệp kép là x1 = x2 = -b / 2 * a.

Và cuối cùng là hiển thị kết quả ra màn hình.

import java.util.Scanner; public class GiaiPTBacHai { public static void main(String[] args) { double a, b, c, x1, x2, delta; String ketQua = ""; Scanner scanner = new Scanner(System.in); do { System.out.print("Nhập a (a # 0): "); a = scanner.nextDouble(); } while (a == 0); System.out.print("Nhập b: "); b = scanner.nextDouble(); System.out.print("Nhập c: "); c = scanner.nextDouble(); System.out.println("Phương trình bậc hai bạn vừa nhập có dạng: "+a+"x^2 + "+b+"x + "+c+" = 0"); delta = Math.pow(b, 2) - 4 * a * c; if (delta < 0) { ketQua = "Phương trình vô nghiệm!"; } else if (delta == 0) { x1 = x2 = -b/ (2*a); System.out.println("Phương trinh có nghiệm kép là x1 = x2 = "+x1); } else { x1 = (-b + Math.sqrt(delta)) / (2 * a); x2 = (-b - Math.sqrt(delta)) / (2 * a); ketQua = "Phương trình có 2 nghiệm x1 = " + x1 + " và x2 = " + x2; } System.out.println(ketQua); System.out.println("Chương trình này được đăng tại Freetuts.net"); } }

Giải Phương Trình Bậc 2 Trong Java

Đề bài

Viết chương trình giải phương trình bậc 2 trong java. Phương trình bậc 2 có dạng:

Lời giải

Kiến thức sử dụng trong bài này, java.util.Scanner được sử dụng để đọc dữ liệu nhập vào từ bàn phím và từ khóa static trong java. Bạn cũng nên tìm hiểu về package trong java.

Bài này được viết trên eclipse, bạn có thể tham khảo bài tạo chương trình java đầu tiên trên eclipse.

File: chúng tôi

package vn.viettuts.baitap; import java.util.Scanner; /** * Giải phương trình bậc 2 * * @author viettuts.vn */ public class BaiTap1 { private static Scanner scanner = new Scanner(System.in); /** * main * * @param args */ public static void main(String[] args) { System.out.print("Nhập hệ số bậc 2, a = "); float a = BaiTap1.scanner.nextFloat(); System.out.print("Nhập hệ số bậc 1, b = "); float b = BaiTap1.scanner.nextFloat(); System.out.print("Nhập hằng số tự do, c = "); float c = scanner.nextFloat(); BaiTap1.giaiPTBac2(a, b, c); } /** * Giải phương trình bậc 2: ax2 + bx + c = 0 * * @param a: hệ số bậc 2 * @param b: hệ số bậc 1 * @param c: số hạng tự do */ public static void giaiPTBac2(float a, float b, float c) { if (a == 0) { if (b == 0) { System.out.println("Phương trình vô nghiệm!"); } else { System.out.println("Phương trình có một nghiệm: " + "x = " + (-c / b)); } return; } float delta = b*b - 4*a*c; float x1; float x2; x1 = (float) ((-b + Math.sqrt(delta)) / (2*a)); x2 = (float) ((-b - Math.sqrt(delta)) / (2*a)); System.out.println("Phương trình có 2 nghiệm là: " + "x1 = " + x1 + " và x2 = " + x2); } else if (delta == 0) { x1 = (-b / (2 * a)); System.out.println("Phương trình có nghiệm kép: " + "x1 = x2 = " + x1); } else { System.out.println("Phương trình vô nghiệm!"); } } }

Kết quả:

Nhập hệ số bậc 2, a = 2 Nhập hệ số bậc 1, b = 1 Nhập hằng số tự do, c = -1 Phương trình có 2 nghiệm là: x1 = 0.5 và x2 = -1.0

Trong ví dụ trên, phương thức Math.sqrt(double a) được sử dụng để tính căn bậc 2 của a.

Hướng Dẫn Giải Phương Trình Bậc 2 Trong Java

Bài toán phương trình bậc 2 là một trong những bài toán cổ điển mà 90% những người khi mới học lập trình đều phải trải qua và nắm được, vì vậy trong bài học hôm nay mình sẽ hướng dẫn các bạn cách giải bài toán phương trinh bậc 2 trong ngôn ngữ lập trình Java nói riêng. Bài học nằm trong Serie lập trình Java căn bản.

Giải phương trình bậc 2 trong Java như thế nào?

 Mục tiêu : Sử dụng câu lệnh điều kiện

 Yêu cầu : Giải bài toán tìm nghiệm phương trình bậc hai : ax2 + bx + c =0, với a # 0

Tương tự như cách giải bài toán phương trình bậc nhất, trong bài này mình vẫn sẽ sử dụng phương pháp tách hàm quen thuộc.

Ở đây mình tách thành 2 hàm NhapSoNguyen, GiaiPTbac2 và phương thức main

Bạn chạy chương trình, nhập vào hệ số phương trình sẽ thấy được kết quả

Những bài bạn nên xem:

2.8

/

5

(

17

bình chọn

)

Cập nhật thông tin chi tiết về Luyện Tập Về Thừa Kế Trong Java trên website Ictu-hanoi.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!