Thứ Hai, 27 tháng 9, 2010

Anonymous Inner Class in Java

Hôm nay, mình vừa thi đề về java, có 1 câu về Anonymous Inner Class, làm bị sai toét tòe toe :D.
Sau khi tìm hiểu, mình xin trình bày lại, hi vọng giúp được một số bạn quan tâm đến Anonymous Inner Class, và cũng để mình note lại luôn :D(xem lại khi đã quên :P)

1. Định nghĩa về Anonymous Inner Class:
- Là một class không có tên, được định nghĩa trong 1 method của 1 class xác định. Nó chỉ được dùng 1 lần tại nơi mà nó đã được định nghĩa ra.


Nghe có vẻ hơi trừu tượng nhỉ:D Để mình làm ví dụ nhé :


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

// Outer.java
public class Abstract3 extends JFrame{

JButton btnHello = new JButton("aaaaaaaaaaa");

public Abstract3()
{

this.add (btnHello);

this.btnHello.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Hi! bogay");

}
});
this.setSize(100,100);
this.setVisible(true);
}

public static void main(String args[])
{
Abstract3 abs3 = new Abstract3();

}
}



Ở đây, khi tớ bắt sự kiện cho nút, tớ dùng interface ActionListener, nhưng tớ không implements trực tiếp, mà tớ gián tiếp sử dụng nó và override lại phương thức ActionPerformed tại method AddActionListener.

Sau khi bạn chạy xong, bạn vào thư mục chứa class này, bạn sẽ thấy nó sinh ra một class khác(chỉ sinh ra sau khi đã run), có tên là : Abstract3$1.java .
Đây chính là Anonymous Innner Class :D

Còn cách viết thông thường :


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

// Outer.java
public class Abstract3 extends JFrame implements ActionListener{

JButton btnHello = new JButton("aaaaaaaaaaa");
public void actionPerformed(ActionEvent arg0) {
System.out.println("Hi ! bogay");

}
public Abstract3()
{

this.add (btnHello);
this.setSize(100,100);
this.btnHello.addActionListener(this);
this.setVisible(true);
}

public static void main(String args[])
{
Abstract3 abs3 = new Abstract3();

}
}



Trong cách này, thì tớ implements ActionListener theo cách thông thường, sau đó tớ overide lại phương thức ActionPerformed.

Tổng kết lại nhé :

1. Tác dụng : như nhau, không có sự khác biệt

2. Độ sướng : cách code anonymous ngắn gọn hơn, pro hơn :D

8 nhận xét:

  1. Tác giả nên để các dòng lệnh trong khối comand riêng, có sự phân biệt giữa code và bài viết, các đoạn code nên có cấu trúc cách dòng phù hợp để mọi người dễ hình dung hơn. Thank ^_^

    Trả lờiXóa
  2. Sao dạo này trên i-php chả thấy bài gì mới về web thế nhỉ hix, hơi buồn ! Mình thấy nhiều bài trên i-php được nhiều trang "chôm chỉa", ví dụ như trang : phpcodevn.com - chứng tỏ nhiều bài khá hay và bổ ích. Mong các ace trên i-php năng viết để .... nổi tiếng hơn :D
    Thanks !

    Trả lờiXóa
  3. ace trên i-php đều mong muốn i-php phát triển hơn nữa, nhưng có vẻ t.g này mọi người thích nhậu nhẹt hơn là ngồi máy tính :))

    Trả lờiXóa
  4. @habogay: theo em hiểu thì đoạn code 1 của chị là code bình thường, còn đoạn code 2 mới là Anonymous chứ ?? Với lại em tưởng Anonymous và Inner Class là 2 tên gọi khác nhau của cách code này mà :-/ Inner class có tên còn Anonymous mượn tên ActionListener ??

    Trả lờiXóa
  5. http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

    Trả lờiXóa
  6. http://wordpress.org/extend/plugins/wp-syntax/

    Trả lờiXóa
  7. our blog was installed wp-syntax plugin . But habogay doesn't use it .

    Trả lờiXóa
  8. Ckm0iV xasdbszqhvhl, [url=http://huagxeynipmc.com/]huagxeynipmc[/url], [link=http://foihckvzzwju.com/]foihckvzzwju[/link], http://cwxuhoxozgjh.com/

    Trả lờiXóa