Java - Đối tượng và Lớp

Java là một ngôn ngữ hướng đối tượng. Là một ngôn ngữ có tính năng Hướng đối tượng, Java hỗ trợ các khái niệm cơ bản sau:

  • Polymorphism
  • Inheritance
  • Encapsulation
  • Abstraction
  • Classes
  • Objects
  • Instance
  • Method
  • Thông qua

Trong chương này, chúng ta sẽ xem xét các khái niệm - Lớp và Đối tượng.

  • Object- Đối tượng có trạng thái và hành vi. Ví dụ: Một con chó có các trạng thái - màu sắc, tên, giống cũng như các hành vi - vẫy đuôi, sủa, ăn. Một đối tượng là một thể hiện của một lớp.

  • Class - Một lớp có thể được định nghĩa như một khuôn mẫu / bản thiết kế mô tả hành vi / trạng thái mà đối tượng thuộc kiểu của nó hỗ trợ.

Các đối tượng trong Java

Bây giờ chúng ta hãy đi sâu tìm hiểu các đối tượng là gì. Nếu chúng ta xem xét thế giới thực, chúng ta có thể tìm thấy nhiều đối tượng xung quanh chúng ta, ô tô, con chó, con người, v.v. Tất cả những đối tượng này đều có trạng thái và hành vi.

Nếu chúng ta coi một con chó, thì trạng thái của nó là - tên, giống, màu sắc, và hành vi là - sủa, vẫy đuôi, chạy.

Nếu bạn so sánh đối tượng phần mềm với một đối tượng trong thế giới thực, chúng có những đặc điểm rất giống nhau.

Các đối tượng phần mềm cũng có trạng thái và hành vi. Trạng thái của đối tượng phần mềm được lưu trữ trong các trường và hành vi được hiển thị qua các phương thức.

Vì vậy, trong phát triển phần mềm, các phương thức hoạt động trên trạng thái bên trong của một đối tượng và giao tiếp giữa đối tượng với đối tượng được thực hiện thông qua các phương thức.

Các lớp trong Java

Lớp là một bản thiết kế mà từ đó các đối tượng riêng lẻ được tạo ra.

Sau đây là một mẫu của một lớp.

Thí dụ

public class Dog {
   String breed;
   int age;
   String color;

   void barking() {
   }

   void hungry() {
   }

   void sleeping() {
   }
}

Một lớp có thể chứa bất kỳ kiểu biến nào sau đây.

  • Local variables- Các biến được định nghĩa bên trong các phương thức, hàm tạo hoặc khối được gọi là biến cục bộ. Biến sẽ được khai báo và khởi tạo bên trong phương thức và biến sẽ bị hủy khi phương thức hoàn thành.

  • Instance variables- Biến thể hiện là các biến bên trong một lớp nhưng bên ngoài bất kỳ phương thức nào. Các biến này được khởi tạo khi lớp được khởi tạo. Các biến cá thể có thể được truy cập từ bên trong bất kỳ phương thức, hàm tạo hoặc khối nào của lớp cụ thể đó.

  • Class variables - Biến lớp là các biến được khai báo bên trong một lớp, bên ngoài bất kỳ phương thức nào, với từ khóa static.

Một lớp có thể có bất kỳ số phương thức nào để truy cập giá trị của nhiều loại phương thức khác nhau. Trong ví dụ trên, các phương thức: barking (), inherit () và sleep ().

Sau đây là một số chủ đề quan trọng cần được thảo luận khi xem xét các lớp của Ngôn ngữ Java.

Người xây dựng

Khi thảo luận về các lớp, một trong những chủ đề phụ quan trọng nhất sẽ là các hàm tạo. Mỗi lớp đều có một hàm tạo. Nếu chúng ta không viết rõ ràng một phương thức khởi tạo cho một lớp, trình biên dịch Java sẽ xây dựng một phương thức khởi tạo mặc định cho lớp đó.

Mỗi khi một đối tượng mới được tạo, ít nhất một hàm tạo sẽ được gọi. Quy tắc chính của các hàm tạo là chúng phải có cùng tên với lớp. Một lớp có thể có nhiều hơn một hàm tạo.

Sau đây là một ví dụ về một hàm tạo:

Thí dụ

public class Puppy {
   public Puppy() {
   }

   public Puppy(String name) {
      // This constructor has one parameter, name.
   }
}

Java cũng hỗ trợ các Lớp Singleton , nơi bạn có thể chỉ tạo một thể hiện của một lớp.

Note- Chúng ta có hai loại constructor khác nhau. Chúng ta sẽ thảo luận chi tiết về các hàm tạo trong các chương tiếp theo.

Tạo một đối tượng

Như đã đề cập trước đây, một lớp cung cấp bản thiết kế cho các đối tượng. Vì vậy, về cơ bản, một đối tượng được tạo ra từ một lớp. Trong Java, từ khóa mới được sử dụng để tạo các đối tượng mới.

Có ba bước khi tạo một đối tượng từ một lớp:

  • Declaration - Một khai báo biến với tên biến có kiểu đối tượng.

  • Instantiation - Từ khóa 'mới' được sử dụng để tạo đối tượng.

  • Initialization- Từ khóa 'mới' được theo sau bởi một cuộc gọi đến một hàm tạo. Cuộc gọi này khởi tạo đối tượng mới.

Sau đây là một ví dụ về việc tạo một đối tượng:

Thí dụ

public class Puppy {
   public Puppy(String name) {
      // This constructor has one parameter, name.
      System.out.println("Passed Name is :" + name );
   }

   public static void main(String []args) {
      // Following statement would create an object myPuppy
      Puppy myPuppy = new Puppy( "tommy" );
   }
}

Nếu chúng ta biên dịch và chạy chương trình trên, thì nó sẽ tạo ra kết quả sau:

Đầu ra

Passed Name is :tommy

Truy cập các biến và phương thức phiên bản

Các biến và phương thức thực thể được truy cập thông qua các đối tượng đã tạo. Để truy cập một biến phiên bản, sau đây là đường dẫn đầy đủ điều kiện:

/* First create an object */
ObjectReference = new Constructor();

/* Now call a variable as follows */
ObjectReference.variableName;

/* Now you can call a class method as follows */
ObjectReference.MethodName();

Thí dụ

Ví dụ này giải thích cách truy cập các biến cá thể và phương thức của một lớp.

public class Puppy {
   int puppyAge;

   public Puppy(String name) {
      // This constructor has one parameter, name.
      System.out.println("Name chosen is :" + name );
   }

   public void setAge( int age ) {
      puppyAge = age;
   }

   public int getAge( ) {
      System.out.println("Puppy's age is :" + puppyAge );
      return puppyAge;
   }

   public static void main(String []args) {
      /* Object creation */
      Puppy myPuppy = new Puppy( "tommy" );

      /* Call class method to set puppy's age */
      myPuppy.setAge( 2 );

      /* Call another class method to get puppy's age */
      myPuppy.getAge( );

      /* You can access instance variable as follows as well */
      System.out.println("Variable Value :" + myPuppy.puppyAge );
   }
}

Nếu chúng ta biên dịch và chạy chương trình trên, thì nó sẽ tạo ra kết quả sau:

Đầu ra

Name chosen is :tommy
Puppy's age is :2
Variable Value :2

Quy tắc khai báo tệp nguồn

Như phần cuối cùng của phần này, bây giờ chúng ta hãy xem xét các quy tắc khai báo tệp nguồn. Các quy tắc này rất cần thiết khi khai báo các lớp, câu lệnh nhập và câu lệnh gói trong tệp nguồn.

  • Chỉ có thể có một lớp công khai cho mỗi tệp nguồn.

  • Một tệp nguồn có thể có nhiều lớp không công khai.

  • Tên lớp công khai phải là tên của tệp nguồn cũng như phải được thêm vào bởi .javacuối cùng. Ví dụ: tên lớp là lớp công khai Employee {} thì tệp nguồn phải là Employee.java.

  • Nếu lớp được định nghĩa bên trong một gói, thì câu lệnh gói phải là câu lệnh đầu tiên trong tệp nguồn.

  • Nếu các câu lệnh nhập xuất hiện, thì chúng phải được viết giữa câu lệnh gói và khai báo lớp. Nếu không có câu lệnh gói nào, thì câu lệnh nhập phải là dòng đầu tiên trong tệp nguồn.

  • Các câu lệnh nhập và gói sẽ ngụ ý đến tất cả các lớp có trong tệp nguồn. Không thể khai báo các câu lệnh nhập và / hoặc gói khác nhau cho các lớp khác nhau trong tệp nguồn.

Các lớp có một số cấp độ truy cập và có nhiều loại lớp khác nhau; các lớp trừu tượng, các lớp cuối cùng, v.v. Chúng tôi sẽ giải thích về tất cả những thứ này trong chương bổ trợ truy cập.

Ngoài các loại lớp đã đề cập ở trên, Java còn có một số lớp đặc biệt gọi là lớp Bên trong và lớp Ẩn danh.

Gói Java

Nói một cách dễ hiểu, nó là một cách phân loại các lớp và giao diện. Khi phát triển các ứng dụng bằng Java, hàng trăm lớp và giao diện sẽ được viết, do đó việc phân loại các lớp này là điều bắt buộc cũng như giúp cuộc sống dễ dàng hơn nhiều.

Báo cáo nhập khẩu

Trong Java nếu một tên đủ điều kiện, bao gồm gói và tên lớp được đưa ra, thì trình biên dịch có thể dễ dàng định vị mã nguồn hoặc các lớp. Câu lệnh nhập là một cách cung cấp vị trí thích hợp cho trình biên dịch để tìm lớp cụ thể đó.

Ví dụ: dòng sau sẽ yêu cầu trình biên dịch tải tất cả các lớp có sẵn trong thư mục java_installation / java / io -

import java.io.*;

Một nghiên cứu điển hình đơn giản

Đối với nghiên cứu điển hình của chúng tôi, chúng tôi sẽ tạo hai lớp. Họ là Employee và EmployeeTest.

Đầu tiên mở notepad và thêm mã sau. Hãy nhớ rằng đây là lớp Nhân viên và lớp này là một lớp công khai. Bây giờ, hãy lưu tệp nguồn này với tên Employee.java.

Lớp Nhân viên có bốn biến cá thể - tên, tuổi, chỉ định và lương. Lớp có một hàm tạo được xác định rõ ràng, hàm này nhận một tham số.

Thí dụ

import java.io.*;
public class Employee {

   String name;
   int age;
   String designation;
   double salary;

   // This is the constructor of the class Employee
   public Employee(String name) {
      this.name = name;
   }

   // Assign the age of the Employee  to the variable age.
   public void empAge(int empAge) {
      age = empAge;
   }

   /* Assign the designation to the variable designation.*/
   public void empDesignation(String empDesig) {
      designation = empDesig;
   }

   /* Assign the salary to the variable	salary.*/
   public void empSalary(double empSalary) {
      salary = empSalary;
   }

   /* Print the Employee details */
   public void printEmployee() {
      System.out.println("Name:"+ name );
      System.out.println("Age:" + age );
      System.out.println("Designation:" + designation );
      System.out.println("Salary:" + salary);
   }
}

Như đã đề cập trước đó trong hướng dẫn này, quá trình xử lý bắt đầu từ phương thức chính. Do đó, để chúng ta chạy lớp Employee này, cần có một phương thức chính và các đối tượng phải được tạo. Chúng tôi sẽ tạo một lớp riêng cho các nhiệm vụ này.

Tiếp theo là lớp EmployeeTest , lớp này tạo ra hai trường hợp của lớp Employee và gọi các phương thức cho mỗi đối tượng để gán giá trị cho mỗi biến.

Lưu mã sau trong tệp EmployeeTest.java.

import java.io.*;
public class EmployeeTest {

   public static void main(String args[]) {
      /* Create two objects using constructor */
      Employee empOne = new Employee("James Smith");
      Employee empTwo = new Employee("Mary Anne");

      // Invoking methods for each object created
      empOne.empAge(26);
      empOne.empDesignation("Senior Software Engineer");
      empOne.empSalary(1000);
      empOne.printEmployee();

      empTwo.empAge(21);
      empTwo.empDesignation("Software Engineer");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

Bây giờ, hãy biên dịch cả hai lớp và sau đó chạy EmployeeTest để xem kết quả như sau:

Đầu ra

C:\> javac Employee.java
C:\> javac EmployeeTest.java
C:\> java EmployeeTest
Name:James Smith
Age:26
Designation:Senior Software Engineer
Salary:1000.0
Name:Mary Anne
Age:21
Designation:Software Engineer
Salary:500.0

Tiếp theo là gì?

Trong phần tiếp theo, chúng ta sẽ thảo luận về các kiểu dữ liệu cơ bản trong Java và cách chúng có thể được sử dụng khi phát triển các ứng dụng Java.