CodeGym/Blog Java/Ngẫu nhiên/Các lớp Java: viết các lớp, hàm tạo của riêng bạn

Các lớp Java: viết các lớp, hàm tạo của riêng bạn

Xuất bản trong nhóm
CHÀO! Hôm nay chúng ta sẽ nói về các lớp trong Java. Bạn có thể nói rằng các lớp tạo thành nền tảng của lập trình Java. Khi bạn trở thành một lập trình viên, gần như toàn bộ công việc của bạn sẽ là viết các lớp của riêng bạn có nhiều chức năng khác nhau. Hãy xem điều đó có nghĩa là gì và nó hoạt động như thế nào. :) Như các bạn đã biết Java là ngôn ngữ lập trình hướng đối tượng. Tất cả các chương trình bao gồm các đối tượng theo cách này hay cách khác có liên quan đến nhau. Về cơ bản, một lớp là một khuôn mẫu cho một đối tượng. Nó xác định đối tượng sẽ trông như thế nào và nó sẽ có những chức năng gì. Mỗi đối tượng là một đối tượng của một số lớp. Hãy xem xét ví dụ rất đơn giản này:
public class Cat {

    String name;
    int age;

}
Giả sử chúng ta đang viết một chương trình liên quan đến mèo vì một lý do nào đó (ví dụ: chúng ta có một phòng khám thú y cung cấp quyền truy cập vào tài khoản trực tuyến). Chúng ta đã tạo một lớp Cat và khai báo hai biến trong đó: String nameint age . Các biến thành viên này được gọi là các trường. Về cơ bản, đây là mẫu cho tất cả những con mèo mà chúng tôi sẽ tạo trong tương lai. Mỗi đối tượng Cat sẽ có hai biến: tên và tuổi.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
    }

}
Đây là cách nó hoạt động! Chúng tôi tạo một con mèo, đặt tên và tuổi cho nó, rồi hiển thị tất cả trên bảng điều khiển. Miếng bánh. :) Thường xuyên hơn không, các lớp mô tả các sự vật và hiện tượng trong thế giới thực. Một con mèo, một cái bàn, một người, một tia chớp, một trang sách, một bánh xe—bạn sẽ tạo ra tất cả những thứ này trong chương trình của mình bằng cách sử dụng các lớp riêng lẻ. Bây giờ, hãy tập trung vào các biến mà chúng ta đã khai báo trong lớp Cat . Chúng được gọi là các trường hoặc biến thể hiện. Tên của họ thực sự nói lên tất cả. Mỗi thể hiện (hoặc đối tượng) của lớp Cat sẽ có các biến này. Mỗi con mèo chúng ta tạo ra sẽ có biến tên riêng và tuổi riêngBiến đổi. Điều này có ý nghĩa - về cơ bản nó giống với mèo thật. :) Ngoài biến thể hiện còn có biến lớp (biến tĩnh). Hãy kết thúc ví dụ của chúng tôi:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        Cat fluffy = new Cat();
        fluffy.age = 5;
        fluffy.name = "Fluffy";
        count++;

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
        System.out.println("We created a cat named " + fluffy.name + ". His age is " + fluffy.age);

        System.out.println("Total number of cats = " + count);
    }
}
Đầu ra bảng điều khiển: Chúng tôi đã tạo một con mèo tên là Smudge. Tuổi của anh ấy là 3 Chúng tôi đã tạo ra một con mèo tên là Fluffy. Tuổi của anh ấy là 5 Tổng số mèo = 2 Bây giờ lớp của chúng ta có một biến mới gọi là số đếm. Nó chịu trách nhiệm đếm những con mèo được tạo ra. Mỗi khi chúng ta tạo một con mèo trong phần chínhta tăng biến này lên 1. Biến này được khai báo bằng từ khóa static. Điều đó có nghĩa là nó thuộc về lớp, không thuộc về một đối tượng cụ thể của lớp. Tất nhiên, điều này có ý nghĩa: tên của mỗi con mèo thuộc về con mèo cụ thể đó, nhưng chúng ta cần một bộ đếm mèo áp dụng cho tất cả chúng. Đây chính xác là những gì mà từ khóa tĩnh đạt được: nó biến biến đếm thành một biến duy nhất cho tất cả các con mèo. Lưu ý: khi chúng tôi hiển thị biến, chúng tôi không sử dụng smudge.count hoặc smooth.count. Nó không thuộc về Smudge hay Fluffy; nó thuộc về toàn bộ lớp Cat . Đó là lý do tại sao nó chỉ đơn giản là đếm. Bạn cũng có thể viết Cat.count. Điều đó cũng sẽ đúng. Khi hiển thị biến name, chúng ta sẽ không làm như sau:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        System.out.println("We created a cat named " + name + ". His age is " + smudge.age);

        System.out.println("Total number of cats = " + count);
    }
}
Đây là một lỗi! Mỗi con mèo có tên riêng của mình. Trình biên dịch bị nhầm lẫn ở đây. "Xuất tên ra bàn điều khiển? Tên của ai?" :/"

phương pháp

Ngoài các biến, mỗi lớp có các phương thức. Chúng ta sẽ nói về chúng chi tiết hơn trong một bài học riêng, nhưng các nguyên tắc chung khá đơn giản. Các phương thức xác định chức năng của lớp, nghĩa là những đối tượng nào trong lớp của bạn có thể thực hiện. Bạn đã quen với một trong những phương thức này: phương thức main() . Tuy nhiên, như bạn có thể nhớ, phương thức chính là tĩnh, có nghĩa là nó thuộc về toàn bộ lớp (logic cũng giống như đối với các biến). Tuy nhiên, các phương thức tiêu chuẩn, không tĩnh chỉ có thể được gọi trên các đối tượng cụ thể mà chúng tôi đã tạo. Ví dụ, nếu chúng ta muốn viết một lớp mèo, chúng ta cần biết một con mèo trong chương trình của chúng ta nên có những chức năng gì. Trên tiền đề đó, hãy viết một vài phương thức cho con mèo của chúng ta:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Pounce!");
    }

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        smudge.sayMeow();
        smudge.jump();

    }
}
Kiểm tra nó ra! Bây giờ lớp học của chúng tôi gần giống với một con mèo hơn nhiều! Bây giờ chúng ta không chỉ có một con mèo có tên ("Smudge") và tuổi (3). Anh ấy cũng có thể nói meo meo và nhảy! Nó sẽ là loại mèo gì nếu không có "chức năng" đó? :) Chúng ta đang lấy một đối tượng cụ thể (smudge) và gọi các phương thức sayMeow()jump() của nó . Hãy nhìn vào bảng điều khiển: Meow! Vồ lấy! Một con mèo thực sự! :)

Tạo các lớp học của riêng bạn. trừu tượng

Trong tương lai, bạn sẽ phải viết các lớp của riêng mình. Bạn cần chú ý điều gì khi viết chúng? Nếu chúng ta đang nói về các biến, thì bạn sẽ cần sử dụng một thứ gọi là trừu tượng hóa. Trừu tượng hóa là một trong bốn nguyên tắc cơ bản của lập trình hướng đối tượng. Nó có nghĩa là trích xuất các đặc điểm quan trọng và quan trọng nhất của một mặt hàng và ngược lại, loại bỏ những đặc điểm nhỏ hoặc không đáng kể. Ví dụ: hãy tạo một tủ hồ sơ cho nhân viên công ty. Để tạo các đối tượng nhân viên, chúng tôi đã viết một nhân viênlớp học. Những đặc điểm nào là mô tả quan trọng của một nhân viên đối với tủ hồ sơ của công ty chúng tôi? Tên, ngày sinh, SSN và ID nhân viên. Nhưng không chắc chúng ta sẽ cần chiều cao, màu mắt hoặc màu tóc của nhân viên cho hồ sơ nhân viên của công ty. Các công ty không cần thông tin này. Vì vậy, trong lớp Nhân viên , chúng ta khai báo các biến sau: String name , int age , int socialSecurityNumberint employeeId. Và chúng tôi loại bỏ những thông tin không cần thiết (như màu mắt). Nói cách khác, chúng tôi tạo ra một sự trừu tượng. Tuy nhiên, nếu chúng tôi làm tủ hồ sơ cho các công ty người mẫu, tình hình sẽ thay đổi đáng kể. Chiều cao, màu mắt và màu tóc của người mẫu là những đặc điểm quan trọng, nhưng SSN của cô ấy hoàn toàn không liên quan đến chúng tôi. Vì vậy, trong lớp Model , chúng ta cần tạo các biến sau: Chiều cao chuỗi , Tóc chuỗi , Mắt chuỗi . Đó là cách trừu tượng hoạt động - thật dễ dàng! :)

nhà xây dựng

Hãy quay lại ví dụ về con mèo của chúng ta.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();

        System.out.println("Here the program does something for 2 hours...");

        smudge.age = 3;
        smudge.name = "Smudge";

    }
}
Xem qua mã này và cố gắng tìm ra điều gì sai với chương trình của chúng ta. Chương trình của chúng tôi có một con mèo không có tên hoặc tuổi trong 2 giờ! Tất nhiên, điều này vốn đã sai. Cơ sở dữ liệu của phòng khám thú y không nên bao gồm những con mèo không có thông tin. Hiện tại, con mèo của chúng tôi đang được lập trình viên thương xót. Chúng tôi tin tưởng rằng anh ấy sẽ không quên chỉ định tên và tuổi, và mọi thứ sẽ ổn. Nếu anh ta quên, cơ sở dữ liệu sẽ gặp sự cố: những con mèo không tên. Làm thế nào chúng ta có thể giải quyết vấn đề này? Chúng ta phải bằng cách nào đó ngăn chặn việc tạo ra những con mèo không có tên và tuổi. Đây là nơi các nhà xây dựng đến để giải cứu. Hãy đưa ra một ví dụ:
public class Cat {

    String name;
    int age;

    // Constructor for the Cat class
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
    }
}
Về cơ bản, hàm tạo là khuôn mẫu cho các đối tượng của một lớp. Trong trường hợp này, chúng tôi chỉ ra rằng hai đối số Stringint phải được chỉ định cho từng đối tượng mèo . Nếu bây giờ chúng ta cố gắng tạo một con mèo không tên, nó sẽ không hoạt động.
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // Error!
    }
}
Bây giờ lớp có một hàm tạo, trình biên dịch Java biết các đối tượng sẽ trông như thế nào và không cho phép tạo các đối tượng mà không chỉ định các đối số. Bây giờ, hãy tìm hiểu từ khóa this mà bạn thấy bên trong hàm tạo. Nó cũng đơn giản. Từ khóa this dùng để chỉ một đối tượng cụ thể. Mã trong hàm tạo
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
có thể được hiểu gần như nguyên văn: "Tên của con mèo này (con mà chúng ta đang tạo) = đối số được truyền cho tham số tên của hàm tạo. Tuổi của con mèo này (con mà chúng ta đang tạo) = đối số được truyền cho tham số của hàm tạo tham số tuổi." Sau khi hàm tạo chạy, bạn có thể xác minh rằng tất cả các giá trị cần thiết đã được gán cho con mèo của chúng ta:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
        System.out.println(smudge.name);
        System.out.println(smudge.age);
    }
}
Đầu ra của bảng điều khiển: Smudge 5 Khi hàm tạo được gọi:
Cat smudge = new Cat("Smudge", 5);
Đây là những gì thực sự đã xảy ra trong nội bộ:
this.name = "Smudge";
this.age = 5;
Và các giá trị của các đối số được truyền cho hàm tạo đã được gán cho đối tượng smudge (đó là những gì điều này đề cập đến trong trường hợp này). Trên thực tế, ngay cả khi bạn không khai báo bất kỳ hàm tạo nào trong một lớp, nó vẫn sẽ gọi một hàm tạo! Nhưng sao điều đó có thể xảy ra? О_О Bởi vì, tất cả các lớp Java đều có cái gọi là hàm tạo mặc định. Nó không nhận bất kỳ đối số nào, nhưng nó được gọi mỗi khi bạn tạo bất kỳ đối tượng nào của bất kỳ lớp nào.
public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
Thoạt nhìn, điều này có thể không rõ ràng. Chúng tôi đã tạo một đối tượng, vậy thì sao? Nhà xây dựng đang làm gì ở đây? Để xem nó, chúng ta hãy viết rõ ràng một hàm tạo trống cho lớp Cat . Bên trong nó, chúng tôi sẽ xuất một số cụm từ ra bảng điều khiển. Nếu cụm từ được hiển thị, thì hàm tạo đã được gọi.
public class Cat {

    public Cat() {
        System.out.println("A cat has been created!");
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
Đầu ra bảng điều khiển: Một con mèo đã được tạo! Có xác nhận. Hàm tạo mặc định luôn hiện diện vô hình trong các lớp của bạn. Nhưng bạn cần biết một điều nữa về nó. Hàm tạo mặc định bị loại bỏ khỏi một lớp sau khi bạn tạo một hàm tạo có đối số. Trên thực tế, chúng ta đã thấy bằng chứng về điều này ở trên. Đó là trong mã này:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // Error!
    }
}
Chúng ta không thể tạo một Cat mà không có tên và tuổi, bởi vì chúng ta đã khai báo một hàm tạo Cat với các tham số chuỗi và int. Điều này khiến hàm tạo mặc định biến mất ngay lập tức khỏi lớp. Vì vậy, hãy nhớ rằng nếu bạn cần một số hàm tạo trong lớp của mình, bao gồm hàm tạo không có đối số, thì bạn sẽ phải khai báo nó một cách riêng biệt. Phòng khám của chúng tôi muốn làm những việc tốt và giúp đỡ những chú mèo con vô gia cư không rõ tên và tuổi. Sau đó, mã của chúng tôi sẽ trông như thế này:
public class Cat {

    String name;
    int age;

    // For cats with owners
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // For street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
        Cat streetCat = new Cat();
    }
}
Bây giờ chúng ta đã chỉ định một hàm tạo mặc định rõ ràng, chúng ta có thể tạo cả hai loại mèo. Trong hàm tạo, bạn có thể gán giá trị trực tiếp. Bạn không cần phải luôn lấy chúng ra khỏi các cuộc tranh luận. Ví dụ: chúng tôi có thể gắn nhãn cho tất cả mèo đường phố trong cơ sở dữ liệu bằng cách sử dụng "Mèo đường phố số <count>" làm mẫu. :
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat No. " + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
Chúng tôi có một biến số đếm , đếm những con mèo đường phố của chúng tôi. Mỗi khi hàm tạo mặc định được thực thi, chúng tôi tăng số đếm lên 1 và gắn số này vào tên của con mèo. Thứ tự của các đối số là rất quan trọng đối với các nhà xây dựng. Hãy hoán đổi các đối số tên và tuổi được truyền cho hàm tạo của chúng ta.
public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 10); // Error!
    }
}
Chúng tôi gặp lỗi! Hàm tạo quy định rõ ràng rằng khi một đối tượng Cat được tạo, nó phải được truyền một số và một chuỗi theo thứ tự này. Vì vậy, mã của chúng tôi không hoạt động. Hãy nhớ và tôn trọng quy tắc này khi khai báo các lớp của riêng bạn:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
Đây là hai hàm tạo hoàn toàn khác nhau! Bây giờ, hãy hoàn thành một số nhiệm vụ để củng cố kiến ​​thức của bạn về tài liệu. :)
  1. Bảo tàng Cổ vật.

    Nhiệm vụ của bạn là thiết kế một lớp Artifact .
    Có ba loại hiện vật được lưu giữ tại bảo tàng.
    Chúng tôi không biết gì về loại đầu tiên ngoại trừ số sê-ri do bảo tàng chỉ định (ví dụ: 212121).
    Đối với loại thứ hai, chúng tôi biết số sê-ri và nền văn hóa đã tạo ra nó (ví dụ: 212121, "Aztecs").
    Đối với loại thứ ba, chúng tôi biết số sê-ri, nền văn hóa đã tạo ra nó và thế kỷ nó được tạo ra (ví dụ: 212121, "Aztecs", 12).

    Tạo một lớp Cổ vật mô tả các cổ vật được lưu giữ tại viện bảo tàng và viết bộ hàm tạo cần thiết cho lớp. Sau đó, trong phương thức main() , hãy tạo một tạo phẩm của mỗi loại.

    public class Artifact {
    
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
  2. trang web hẹn hò

    Hãy tạo một cơ sở dữ liệu người dùng cho một trang web hẹn hò.
    Nhưng đây là vấn đề: bạn đã quên thứ tự bắt buộc của các đối số và không có sẵn tài liệu kỹ thuật nào.
    Thiết kế một lớp Người dùng , lớp này sẽ có các trường sau: tên ( Chuỗi ), tuổi ( ngắn ) và chiều cao ( int ).
    Tạo số lượng hàm tạo thích hợp để tên, tuổi và chiều cao có thể được chỉ định theo bất kỳ thứ tự nào.

    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
    
        }
    }
Để củng cố những gì bạn đã học, chúng tôi khuyên bạn nên xem một video bài học từ Khóa học Java của chúng tôi
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào