내부 익명 같은 거에 대해서 조금.

내부 익명 클래스는 매우 특수한 내부 클래스로 일반적으로 GUI를 하는 사람만 그와 자주 관련된다
 
그것이 존재하는 이유는 다음과 같다.내부 클래스의 대상은 개인 데이터를 포함한 창설 대상에 접근할 수 있다.즉 내부 클래스 실례는 그 클래스를 포함하는 어떤 종류의 실례에 대해 특권이다.2. 같은 가방에 있는 다른 클래스에 대해 내부 클래스는 숨길 수 있다. 다시 말하면 내부 클래스는 방법의 가시성이 어떻든 간에 퍼블릭은 포용 클래스를 제외하고는 사용할 수 없다.3. 익명 내부 클래스는 리셋을 쉽게 정의할 수 있다.4. 내부 클래스를 사용하면 이벤트 드라이버를 쉽게 작성할 수 있습니다.
 
사실 진정한 목적은 콜백을 정의하기 위한 것일 뿐입니다. 더 나아가서는 이벤트 구동입니다.인터페이스와 리셋: 자주 사용하는 모드를 프로그래밍하는 것은 리셋 모드입니다. 이 모드에서 특정한 시간에 리셋 대상이 발생할 때의 방법을 지정할 수 있습니다.
 
익명 클래스와 내부 클래스 중의this: 때때로 내부 클래스와 익명 클래스를 사용합니다.익명 클래스에서this를 사용할 때 이this는 익명 클래스나 내부 클래스 자체를 가리킨다.이때 우리가 외부 클래스의 방법과 변수를 사용하려면 외부 클래스의 클래스 이름을 붙여야 한다.예를 들면 다음과 같습니다.
public class A {
   int i = 1;
   public A() {
     Thread thread = new Thread() {
       public void run() {
         for(;;) {
           A.this.run();
           try {
             sleep(1000);
           } catch(InterruptedException ie) {
           }
         }
       }
     };
     thread.start();
   } 
   public void run() {
     System.out.println("i = " + i);
     i++;
   }
   public static void main(String[] args) throws Exception {
     new A();
   }
}

 
위의 예에서thread는 익명 클래스의 대상이며, 정의에서 외부 클래스의run 함수를 사용합니다.이때 함수가 이름이 같기 때문에 직접 호출하면 안 된다.이때 두 가지 방법이 있는데 하나는 외부의run 함수를 이름으로 바꾸는 것이다. 그러나 이런 방법은 개발이 중도에 이르는 응용에 있어서 취할 수 없는 것이다.그러면 이 예에서 외부 클래스의 클래스 이름에this 인용을 붙여서 외부 클래스를 호출할 방법인run을 설명할 수 있다.
 
예를 들면 다음과 같습니다.
 
this.test(new Inner(){
              public void method1(){
                  System.out.print("1111");
            }
           
              public void method2(){
                  System.out.print("22222");
            }
});

 
 
이 때test () 방법을 호출합니다. 인너 클래스의method1과method2는 언제 호출되었습니까?설마 this 대상이 그들에게 메시지를 보내는 것(예를 들어 매개 변수를 전달하는 것)도 아니겠지?아니면 직접 호출??
 
인너 클래스에 대해this라는 클래스를 제외하고는this입니다.Test(...그 문장의this는 Inner 클래스를 호출할 수 있는 방법이 있어서 다른 곳에서는 사용할 수 없습니다. 그러나 이것은 클래스 중 어느 곳에 이 내부 클래스의 실례에 대한 인용을 저장해야 합니다. 다시 한 번 설명하자면 내부 클래스는 어느 순간에 외부 방법을 호출하는 데 사용되는 것입니다. 이것이 바로 리셋입니다.
 
내부 클래스의 실례를 설명하는 방법은 포용 클래스의 실례에서만 호출할 수 있고 다른 곳에서는 호출할 수 없다. 예를 들면 다음과 같다. JAVA2 실용 튜토리얼 원본:
/**  ,  */
/**  Outer */
class Outer{
private static int size;
/**  Inner  */
public class Inner{
private int size;
/**  doStuff() */
public void doStuff(int size){
size++; // 
this.size++;   // 
Outer.this.size++; // 
System.out.println(size+" "+this.size+" "+Outer.this.size);
}
}// Inner 
/**  Outer testInner()  */
public void testInner(){
Inner i=new Inner();
i.doStuff(5);
}
/** main()  */
public static void main(String[] a){
Outer o=new Outer();
o.testInner();
}
}// Outer 

 
그렇다면 내부 클래스, 익명 클래스를 어떻게 사용하여 사건 처리를 실현합니까?JAVA---이벤트 어댑터 1. 이벤트 어댑터 --EventAdapter 는 다음 예제에서 마우스 어댑터를 사용합니다.
 
import java.awt.*;
  import java.awt.event.*;
  public class MouseClickHandler extends MouseAdaper{
    public void mouseClicked(MouseEvent e) // 
       { ……}
  }

   java.awt.이벤트 패키지에 정의된 이벤트 어댑터 종류는 다음과 같습니다. 1.ComponentAdapter(구성 요소 어댑터) 2.ContainerAdapter(용기 어댑터) 3.FocusAdapter(초점 어댑터) 4.KeyAdapter(키보드 어댑터) 5.MouseAdapter(마우스 어댑터) 6.MouseMotionAdapter(마우스 운동 어댑터) 7.Window Adapter(창 어댑터) 2.내부 클래스로 이벤트 처리 내부 클래스(inner class)를 실현하는 것은 다른 클래스에 정의된 클래스이다. 내부 클래스를 사용하는 주요 원인은 다음과 같다. ◇ 내부 클래스의 대상이 외부 클래스에 접근할 수 있는 구성원 방법과 변수, 개인 구성원을 포함하기 때문이다.◇ 사건감청기 구현시 내부 클래스·익명 클래스로 프로그래밍하면 기능 구현이 용이하다.◇ 이벤트 드라이버 작성, 내부 클래스 편리.따라서 내부 클래스가 응용할 수 있는 부분은 흔히 AWT의 이벤트 처리 메커니즘에 있다.예5.11
import java.awt.* ;
   import java.awt.event.*;
     public class InnerClass{
       private Frame f;
       private TextField tf;
       public InnerClass(){
       f=new Frame("Inner classes example");
       tf=new TextField(30);
     }
     public voidi launchFrame(){
       Label label=new Label("Click and drag the mouse");
       f.add(label,BorderLayout.NORTH);
       f.add(tf,BorderLayout.SOUTH);
       f.addMouseMotionListener(new MyMouseMotionListener());/* */
       f.setSize(300,200);
       f.setVisible(true);
     }
     class MyMouseMotionListener extends MouseMotionAdapter{ /* */
       public void mouseDragged(MouseEvent e) {
         String s="Mouse dragging: x="+e.getX()+"Y="+e.getY();
         tf.setText(s); }
       } ;
       public static void main(String args[]) {
         InnerClass obj=new InnerClass();
         obj.launchFrame();
       }
     }// 
    }

 
 
3. 익명 클래스(Anonymous Class)는 내부 클래스의 이름이 이런 대상을 만들 때 한 번만 사용되고 새로운 클래스는 기존의 부류에 계승되거나 인터페이스를 실현해야 익명 클래스를 사용할 수 있다. 익명 클래스 자체가 이름이 없기 때문에 구조 방법도 존재하지 않는다. 부류가 없는 부류의 구조 방법을 표시하고 부류를 다시 쓰는 방법을 사용해야 한다.이른바 익명이란 이 클래스는 이름도 없이 무참한 부류의 구조 방법을 보여주는 것이다.예5.12
import java.awt.* ;
   import java.awt.event.*;
    public class AnonymousClass{
     private Frame f;
     private TextField tf;
     public AnonymousClass(){
      f=new Frame("Inner classes example");
      tf=new TextField(30);
    }
    public void launchFrame(){
      Label label=new Label("Click and drag the mouse");
      f.add(label,BorderLayout.NORTH);
      f.add(tf,BorderLayout.SOUTH);
      f.addMouseMotionListener(new MouseMotionAdapter(){ // 
       public void mouseDragged(MouseEvent e){
        String s="Mouse dragging: x="+e.getX()+"Y="+e.getY();
        tf.setText(s); }
      } ); // 
      f.setSize(300,200);
      f.setVisible(true);
      }
       public static void main(String args[]) {
        AnonymousClass obj=new AnonymousClass();
        obj.launchFrame();
        }
      }

사실 자세하게 분석하면 예5.11과 5.12가 실현한 것은 모두 완전히 같은 기능이고 채택한 방식이 다를 뿐이다.5.11의 이벤트 처리 클래스는 내부 클래스이고 5.12의 이벤트 처리 클래스는 익명 클래스로 클래스의 관계로 볼 때 점점 명확하지 않지만 프로그램도 점점 간결해진다고 할 수 있다.이 두 가지 방식을 익히는 것도 도형 인터페이스의 프로그램을 작성하는 데 매우 도움이 된다.IDE에서 직접 실천해 보면 조금 더 깊이 이해할 수 있을 거예요.

좋은 웹페이지 즐겨찾기