내부 류 의 네 가지 용법

내부 클래스 Inner Class
관련 종 류 를 한데 묶 어 네 임 스페이스 의 혼란 을 낮 췄 다.하나의 내부 클래스 는 다른 클래스 에 정의 할 수 있 고 함수 에 정의 할 수 있 으 며 표현 식 의 일부분 으로 도 정의 할 수 있 습 니 다.자바 의 내부 클래스 는 모두 네 가지 로 나 뉜 다. 정적 내부 클래스 static inner class (also called nested class) 구성원 내부 클래스 member inner class 부분 내부 클래스 local inner class 익명 내부 클래스 anonymous inner class
정적 내부 클래스 Static Inner Class
가장 간단 한 내부 유형.클래스 정의 에 static 키 워드 를 추가 합 니 다.외부 클래스 와 같은 이름 을 가 질 수 없습니다.OuterClass $InnerClass. class 라 는 완전히 독립 된. class 파일 로 컴 파일 되 었 습 니 다.외부 클래스 의 정적 구성원 과 정적 방법 에 만 접근 할 수 있 으 며, 개인 적 인 정적 구성원 과 방법 을 포함 합 니 다.정적 내부 클래스 대상 을 생 성 하 는 방식 은 OuterClass. InnerClass inner = new OuterClass. InnerClass () 입 니 다.정적 내부 클래스 사용 코드:
package com.learnjava.innerclass;

class StaticInner
{
    privatestaticint a = 4;

    //      publicstaticclass Inner
    {
        publicvoid test()
        {
            //                  
            //           
            System.out.println(a);
        }

    }
}

publicclass StaticInnerClassTest
{

    publicstaticvoid main(String[] args)
    {
        StaticInner.Inner inner = new StaticInner.Inner();
        inner.test();
    }
}

구성원 내부 클래스 Member Inner Class
구성원 내부 클래스 도 다른 클래스 에 정의 되 지만 정의 할 때 static 로 수식 하지 않 습 니 다.구성원 내부 클래스 와 정적 내부 클래스 는 비정 상 구성원 변수 와 정적 구성원 변수 로 분류 할 수 있다.구성원 내부 클래스 는 인 스 턴 스 변수 와 같 습 니 다.이것 은 정적 이 든 비 정적 이 든 외부 클래스 의 모든 구성원 변수 와 방법 에 접근 할 수 있 습 니 다.외부 클래스 에 구성원 내부 클래스 를 만 드 는 인 스 턴 스: this. new Innerclass ();외부 클래스 외 에 내부 클래스 를 만 드 는 인 스 턴 스: (new Outerclass (). new Innerclass ();내부 클래스 에서 외부 클래스 에 접근 하 는 구성원: Outerclass. this. member 자세 한 내용 은 코드 예 참조:
package com.learnjava.innerclass;

class MemberInner
{
    privateint d = 1;
    privateint a = 2;

    //          publicclass Inner2
    {
        privateint a = 8;

        publicvoid doSomething()
        {
            //          
            System.out.println(d);
            System.out.println(a);//     a,          a

            //           a ?
            System.out.println(MemberInner.this.a);
        }

    }

}

publicclass MemberInnerClassTest
{

    publicstaticvoid main(String[] args)
    {

        //           
        //            
        MemberInner.Inner2 inner = new MemberInner().new Inner2();

        inner.doSomething();
    }
}

부분 내부 클래스 Local Inner Class
부분 내부 류 의 정 의 는 방법 에서 방법의 범위 보다 작다.내부 클래스 에서 가장 적 게 사용 되 는 유형 입 니 다.부분 변수 처럼 Public, proctected, private, static 에 의 해 수식 되 어 서 는 안 됩 니 다.접근 방법 에서 정 의 된 final 형식의 부분 변수 만 접근 할 수 있 습 니 다.부분 내부 류 는 방법 에서 정의 되 기 때문에 방법 에서 만 사용 할 수 있 습 니 다. 즉, 방법 에서 부분 내부 류 의 인 스 턴 스 를 생 성하 고 그 방법 을 호출 할 수 있 습 니 다.
package com.learnjava.innerclass;

class LocalInner
{
    int a = 1;

    publicvoid doSomething()
    {
        int b = 2;
        finalint c = 3;
        //          class Inner3
        {
            publicvoid test()
            {
                System.out.println("Hello World");
                System.out.println(a);

                //       final     
                // error: Cannot refer to a non-final variable b inside an inner
                // class defined in a different method
                // System.out.println(b);

                //     final  
                System.out.println(c);
            }
        }

        //                new Inner3().test();
    }
}

publicclass LocalInnerClassTest
{
    publicstaticvoid main(String[] args)
    {
        //        
        LocalInner inner = new LocalInner();
        //         
        inner.doSomething();
    }

}

익명 내부 클래스 Anonymous Inner Class
익명 내부 클래스 는 이름 이 없 는 부분 내부 클래스 로 키워드 class, extends, implements 를 사용 하지 않 고 구조 방법 이 없습니다.익명 내부 클래스 는 부모 클래스 를 암시 적 으로 계승 하거나 인 터 페 이 스 를 실현 했다.익명 내부 클래스 는 일반적으로 하나의 방법 매개 변수 로 많이 사용 된다.
package com.learnjava.innerclass;

import java.util.Date;

publicclass AnonymouseInnerClass
{

    @SuppressWarnings("deprecation")
    public String getDate(Date date)
    {
        return date.toLocaleString();

    }

    publicstaticvoid main(String[] args)
    {
        AnonymouseInnerClass test = new AnonymouseInnerClass();

        //     :
        String str = test.getDate(new Date());
        System.out.println(str);
        System.out.println("----------------");

        //        
        String str2 = test.getDate(new Date()
        {
        });//       ,       ,            
            //         Date       
        System.out.println(str2);
        System.out.println("----------------");

        //        ,          
        String str3 = test.getDate(new Date()
        {

            //         
            @Override
            @Deprecated
            public String toLocaleString()
            {
                return "Hello: " + super.toLocaleString();
            }

        });

        System.out.println(str3);
    }
}

생 성 된. class 파일 에서 익명 클래스 는 OuterClass $1. class 파일 을 생 성 합 니 다. 숫자 는 몇 번 째 익명 클래스 에 따라 유 추 됩 니 다.Swing 에서 내부 클래스 를 사용 하 는 예 는 다음 과 같 습 니 다.
package com.learnjava.innerclass;

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

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

publicclass SwingTest
{
    publicstaticvoid main(String[] args)
    {
        JFrame frame = new JFrame("JFrame");
        JButton button = new JButton("JButton");

        button.addActionListener(new ActionListener()
        {
            // new       ActionListener       

            @Override
            publicvoid actionPerformed(ActionEvent arg0)
            {
                System.out.println("Hello World");

            }
        });

        //    
        frame.getContentPane().add(button);

        //      
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(200, 200);

        frame.addWindowListener(new WindowAdapter()
        {
            //                  
            @Override
            publicvoid windowClosing(WindowEvent e)
            {

                System.out.println("Closing");
                System.exit(0);
            }
        });
        frame.setVisible(true);
    }

}

좋은 웹페이지 즐겨찾기