Chuyển đến nội dung chính

Java: Inner Class

Tìm hiểu Inner class trong Java

Khái niệm

Một class nằm trong class khác được gọi là inner class. Inner class có thể coi như một thuộc tính của class. Nghĩa là bạn không thể khởi tạo đối tượng B nếu chưa khởi tạo đối tượng A.

Ví dụ inner class:

1
2
3
4
5
6
7
8
class A{
    class B{
    }
}
// các bạn không thể khởi tạo đối tượng B mà không khởi tạo đối tượng A
// đây là cách khởi tạo đối tượng B
A obj1 = new A();A.B obj2 = obj1.new B();


Bởi class B nằm trong class A nên nó có thể truy cập tất cả các thuộc tính hay phương thức của class A

1
2
3
4
5
6
7
8
9
10
11
12
class A {
    private int x = 8;
    class B {
        // class B có thể truy cập thuộc tính x của class A
        public void printInt() {
            System.out.println(x);
        }
    }
}


Để sử dụng method của lớp trong (lớp B) ta vẫn sử dụng cách gọi như thường ten_doi_tuong.ten_phuong_thuc() , ví dụ ta có thể viết:

1
obj2.printInt();


Một số ví dụ khác về inner class

Qua ví dụ dưới đây các bạn sẽ biết cách tạo đối tượng và thao tác của inner class

Ví dụ 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class ThoiGian {
  
    public int ngay, thang, nam;
  
    class Time {
  
        public int gio, phut, giay;
  
        public void showTime() {
            System.out.println("Ngày " + ngay + "/" + thang + "/" + nam);
            System.out.println("Time: " + this.gio + ": " + this.phut + ": " + this.giay);
        }
    }
}
  
public class JavaExample {
  
    public static void main(String[] args) {
        ThoiGian tg = new ThoiGian();
        ThoiGian.Time time = tg.new Time();
        tg.ngay = 20;
        tg.thang = 7;
        tg.nam = 1996;
        time.gio = 20;
        time.phut = 22;
        time.giay = 01;
        time.showTime();
    }
}

Static Nested Class là gì?

Trong Java, một Static Class được tạo bên trong một lớp thì được gọi là Static Nested Class. Nó có thể truy cập các thành viên dữ liệu và phương thức non-static. Ngoài ra, nó có thể được truy cập bởi tên của Outer Class.

Ví dụ Static Nested Class với phương thức ở dạng non-static

class OuterClassExample {
 static int example = 30;

 static class Inner {
  void printMessage() {
   System.out.println("Gia tri cua bien example la: " + example);
  }
 }

 public static void main(String args[]) {
  OuterClassExample.Inner obj = new OuterClassExample.Inner();
  obj.printMessage();
 }
}

Chạy chương trình Java trên sẽ cho kết quả:
Gia tri cua bien example la: 30
Trong ví dụ này, bạn cần tạo instance của Static Nested Class bởi vì phương thức printMessage() là phương thức dạng non-static. Nhưng bạn không cần tạo đối tượng của Outer Class bởi vì Nested Class là dạng static và các thuộc tính, phương thức hoặc các lớp cũng có thể được truy cập mà không cần sử dụng đối tượng.

Ví dụ Static Nested Class với phương thức ở dạng static

Nếu bạn có các thành viên static bên trong Static Nested Class, thì bạn không cần tạo instance của Static Nested Class mà vẫn có thể truy cập được các thành viên đó. Dưới đây là ví dụ:
class OuterClassExample {
 static int example = 30;

 static class Inner {
  static void printMessage() {
   System.out.println("Gia tri cua bien example la: " + example);
  }
 }

 public static void main(String args[]) {
  OuterClassExample.Inner.printMessage();// khong can tao instance cua static nested class
 }
}
Nó sẽ cho kết quả sau:
Gia tri cua bien example la: 30
Bài viết đề cập đến một vấn đề rất cơ bản trong java đó là Nested class. Vậy nó là gì ? Và khi nào thì nên sử dụng ? Tất cả sẽ được giải thích trong nội dung dưới đây.
Nested class là một class được khai báo bên trong một class khác, như kiểu:
    class OuterClass {
        class InnerClass {
        ... implment something ....
        }
    }
Nested class được phân chia thành 2 loại: static nested classes và non-static nested classes.
  1. Static Nested Classes: là class được khai báo dạng static bên trong một class khác, cú pháp khai bao như sau:
        class OuterClass {
            class StaticInnerClass {
            ... implment something ....
            }
        }
Cú pháp để sử dung: OuterClass.StaticInnerClass nestedObject = new OuterClass.StaticInnerClass();
  1. Non-static Nested Classes: bao gồm Innser classes, Local classes and Anonymous Classes.
  • Inner Classes: là khai bao một class không phải dạng static bên trong một class khác.
    public class OuterClass {
        class InnerClass {
        ... implment something ....
        }
    }
Cú pháp sử dụng: InnerClass nestedObject = new OuterClass.new InnerClass();
  • Local Classes là khai báo một class bên trong một method khác. Ví dụ
    public class OuterClass {
        public String sayHello(String name) {
            int cnt = 0; //Before Java 8 must be define like: final int cnt = 0;
            class WelcomeMessage {
                WelcomeMessage(){
                    System.out.println(cnt); //Only use, can't change
                }
                String getMessage() {
                    return "Welcome";
                }

                void showName(){//Only valid from Java 8
                    System.out.println(name);
                }
            }
            WelcomeMessage msg = new WelcomeMessage();
            return msg.getMessage() + " " + name + " to the Java world !";
        }

        public static void main(String[] args) {
            System.out.println(new OuterClass().sayHello("John"));
        }
    }
*) Một số chú ý với Local classes:
- Local classes chỉ có thể được sử dụng trong pham vi method định nghĩa ra nó.
- Bên trong một Local classes chỉ có thể truy cập được các biến của OuterClass nếu nó là static.
- Từ Java 8 trở đi, bên trong Local classes có thể truy cập được đến giá trị của tham số trong method (hàm showName có thể sử dụng giá trị của tham số name)
- Các biến khia báo bên trong method khi sử dụng bên trong Local classes có tính chất final, nghĩa là ta chỉ có thể sử dụng mà không thể thay đổi được gia trị của nó.
  • Anonymous Classes là class giống như Inner classes và Local classes, nó được khai bao bên trong class hoặc method mà không có tên cụ thể. Đây là cách implment 1 interface hoặc abstract class mà không cần phải khai báo một class nào cụ thể.
    public class OuterClass {

       interface Person {
          String getName();
       }

       public void hello(){
           Person john = new Person(){
            @Override
            public String getName() {
                return "Johnny";
            }
           };
           System.out.println(john.getName());
        }
        public static void main(String[] args) {
            new OuterClass().hello();
        }
    }
*) Chú ý: pham vi truy cập biến của Anonymous class cũng giống với Local class.
Trên đây là các loại Nested classes. Vậy tại sao cần sử dụng chúng ? Chúng ta chỉ nên sử dụng chúng trong các trường hợp sau:
  • Muốn nhóm các class nhỏ có liên quan với nhau vào chung 1 class lớn, như vậy dễ quản lý và sửa đổi code hơn.
  • Một class chỉ được sử dụng trong phạm vi nhỏ
  • Tăng tính đóng gói của đối tượng. Ta có thể sử dụng các keyword private, protected, public với nested classes.

Nhận xét

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

Khác nhau giữa Array và ArrayList và HashMap

Collection bản chất là tập các lớp dùng để lưu trữ danh sách và có khả năng tự co giãn khi danh sách thay đổi : Thêm , sửa , xóa , chèn … Hai lớp Collection thường được sử dụng nhiều nhất là ArrayList và Hashmap Giới thiệu về ArrayList ArrayList sử dụng cấu trúc mảng để lưu trữ phần tử , tuy nhiên có hai đặc điểm khác mảng : Không cần khai báo trước kiểu phần tử . Không cần xác định trước số lượng phần tử ( kích thước mảng ). N ó có kh ả năng truy c ậ p ph ầ n t ử ng ẫ u nhiên (Do th ừ a k ế t ừ interface RandomAccess ). P hương thức khởi tạo ● ArrayList () ● ArrayList (Collection c) ● ArrayList ( int initialCapactity ) Các phương thức chính ● add(Object o) ● remove(Object o) ● get( int index) ● size() ● isEmpty () ● contains(Object o) ● clear() Giới thiệu về HashMap ● Là ki ể u t ậ p h ợ p t ừ đ i ể n, HashMap cho phép truy xu ấ t tr ự c ti ế p t ớ i m ộ ...