Bài tập về Class tạo Rectangle trong Java

Em chào mọi người

Em muốn hỏi 1 tí về câu 4, dấu chấm đen số 3 và dấu chấm đen số 4.
Em không hiểu cách tạo arr trong 1 class cho lắm, với lại tại sao lại cần cái private arrangeCorners() kia.
Ở dấu chấm đen yêu cầu số 3, em đã tạo Point[] corners = new Point[4] trong class rectangle nhưng lại không tạo được corners [i] = new Point(x,y);
ex3

ex44

package Assignment5;

public class Point 
{
    private int x;
    private int y;
    
    //A no-arg constructor
    Point()
    {
        x = 0;
        y = 0;
    }
    
    //A constructor for all data fields
    Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public int getX()
    {
        return x;
    }
    public int getY()
    {
        return y;
    }
    
    //moveTo() method
    public void moveTo(int dX, int dY)
    {
        x += dX;
        y += dY;
    }
    
    //toString() method
    public String toString()
    {
        String output = "";
        output += "Co-ordinate of X: " + x + " Co-ordinate of Y: " + y;
        return output;
    }
}
package Assignment5;

public class Rectangle
{
    private int width;
    private int height;
    private int x;
    private int y;
    //Constructor
    Rectangle(int x, int y, int width, int height)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    //Getters
    public int getX()
    {
        return x;
    }
    public int getY()
    {
        return y;
    }
    public int getWidth()
    {
        return width;
    }
    public int getHeight()
    {
        return height;
    }
//    public String toString()
//    {
//        
//    }
    
}

package Assignment5;
import java.util.*;
public class Assignment5 
{

    public static void main(String[] args) 
    {
        Scanner input = new Scanner(System.in);
        
        //Excercise1
//        Fan fan1 = new Fan(Fan.FAST, true, 4, "yellow");
//        Fan fan2 = new Fan();
//       
//        fan2.setSpeed(Fan.MEDIUM);
//        fan2.setRadius(7);
//        fan2.setColor("red");
//        System.out.println(fan1.toString());
//        System.out.println(fan2.toString());
        
        //Excercise2
//        Car c1 = new Car("Toyota", "Camry", 2012, 12000);
//        Car c2 = new Car("", "", 2, 3);
//        Car c3 = new Car("", "", 2, 3);
//        System.out.println(c1.toString());
        
        //Excercise3
//        Point[] arrPoint = new Point[4];
//        
//        for(int i = 0; i < 4; i++)
//        {
//            int valueX, valueY;
//            System.out.print("Enter x co-ordinate: ");
//            valueX = input.nextInt();
//            System.out.print("Enter y co-ordinate: ");
//            valueY = input.nextInt();
//            arrPoint[i] = new Point(valueX, valueY);          
//        }
//        
//        for(int i = 0; i < 4; i++)
//        {
//            System.out.print("Value of point " + i + ": ");
//            System.out.print("x co-ordinate: " + arrPoint[i].getX());
//            System.out.println(" y co-ordinate: " + arrPoint[i].getY());
//        }
        //Excercise4
//        Point[] corners = new Point[4];
//        
//        for (int i = 0; i < 4; i++)
//        {
//            corners[i] = new Point();
//        }
         
    }
    
}

Tại vì bài tập có liên quan đến việc sử dụng class Point nên em up 3 file em đã làm dở ạ.

4 posts were merged into #1

  1. Theo đề mô tả thì phương thức moveTo nhận tham số là tọa độ mới của điểm đó, không phải giá trị dịch chuyển. Tên của phương thức cũng nói lên điều đó. Đi đến Huế là đi đến Huế, đâu phải đi “Huế” kilomet.

  2. Các trường (field) mà đề bài yêu cầu đều là các giá trị của lớp (class). Bài 4 có trường 4 kiểu int và 1 mảng kiểu Point cho lớp Retangle.

  3. Phương thức arrangeCorners phải là riêng (private) và chỉ lớp Retangle mới được phép gọi đến, nó quản lý quá trình thay đổi dữ liệu tương ứng.

    Nhà, bố mẹ bảo khi có lệnh nấu_ăn thì bạn sẽ tự đi bắt gà nhà và làm thịt, bạn có cho phép nhận lệnh từ bất cứ ai hay không? Hàng xóm, người lạ, quái vật ra lệnh là bạn chạy đi làm thịt gà nhà? Hay chỉ cha mẹ bạn ra lệnh mới được?
    Đó cũng là lý do mỗi trường đều có getter hoặc setter.

    Trong phương thức này tính toán 4 tọa độ dựa vào x, y, widthheight và gán nó vào mảng yêu cầu (corners).

  4. Phương thức toString hiện 4 giá trị kiểu int và hiện danh sách mảng kiểu Point, gọi đến toString của lớp Point.

3 Likes

Em tạm thời sửa bài 4 theo chỉ dẫn của anh trước

package Assignment5;

public class Rectangle
{
    private int width;
    private int height;
    private int x;
    private int y;
    Point[] corners = new Point[4];
    
    //Constructor
    Rectangle(int x, int y, int width, int height)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        arrangeCorners();
    }
    
    //Private arrangeCorners() method
    private void arrangeCorners()
    {
  
    this.corners[0] = new Point(x, y); // Upper-left corner
    this.corners[1] = new Point(x + width, y); //Upper-right corner
    this.corners[2] = new Point(x, y - height); //Lower left-corner
    this.corners[3] = new Point(x + width, y - height); // Lower-right corner
    }
    
    //Getters
    public int getX()
    {
        return x;
    }
    public int getY()
    {
        return y;
    }
    public int getWidth()
    {
        return width;
    }
    public int getHeight()
    {
        return height;
    }
    
    public String toString()
    {
        String output = "";
        output += "x = " + x +"\ny = " + y;
        output += "\nWidth = " + width +"\nHeight = " + height;
        for (int i = 0; i < 4; i++)
        {
            output += "Point " + i + ": ";
            output += corners[i].toString() + "\n";
            
        }
        return output;
    }
    
}

Code ở main:

package Assignment5;
import java.util.*;
public class Assignment5 
{

    public static void main(String[] args) 
    {
  //Excercise4
        Rectangle rectangle1 = new Rectangle(3, 4, 7, 8);
        Rectangle rectangle2 = new Rectangle(1,2, 4, 6);
        System.out.println(rectangle1.toString());

    }
    
}

Qua lời anh hướng dẫn thì em hiểu 1 vài ý như sau không biết đúng không

  1. Việc thực hiện khởi tạo 1 giá trị nào trong class đều buộc phải được thực hiện thông qua method, properties chỉ là phần để em DECLARE VARIABLE không phải để INITIALIZATION?
  2. Việc thực hiện this nhiều khi chỉ cần thiết khi em có sự trùng lặp? Ở method arrangeCorners, việc em dùng this.corners[i] đôi khi không cần thiết , chẳng hạn
{
       this.x = x;
}
  1. Đối với moveTo(), tại sao người ta không dùng constructor để thay đổi giá trị của biến thành vị trí mới, mà lại dùng method moveTo() để thay đổi giá trị của x,y?
  2. Trong 1 bài ví dụ em có đọc thì trong class họ có làm như sau:
public static final int FAST = 3;

Việc truy cập đến giá trị này đại loại kiểu

Fan fan1 = new Fan(Fan.FAST, true, 4, "yellow");

Ngay cả khi hằng này đã được public thì vẫn buộc phải dùng thêm static thay vì

public final int FAST = 3;

thì mới có thể lấy được giá trị thông qua cách gọi Fan.FAST?
Em cảm ơn nhiều về hướng dẫn của anh ạ.

1 Like

Bạn làm tốt đấy.

Trả lời cho các câu hỏi của bạn:

  1. Việc gán (assignment) giá trị qua phương thức nhằm đảm bảo toàn vẹn dữ liệu. Ví dụ, lớp Retangle bạn nhập 2 chiều là số âm xem điều gì xảy ra? Trong thực tế có hình nào có kích thước <= 0? Vì thế việc truyền giá trị vào phương thức để bên trong phương thức có thể thực hiện kiểm tra, rà soát lỗi, thông báo, chỉnh sửa hoặc quăng ngoại lệ (exception).
    Do đề bài này yêu cầu sao thì làm vậy, khoản xét lỗi giá trị không dùng.
  2. Việc dùng this là nên (được khuyến cáo), tất nhiên là bạn không dùng vẫn được nếu không có trường cục bộ (phương thức) nào trùng tên với trường toàn cục (lớp). Nên dùng để dễ phân biệt, biết đâu 1 ngày bạn vô tình thêm 1 trường cục bộ trùng tên với toàn cục nó lại xảy ra lỗi mà bạn không ngờ tới thì sao.
  3. Phương thức moveTo nhằm mục đích thay đổi giá trị của thực thể hiện tại chứ không phải tạo mới (gọi đến hàm dựng (constructor)). Bạn đi đến Huế chứ không phải đứa bé mới sinh nào khác tại Huế.
  4. Trường tĩnh (static field) là giá trị chung cho cả lớp. Nó chỉ được tạo 1 lần duy nhất lúc máy ảo java chạy. Các thực thể của lớp đều có thể dùng chung nó.
    Nói cho gọn thì nó là giá trị của lớp (class variable); còn các trường không tĩnh (không có static) là giá trị của thực thể (instance variable).
    Giá trị của thực thể được tạo mới mỗi lần gọi new constructor().
    public class X{ // Bắt đầu lớp X...
        public static int public_satic_val = 1234;
        public static final int public_static_final_val = 5678; // final = constant. Hằng số, bắt buộc gán giá trị lúc khai báo.
        public int public_val = 0;
        private int private_val = 1;
        // ...
    } // ...kết thúc lớp X
    // ...
    public class Test{
        public static void main(String[] args){
            int test_val;
            test_val = X.public_static_val; // Gọi trường tĩnh trực tiếp từ tên lớp.
            test_val = X.public_static_final_val; // Như trên.
    
            X.public_static_final_val = 9999; // Không thể gán giá trị mới cho hằng số.
    
            test_val = X.public_val; // Lỗi! Không thể gọi từ tên lớp đối với giá trị của thực thể.
            test_val = X.private_val; // Lỗi! Như trên và hơn thế nữa.
    
            // Muốn gọi giá trị của thực thể phải tạo
            X little_x = new X();
            test_val = little_x.public_val; // Được rồi đấy.
            test_val = little_x.private_val; // Lỗi! Chỉ được gọi bên trong lớp X.
        }
    }
    
Có thể bạn quan tâm

java access modifiers.
Access Levels

Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?