JavaRush /Blog Java /Random-VI /Giới thiệu về các lớp: viết các lớp của riêng bạn, các hà...

Giới thiệu về các lớp: viết các lớp của riêng bạn, các hàm tạo

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ nói về các lớp trong Java. Các lớp có thể nói là cốt lõi của lập trình Java. Khi trở thành một lập trình viên, nhiệm vụ chính của bạn sẽ là viết các lớp của riêng mình với các chức năng khác nhau. Giới thiệu về lớp: viết lớp, hàm tạo của riêng bạn - 1Hãy cùng tìm hiểu xem thứ này là gì và nó hoạt động như thế nào :) Như 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 được kết nối với nhau bằng cách nào đó. Một lớp về cơ bản là một khuôn mẫu cho một đối tượng. Nó xác định một đố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 lớp nào đó . Hãy xem ví dụ đơn giản nhất:
public class Cat {

    String name;
    int age;

}
Giả sử chúng ta đang viết một chương trình và trong chương trình này, chúng ta cần mèo để làm một việc gì đó (ví dụ: chúng ta có một phòng khám thú y có khả năng đặt lịch hẹn trực tuyến). Chúng tôi đã tạo một lớp Catvà chỉ định hai biến cho nó - một chuỗi namevà một số age. Các biến lớp như vậy được gọi là các trường . Về cơ bản, đây là mẫu dành cho tất cả những chú mèo mà chúng tôi sẽ tạo trong tương lai. Mỗi con mèo (đối tượng lớp 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 barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
Đó là cách nó hoạt động! Chúng tôi đã tạo ra một con mèo, đặt tên và tuổi cho nó rồi xuất tất cả ra bảng điều khiển. Không có gì phức tạp :) Các lớp học thường mô tả các đồ vật và hiện tượng của thế giới xung quanh. Một con mèo, một cái bàn, một người, tia chớp, một trang sách, một bánh xe - tất cả những thứ này sẽ được tạo trong chương trình của bạn bằng cách sử dụng các lớp riêng biệt. Bây giờ chúng ta hãy xem các biến chúng ta đã tạo trong lớp Cat. Chúng được gọi là các trường hoặc các biến thể hiện . Trên thực tế, cái tên tiết lộ toàn bộ bản chất của chúng. Mỗi thể hiện (đối tượng) của lớp sẽ có các biến này Cat. Mỗi con mèo chúng ta tạo sẽ có biến riêng namevà tệp age. Nói chung là hợp lý: với mèo thật thì mọi thứ đều giống nhau :) Ngoài các biến thể hiện, còn có các biến khác - biến lớp hoặc biến tĩnh. Hãy thêm vào 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 barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
Đầu ra của bảng điều khiển:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
Bây giờ chúng ta có một biến mới trong lớp - count(số lượng). Cô ấy chịu trách nhiệm đếm số lượng mèo được tạo ra. Mỗi lần chúng ta tạo một con mèo trong phương thức chính, chúng ta sẽ tăng biến này lên 1. Biến này được chỉ định bởi từ khóa static . Điều này có nghĩa là nó thuộc về lớp chứ không thuộc về một đối tượng cụ thể của lớp. Tất nhiên, điều này là hợp lý: nếu mỗi con mèo phải có tên riêng thì chúng ta cần một bộ đếm mèo cho tất cả. Đây chính xác là điều mà từ tĩnh cho phép bạn đạt được - countcùng một biến số cho tất cả các con mèo. Xin lưu ý: khi chúng tôi in nó ra bàn điều khiển, chúng tôi không viết barsik.counthoặc vasia.count. Cô ấy không thuộc về Barsik hay Vasya - cô ấy thuộc về cả lớp Cat. Vì vậy, nó đơn giản count. Bạn cũng có thể viết Cat.count- điều đó cũng đúng. nameĐiều này sẽ không hoạt động khi xuất một biến ra bàn điều khiển :
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

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

phương pháp

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

    String name;
    int age;

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

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

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

        barsik.sayMeow();
        barsik.jump();

    }
}
Chà, bây giờ lớp học của chúng ta giống với mô tả về một con mèo thật hơn nhiều! Bây giờ chúng ta không chỉ có một con mèo tên là Barsik với tên và tuổi. Anh ấy cũng có thể kêu meo meo và nhảy! Nó là loại mèo gì mà không có “chức năng” như vậy :) Chúng ta lấy một đối tượng cụ thể - barsik, và gọi các phương thức của nó sayMeow()jump(). Chúng tôi nhìn vào bảng điều khiển:

Мяу!
Прыг-скок!
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 bạn. Bạn nên chú ý điều gì khi viết chúng? Nếu chúng ta đang nói về các biến, bạn cần sử dụng thứ gọi là sự 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ó liên quan đến việc làm nổi bật những đặc điểm chính, quan trọng nhất của một đối tượng và ngược lại - loại bỏ những đặc điểm thứ yếu, không đáng kể. Ví dụ: chúng tôi đang tạo một tệp gồm các nhân viên của công ty. Để tạo các đối tượng nhân viên, chúng tôi đã viết một lớp Employee. Những đặc điểm nào là quan trọng để mô tả một nhân viên trong hồ sơ công ty? Họ tên, ngày sinh, số an sinh xã hội, mã số thuế. Nhưng không chắc chúng ta cần chiều cao, màu mắt và màu tóc của anh ấy trong thẻ nhân viên công ty. Công ty không cần thông tin này. Do đó, đối với lớp, Employeechúng ta sẽ đặt các biến String name, int age, int socialInsuranceNumberint taxNumber, và chúng ta sẽ loại bỏ những thông tin không cần thiết đối với chúng ta (chẳng hạn như màu mắt) và trừu tượng hóa nó đi . Nhưng nếu chúng ta tạo một tập tin người mẫu ảnh cho một công ty người mẫu, tình hình sẽ thay đổi đáng kể. Để mô tả một người mẫu thời trang, chiều cao, màu mắt và màu tóc rất quan trọng đối với chúng tôi, nhưng số TIN hoàn toàn không quan trọng đối với chúng tôi. Vì vậy, trong class Modelchúng ta cần tạo các biến int height, String hair, String eyes. Đây là cách trừu tượng hoạt động, thật đơn giản! :)

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 barsik = new Cat();

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
Hãy nhìn vào đoạn mã này và thử đoán xem chương trình của chúng ta có vấn đề gì. Trong hai giờ trong 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! Tất nhiên, điều này là hoàn toàn sai. Không nên có con mèo nào trong cơ sở dữ liệu của phòng khám thú y mà không có thông tin về chúng. Bây giờ chúng ta để việc đó cho người lập trình. Nếu anh ấy không quên cho biết tên và tuổi của mình thì mọi chuyện sẽ ổn thôi. Nếu anh ta quên, sẽ có lỗi trong cơ sở dữ liệu, mèo không xác định. Làm thế nào chúng ta có thể giải quyết vấn đề này? Cần phải bằng cách nào đó cấm việc tạo ra những con mèo không có tên và tuổi. Đây là nơi các hàm tạo có thể hỗ trợ chúng ta . Đây là một ví dụ:
public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
Một hàm tạo về cơ bản là một khuôn mẫu cho các đối tượng lớp. Trong trường hợp này, chúng tôi xác định rằng đối với mỗi đối tượng, cathai đối số phải được chỉ định - một chuỗi và một số. Nếu bây giờ chúng ta cố gắng tạo ra một con mèo không tên, chúng ta sẽ không thành cô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 barsik = new Cat(); //error!
    }
}
Bây giờ một lớp đã có một hàm tạo, trình biên dịch Java sẽ biết các đối tượng trông như thế nào và không cho phép tạo các đối tượng mà không có các đối số được chỉ định trong đó. Bây giờ hãy xem từ khóa thismà bạn thấy bên trong hàm tạo. Mọi thứ cũng đơn giản với anh ấy. “this” trong tiếng Anh có nghĩa là “cái này, cái này”. Đó là, từ này chỉ ra 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ể dịch gần như theo nghĩa đen: " tên cho con mèo này (mà chúng ta đang tạo) = đối số tên được chỉ định trong hàm tạo. age cho con mèo này (mà chúng ta đang tạo) = đối số tuổi được chỉ định trong hàm tạo." Sau khi hàm khởi tạo kích hoạt, bạn có thể kiểm tra xem con mèo của chúng ta đã được gán tất cả các giá trị cần thiết chưa:
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 barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
Đầu ra của bảng điều khiển:

Барсик
5
Khi hàm tạo đã hoàn thành:
Cat barsik = new Cat("Barsik", 5);
Điều sau đây thực sự đã xảy ra bên trong:
this.name = "Barsik";
this.age = 5;
Và đối tượng barsik(chính là this) đã được gán các giá trị từ các đối số của hàm tạo. Trong thực tế, nếu bạn không chỉ định hàm tạo trong lớp, nó vẫn sẽ kích hoạt hàm tạo đó ! Nhưng làm thế nào điều này có thể xảy ra? O_O Thực tế là trong Java tất cả các lớp đều có cái gọi là hàm tạo mặc định . Nó không có bất kỳ đối số nào, nhưng nó kích hoạt mỗi khi bất kỳ đối tượng nào của bất kỳ lớp nào được tạo.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Thoạt nhìn điều này không đáng chú ý. Chà, chúng ta đã tạo ra một vật thể và tạo ra nó, công việc của người thiết kế ở đâu? Để thấy điều này, chúng ta hãy Cattự tay viết một hàm tạo trống cho lớp và bên trong nó, chúng ta sẽ xuất một số cụm từ ra bảng điều khiển. Nếu nó được hiển thị thì hàm tạo đã hoạt động.
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Đầu ra của bảng điều khiển:

Создали кота!
Đây là sự 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 thêm một tính năng nữa của nó. Hàm tạo mặc định sẽ biến mất khỏi lớp khi bạn tạo một số hàm tạo có đối số. Bằng chứng về điều này, trên thực tế, chúng ta đã thấy ở trên. Ở đây 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 barsik = new Cat(); //error!
    }
}
Chúng tôi không thể tạo một con mèo mà không có tên và tuổi vì chúng tôi đã xác định hàm tạo cho Cat: chuỗi + số. Hàm tạo mặc định đã biến mất khỏi lớp ngay sau đó. Do đó, hãy nhớ nhớ: nếu bạn cần một số hàm tạo trong lớp của mình, bao gồm cả một hàm tạo trống, bạn cần phải tạo nó một cách riêng biệt . Ví dụ, phòng khám thú y của chúng tôi muốn làm những việc tốt và giúp đỡ những chú mèo vô gia cư mà chúng tôi không biết tên và tuổi. Sau đó, mã của chúng ta sẽ trông như thế này:
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
Bây giờ chúng ta đã chỉ định rõ ràng một hàm tạo mặc định, chúng ta có thể tạo cả hai loại mèo. Trong hàm tạo, bạn có thể gán các giá trị một cách rõ ràng chứ không chỉ lấy chúng từ các đối số. Ví dụ: chúng ta có thể ghi lại tất cả mèo đường phố vào cơ sở dữ liệu dưới tên "Số mèo đường phố...":
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + 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 countđó là máy đếm mèo đường phố. Mỗi lần chúng ta thực thi hàm tạo mặc định, chúng ta tăng nó lên 1 và gán số đó làm tên của con mèo. Đối với một hàm tạo, thứ tự của các đối số là rất quan trọng. Hãy hoán đổi các đối số tên và tuổi trong 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 barsik = new Cat("Barsik", 10); //error!
    }
}
Lỗi! Hàm tạo mô tả rõ ràng: khi tạo một đối tượng, Catnó phải được truyền một số và một chuỗi, theo thứ tự đó . Đó là lý do tại sao mã của chúng tôi không hoạt động. Hãy nhớ ghi nhớ điều này khi tạ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 nhà thiết kế hoàn toàn khác nhau! Bây giờ giải quyết một số vấn đề để củng cố tài liệu :)
  • Bảo tàng Cổ vật.
Nhiệm vụ của bạn là thiết kế lớp Artifact. Các hiện vật được lưu giữ trong bảo tàng có ba loại. Đầu tiên là không có gì được biết ngoại trừ số sê-ri do bảo tàng ấn định (ví dụ: 212121). Thứ hai là về số sê-ri và nền văn hóa mà nó được tạo ra được biết đến (ví dụ: 212121, “Aztecs”). Loại thứ ba là về số sê-ri được biết đến, nền văn hóa mà nó được tạo ra và độ tuổi chính xác của nó (ví dụ: 212121, “Aztecs”, 12). Tạo một lớp Artifactmô tả các cổ vật được lưu trữ trong bảo tàng và viết số lượng hàm tạo cần thiết cho nó. Trong phương thức này main(), hãy tạo một tạo phẩm của mỗi loại.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • Trang web cuộc họp
Bạn đang tạo cơ sở dữ liệu người dùng cho một trang web hẹn hò. Nhưng vấn đề là bạn đã quên thứ tự chúng cần được chỉ định và bạn không có sẵn các thông số kỹ thuật. Thiết kế một lớp Usersẽ có các trường - tên ( String), tuổi ( short) và chiều cao ( int). Tạo số lượng hàm tạo cần thiết cho nó để có thể chỉ định tên, tuổi và chiều cao theo bất kỳ thứ tự nào.
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION