Xây dựng lớp điểm trong java

Bản quyền thuộc về TITV.vn, 

vui lòng không đăng tải lại nội dung từ trang này.

 Sơ đồ lớp 

public class MyDate { private int day; private int month; private int year; public MyDate[int d, int m, int y] { this.day = d; this.month = m; this.year = y; } public void printDay[] { System.out.println["Day: "+this.day]; } public void printMonth[] { System.out.println["Month: "+this.month]; } public void printYear[] { System.out.println["Year: "+this.year]; } public void printDate[] { System.out.println["Date: "+this.day+"-"+this.month+"-"+this.year]; } } public class Main { public static void main[String[] args] { int d; MyDate md = new MyDate[25, 2, 2029]; md.printDay[]; md.printMonth[]; md.printYear[]; md.printDate[]; } }

  • Lớp Class
  • Phương thức
  • Tạo class
  • Thuộc tính

Lớp [class] là mô tả về các đối tượng sẽ được tạo ra. Mỗi lớp có tên lớp, trong lớp có các thuộc tính như là dữ liệu của lớp và các ứng xử của lớp đó [các hàm] gọi là các phương thức.

Ví dụ một lớp mô tả về con người có thể có:

  • Các thuộc tính: tên, chiều cao, cân nặng, giới tính, tuổi ...
  • Các ứng xử: đi, chạy, nhảy, nói, ngủ ...

Từ lớp con người như vậy tạo ra các đối tượng cụ thể khi chạy chương trình như: Đàn ông, Phụ nữ, Bạn A, Bạn B ...

Các lớp [class] được định nghĩa bằng cách dùng từ khóa class sẽ tìm hiểu sau, ví dụ:

public class ClassName { //... Định nghĩa các thuộc tính //... Định nghĩa các phương thức }

Phương thức là gì?

Các phương thức [method] định nghĩa ứng xử của lớp. Một phương thức là một tập hợp các khối lệnh [code] để thi hành một chức năng nào đó. Ví dụ như System.out.println[] đã biết, là một phương thức. Bạn có thể định nghĩa phương thức riêng của bạn, thi hành với một nhiệm vụ cụ thể nào đó

Hãy xem ví dụ sau:

class MyClass { static void sayHello[] { System.out.println["Hello World!"]; } public static void main[String[ ] args] { sayHello[]; } } //Xuất ra: "Hello World!"

Trong ví dụ trên, đã định nghĩa một phương thức sayHello[], phương thức đó được hàm main[] gọi để in ra lời chào mừng. Như vậy để gọi phương thức để thi hành code chỉ cần viết tên phương thức và truyền các tham số nếu cần thiết. Một phương thức có thể gọi bao nhiêu lần là tùy mục đích.

Phần khai báo phương thức tên bạn thấy ngoài tên phương thức là sayHello và code của phương thức trong khối {...} thì bạn còn thấy:

  • static từ khóa này trước tên phương thức cho biết phương thức được gọi mà không cần thiết phải tạo đối tượng của phương thức, ngoài từ khóa này còn có các từ khóa như public, protected, private sẽ tìm hiểu kỹ ở phần phạm vi truy cập [Access modifier] Java
  • void cho biết phương thức này khi kết thúc không trả về dữ liệu gì, nếu sau này phương thức cần trả về dữ liệu thì thay bằng void bằng kiểu dữ liệu trả về như int, String ...

Tham số của phương thức

Bạn có thể tạo phương thức chấp nhận các tham số truyền vào. Tham số được mô tả trong dấu cặp ngoặc [], các tham số mô tả bởi kiểu dữ liệu và tên tham số, nhiều tham số thì cách nhau bởi dấu phảy ,

Ví dụ phương thức sau có tên welcome, có một tham số kiểu String có tên là name

class MyClass { static void welcome[String name] { System.out.println["Xin chào, " + name]; } public static void main[String[ ] args] { welcome["Minh"]; welcome["An"]; welcome["Tý"]; } } // Xuất ra: // Xin chào, Minh // Xin chào, An // Xin chào, Tý

Tham số tùy chọn

Java có cách khai báo tham số cho phương thức mà khi gọi phương thức số lượng giá trị truyền vào là tùy thích cách nhau bởi dấu phảy ,. Các giá trị tham số phương thức nhận được lưu trong một mảng. Khai báo kiểu tham số này sử dụng ký hiệu ba chấm ... [Kiểu-dữ-liệu ... tên-biến].

Hãy xem ví dụ sau, phương thức showProductNames[] có tham số tùy chọn có tên names như sau:

class MyClass { // Phương thức tham số tùy chọn // names là mảng chứa các chuỗi static void showProductNames[String ... names] { int sotenSanpham = names.length; System.out.println["Số tên sản phẩm: " + sotenSanpham]; // Duyệt qua phần tử mảng các tham số for [String name : names] { System.out.println[name]; } } public static void main[String[ ] args] { showProductNames["Iphone 8", "Note 10", "Macbook Pro"]; } } // In ra: // Số tên sản phẩm: 3 // Iphone 8 // Note 10 // Macbook Pro

Ví dụ trên, tham số names như là mảng truyền vào phương thức. Số phần tử quyết định khi truyền tham số cho hàm, như trên là 3 phần tử.

Giá trị trả về của phương thức

Một phương thức có thể có giá trị trả về, sử dụng từ khóa return trong thân phương thức để kết thúc và trả về giá trị, hãy xem phương thức sau:

// Phương thức sum trả về kiểu int, là tổng của hai tham số static int sum[int val1, int val2] { // phương thức kết thúc khi gặp return return val1 + val2; }

Chú ý trong định nghĩa phương thức, kiểu trả về phải được định nghĩa trước tên phương thức, như trên đó là kiểu int.

Giờ là ví dụ sử dụng phương thức trên

class MyClass { static int sum[int val1, int val2] { return val1 + val2; } public static void main[String[ ] args] { // giá trị trả về của sum lưu vào biến x int x = sum[2, 5]; System.out.println[x]; } } // Outputs "7"

Bạn thấy, giá trị trả về của phương thức đã được gán vào biến x.

Khi phương thức bạn xây dựng mà không có giá trị trả về thì cần phải khai báo với từ khóa void.

// trả về giá trị kiểu int, số 5 static int returnFive[] { return 5; } // phương thức có tham số, nhưng không có giá trị trả về static void sayHelloTo[String name] { System.out.println["Hello " + name]; }

Tạo lớp class trong Java

Trong Eclipse sau khi tạo dự án Java mới. Bạn có thể tạo ra một lớp bằng lệnh File > New > Class trong hộp thoại hiện thị nhập tên của class, ví dụ nhập Animal

Eclipse sẽ tạo ra file Animal.java, và khai báo sẵn lớp Animal trong file đó giúp bạn

Animal.java

package animals; public class Animal { }

Giờ thêm một phương thức có tên bark[] trong lớp

Animal.java

package animals; public class Animal { public void bark[] { System.out.println["Gâu Gâu ..."]; } }

Như vậy đã có lớp Animal, trong lớp có phương thức bark[]

Ta thấy phương thức bark[] khai báo không có từ khóa public static như các ví dụ trước đây, điều này có nghĩa để gọi được hàm này cần phải tạo ra đối tượng cụ thể cho lớp Animal.

Ví dụ sử dụng lớp đó trong hàm main của lớp MyClass. Đối tượng mới của lớp tạo ra bằng từ khóa new

// Nạp package import animals.Animal; class MyClass { public static void main[String[] args] { Animal dog = new Animal[]; dog.bark[]; } } // Outputs "Gâu Gâu ..."

Trong ví dụ trên ta đã tạo ra đối tượng Animal lưu trong dog và để truy cập vào các phương thức và thuộc tính dùng dấu châm và tên phương thức, thuộc tính như dog.bark[]

Thuộc tính của lớp

Như ta đã biết lớp có thuộc tính và phương thức. Thuộc tính cơ bản là biến bên trong một lớp, nó là thành viên lưu trữ dữ liệu của lớp. Ví dụ tạo ra lớp với phương thức và thuộc tính như sau:

public class Vehicle { int maxSpeed; int wheels; String color; double fuelCapacity; void horn[] { System.out.println["Beep!"]; } }

maxSpeed, wheels, color, fuelCapacity là các thuộc tính của lớp, còn horn[] là phương thức.

Ví dụ sử dụng

class MyClass { public static void main[String[] args] { //Tạo ra v1, v2 đối tượng của lớp Vehicle v1 = new Vehicle[]; Vehicle v2 = new Vehicle[]; //Gán giá trị cho thuộc tính v1.color = "red"; //Truy cập phương thức v2.horn[]; //Đọc thuộc tính của đối tượng String colorv1 = v1.color; } } //Xuất //Beep!

Tham khảo mã nguồn ClassAndMethod [git] hoặc tải về source-methodandclass

Bài 1

ây dựng lớp Pointbiểu diễn các điểm trong không gian 2 chiều với các tọa độ nguyên. Lớp Pointcũng cung cấp các thao tác hay dùng trên các điểm. a] Khai báo lớp Pointvới các biến nguyên int x, int ylưu trữ hoành độ và tung độ của điểm. b] Tạo các constructor sau cho lớp Point: - Point[int x, int y]: tạo điểm có hoành độ x, tung độ y. - Point[]: tạo điểm ở gốc tọa độ [0, 0]. - Point[Point p]: tạo điểm ở vị trí của điểm p. c] Khai báo biến static originbiểu diễn gốc tọa độ [0, 0]. d] Override các phương thức sau của lớp Object: - boolean equals[Object obj]: kiểm tra xem điểm có trùng với điểm được cho. - String toString[]: trả về chuỗi biểu diễn cho điểm dạng [x, y]. e] Tạo các getter và setter cho x, y. f] Tạo các phương thức sau cho lớp Pointđể thực hiện các thao tác tương ứng: - boolean isOrigin[]: kiểm tra xem điểm có phải là gốc tọa độ [0, 0]. - void move[int x, int y]: di chuyển điểm đến tọa độ mới [x, y]. - void translate[int dx, int dy]: tịnh tiến điểm theo vector tịnh tiến [dx, dy].Điểm [x, y] sau khi tịnh tiến theo vector tịnh tiến [dx, dy] sẽ thành điểm [x+ dx, y+ dy]. - static double distance[int x1, int y1, int x2, int y2]: tính khoảng cách giữa điểm [x1, y1] và điểm [x2, y2]. - static double distance[Point p1, Point p2]: tính khoảng cách giữa điểm p1và p2. - double distance[int x, int y]: tính khoảng cách từ điểm đến điểm [x, y]. - double distance[Point p]: tính khoảng cách từ điểm đến điểm p. - double distance[double a, double b, double c]: tính khoảng cách từ điểm đến đường thẳng có phương trình tổng quát ax + by + c = 0. bài làm của tớ :

public class Point { private int x; private int y; public static Point origin = new Point[];//Khai báo biến static originbiểu diễn gốc tọa độ [0, 0]. public Point[int x, int y] {//khoi tao Point co toa do xy this.x = x; this.y = y; } public Point[] {//khoi tao voi toa so 0;0 this.x = 0; this.y = 0; } public Point[Point p] {//viet ra thui hem hieu co giong y cua de bai khong this.x = p.x; this.y = p.y; } //tao Set va get cho x va y public int getX[] { return x; } public int getY[] { return y; } public void setX[int x] { this.x = x; } public void setY[int y] { this.y = y; } //Override các phương thức sau của lớp Object @Override public boolean equals[Object obj] {//ham khong lam viec Point a = new Point[x, y]; if [obj.equals[a]] { return true; } else { return false; } } @Override public String toString[] { return "[+" + this.x + "," + this.y + "]"; } //boolean isOrigin[]: kiểm tra xem điểm có phải là gốc tọa độ [0, 0]. public boolean isOrigin[] { Point a = new Point[this.x, this.y]; if [a == origin] { return true; } else { return false; } } //void move[int x, int y]: di chuyển điểm đến tọa độ mới [x, y]. public void move[int x, int y] { this.x = x; this.y = y; } //void translate[int dx, int dy]: tịnh tiến điểm theo vector tịnh tiến [dx, //dy].Điểm [x, y] sau khi tịnh tiến theo vector tịnh tiến [dx, dy] sẽ thành điểm [x+ dx, y+ //dy]. public void translate[int dx, int dy] { this.x = this.x + dx; this.y = this.y + dy; } //static double distance[int x1, int y1, int x2, int y2]: tính //khoảng cách giữa điểm [x1, y1] và điểm [x2, y2]. public static double distance[int x1, int y1, int x2, int y2] { double kc; kc = Math.sqrt[Math.pow[[x1 - x2], 2] + Math.pow[[y1 - y2], 2]]; return kc; } //static double distance[Point p1, Point p2]: tính khoảng cách giữa //điểm p1và p2. public static double distance[Point p1, Point p2] { double kc; kc = Math.sqrt[Math.pow[[p1.x - p2.x], 2] + Math.pow[[p1.y - p2.y], 2]]; return kc; } //double distance[int x, int y]: tính khoảng cách từ điểm đến điểm [x, y]. public double distance[int x, int y] { double kc; kc = Math.sqrt[Math.pow[this.x - x, 2] + Math.pow[this.y - y, 2]]; return kc; } //double distance[Point p]: tính khoảng cách từ điểm đến điểm p. public double distance[Point p] { double kc; kc = Math.sqrt[Math.pow[this.x - p.x, 2] + Math.pow[this.y - p.y, 2]]; return kc; } //double distance[double a, double b, double c]: tính khoảng cách từ //điểm đến đường thẳng có phương trình tổng quát ax + by + c = 0 public double distance[double a, double b, double c] { double kc; double _x1; _x1 = Math.sqrt[Math.pow[a, 2] + Math.pow[b, 2]]; double _x2; _x2 = Math.abs[a * this.x + b * this.y + c]; kc = _x2 / _x1; return kc; } }

ai giải thích lớp Object và cách Override các phương thức của nó

sr vì mới tham gia diễn đàn nên mình không biết chỗ nào để hỏi đáp nên post tạm bài vào mục này

1.thích lớp Object
Lớp Object là một lớp cha của tất cả các lớp. Dù là một lớp do người dùng định nghĩa không thừa kế lại bất kỳ một lớp nào khác, theo mặc định nó thừa kế lớp Object.
2.
Code của bạn :

@Override public boolean equals[Object obj] { Point a = new Point[x, y]; if [obj.equals[a]] { return true; } else { return false; } }

Ở đây bạn không cần phải ghi đè phương thức equals của Object làm gì cả . Bạn có thể viết một phương thức equals khác như sau :

@Override public boolean equals[Point obj] { if[this.x=obj.x&&this.y=obj.y] { return true; }else { return false; } }

Vậy là xong...

Reactions: trieutulonga

Nếu đề bài bắt buộc phải ghi đè phương thức equals[Object] thì trước hết xét đối tượng được truyền vào có phải là kiểu Point của bạn không, nếu không phải thì trả về false, nếu đúng là kiểu Point thì làm xét đến x và y như thang7788

Reactions: trieutulonga

thanks bạn nhưng phải làm theo yêu cầu của đề bài là Override từ lớp Object

Nếu đề bài bắt buộc phải ghi đè phương thức equals[Object] thì trước hết xét đối tượng được truyền vào có phải là kiểu Point của bạn không, nếu không phải thì trả về false, nếu đúng là kiểu Point thì làm xét đến x và y như thang7788

bạn có thể hàm kiểm tra đối tượng có thuộc lớp Point không vì đề bắt buộc
Override

hình như nó có một câu lênh: instanceof dùng để kiểm tra nó có phải đối tượng mình cần hay không. Cụ thể:

Object p = new Point[120, 3]; // p = null; if [p instanceof Point] { System.out.println["true"]; } else { System.out.println["false"]; }

Kết quả là true
nhưng nếu đối tượng là null thì kết quả là false

Đối với equals[Object] bạn có thể làm như sau:


@Override public boolean equals[Object obj] { // Nếu đúng thì kiểm tra tiếp, sai thì trả về false if [obj instanceof Point] { // ép kiểu về Point, không xảy ra ngoại lệ vì đã kiểm tra và chắc chắn nó là kiểu Point. Point p = [Point] obj; // Nếu tọa độ bằng nhau. if [this.x = p.x && this.y = p.y] { return true; } } return false; }

Có thể ép kiểu luôn ngay trong câu lênh if để cho gọn
Bảo vệ 1: - Mày có phải là con cháu gì của dòng họ Point không? Tôi: - Dạ không ạ. => xéo ngay. ---- Tôi: Dạ đúng. Bảo vệ 1: Vào gặp Bảo vệ 2! Bảo vẹ 2: mày cao bảo nhiêu... balah..

]

Viết tay, không dùng IDE nên có thể có sai sót

Reactions: thang7788 and trieutulonga

g] Viết chương trình sử dụng lớp Pointtrên để giải bài toán sau: Cho hình chữ nhật ABCDnhư hình vẽ

Tìm trên cạnh ABđiểm Mtọa độ nguyên sao cho chu vi tam giác MCDlà lớn nhất. code của tớ

class test1 { public static final double CD = 60; public static void main[String[] args] { int i; Point[] M = new Point[100]; double CV[] = new double[100];//khoi tao mang double voi 500 phan tu for [i = 0; i p1.getX[] ? p1.getX[] : p2.getX[]; i p1.getX[] ? p2.getX[] : p1.getX[]]; i++] { temp = new Point[i, p2.getY[]]; // Tính chu vi ptemp = Math.abs[p1.getX[] - p2.getX[]] + p1.distance[temp] + new Point[p2.getX[], p1.getY[]].distance[temp]; if [perimeter < ptemp] { MPoints[0] = temp; perimeter = ptemp; } } // Luôn cho chạy từ số nhỏ đến số lớn for [int i = p2.getX[] > p1.getX[] ? p1.getX[] : p2.getX[]; i p1.getX[] ? p2.getX[] : p1.getX[]]; i++] { temp = new Point[i, p2.getY[]]; // Tính chu vi ptemp = Math.abs[p1.getX[] - p2.getX[]] + p1.distance[temp] + new Point[p2.getX[], p1.getY[]].distance[temp]; // Xét nó có chu vi bằng không, nhưng loại bỏ trường hợp có tọa độ x bằng nhau if [perimeter == ptemp && MPoints[0].getX[] != i] { // Thêm vào mảng MPoints = addElement[MPoints, temp]; } } return MPoints; } // Thêm phần tử vào mảng. private Point[] addElement[Point[] array, Point e] { Point[] result = new Point[array.length + 1]; for [int i = 0; i < array.length; i++] { result[i] = array[i]; } result[result.length - 1] = e; return result; } }

Reactions: trieutulonga

thanhks bạn mình làm được rồi ,mình sử dụng arrayList , cách làm gần giống với cách tách nguyên âm từ chuỗi String [cho vao arrayList rồi lại đẩy nó ra array]

Video liên quan

Bài Viết Liên Quan

Chủ Đề