# Tìm hiểu về cấu trúc của class trong java
- Trong 1 class java, ta định nghĩa các thành phần thông qua file `.java`, các file này sau khi được biên dịch bởi`Java Compiler (JVM)`, sẽ trở thành các `bytecode` và được lữu trữ trong file `.class`

- Các thành phần trong class:
```
Package statement // 1
Import statements // 2
Comments // 3a
Class declaration { // 4
Variables // 5
Comments // 3b
Constructors // 6
Methods // 7
Nested classes // 8
Nested interfaces // 9
Enum // 10
}
```
## Chi tiết
### Package statement
- Tất cả các ``class java`` đều là 1 phần của ``package``, nên nó phải được định nghĩa bởi tên của ``package``, nếu không sẽ là `package default`.
- `package` phải được khai báo trên cùng của mỗi `class`, không được khai báo trong định nghĩa `class` hoặc sau `class`, và có một và chỉ 1 ``package`` được khai báo trong mỗi ``class``.
```
package certification;
class Course {
}
```
```
class Course {
package com.cert; // sai vì khai báo trong class
}
```
```
package com.cert;
package com.exams;
class Course { // sai vì chỉ được khai báo 1 package
}
```
### Import statement
Các `class` hay `interface` trong cùng một `package` sẽ đều sử dụng chung một `package` để khai báo. Vậy để sử dụng các `class` hoặc `interface` trong `package` khác thì làm thế nào, có một cách sử dụng là `fully qualified name`, tức là nó có dạng sau `packageName.anySubpackageName
.ClassName`, nếu sử dụng như trên thì code sẽ trở nên khó đọc, thay vì vậy ta sẽ sử dụng `import`.
```
package university;
import certification.ExamQuestion;
class AnnualExam {
ExamQuestion eq;
}
```
Thay vì sử dụng:
```
package university;
class AnnualExam {
certification.ExamQuestion eq;
}
```
### Comments
`Comment` giúp code của chúng ta trở nên dễ đọc hơn khi có những chú thích cho những đoạn code phức tạp, và sẽ giúp dễ bảo trì hơn sau này. Trình biên dịch `JVM` sẽ tự động bỏ qua những `comment`, nên ta sẽ không cần lo lắng nó sẽ ảnh hưởng đến code của mình. Có 2 loại `comment` là `multiline comments` và `end-of-line comments`.
- Multiline comments
```
class MyClass {
/*
comments that span multiple
lines of code
*/
}
```
- End-of-line comments
```
class Person {
String fName; // variable to store Person's first name
String id; // a 6 letter id generated by the database
}
```
- Một số ví dụ
```
String name = /* Harry */ "Paul";
System.out.println(name); // output: Paul
```
```
String name = "/* Harry */ Paul";
System.out.println(name); // output: /* Harry */ Paul
```
```
String name = "Shre /* ya
*/ Paul";
System.out.println(name);//lỗi biên dịch: vì đóng mở String phải nằm trên 1 dòng
```
### Class Declaration
Khai báo `class` là sự bắt đầu của một lớp, một ví dụ đơn giản là:
```
class Person {
//..
//..
}
```
Trong đó `class` là keyword, còn `Person` là tên của class. Khai báo `class` đầy đủ sẽ có những tthành phần sau:
- Access modifiers
- Nonaccess modifiers
- Class name
- Name of the base class, if the class is extending another class
- All implemented interfaces, if the class is implementing any interfaces
- Class body (class fields, methods, constructors), included within a pair of curly
braces, ``{}``
```
public final class Runner extends Person implements Athlete {}
```
Ta có thể xem hình minh họa dưới đây để hiểu rõ hơn về các thành phần trên

Từ hình minh họa ta có thể thấy các thành phần sẽ có 2 cấp độ, ``compulsory`` hoặc ``optional``.
### Class Definition
``class`` là một thiết kế được sử dụng để xác định các thuộc tính và hành vi của một đối tượng. Các thuộc tính của một đối tượng được triển khai bằng cách sử dụng các``variable`` và hành vi được triển khai sử dụng các ``method``.
```
class Phone {
String model;
String company;
Phone(String model) {
this.model = model;
}
double weight;
void makeCall(String number) {
// code
}
void receiveCall() {
// code
}
}
```
### Variables
`Variables` hay còn gọi là biến hay thuộc tính, được sử dụng trong `class` để lưu giữ trạng thái của đối tượng, hay còn gọi là `instances`. Mỗi đối tượng đều có `instance variables`, nếu ta thay đổi giá trị của 1 `instance variable`, giá trị của biến đó sẽ không thay đổi với các đối tượng khác. Một bản sao duy nhất của `variable` sẽ được khai báo là `static`, khi đó biến này sẽ được dùng chung với mọi `instance` của lớp đó.
### Method
Phương thức của lớp sẽ thể hiện các hành vi của lớp đó, xử lý các biến.
### Constructor
Hàm tạo của lớp được sử dụng để khởi tạo các đối tượng, có thể có nhiều hàm tạo với các đối số truyền vào khác nhau. nếu không có ``constructor`` nào được khai báo trong một ``class``, Java sẽ tự động tạo ra một ``constructor`` mặc định (``default constructor``) không tham số (``no-argument constructor``).
### Một số lưu ý
- Có thể khai báo nhiều `class` hoặc `interface` trong 1 file `.java`, nhưng chỉ có 1 class hoặc interface là được khai báo là public, và phải có trùng tên với file, nếu vi phạm thì trình biên dịch sẽ báo lỗi.
## Kết luận
Trên đây là một số điều cơ bản về class trong java, cũng như file ``.java``.
## Tài liệu tham khảo
[OCA Java SE 8 Programmer I Certification Guide - Mala Gupta](https://www.amazon.com/OCA-Java-Programmer-Certification-Guide/dp/1617293253)