자바 노트 - 정적 내부 클래스 / 내부 클래스

전송:http://www.cnblogs.com/simply-zhao/archive/2008/04/13/1151122.html
[정적 내부 클래스] 클래스 성명 에 'static' 키 워드 를 포함 하 는 내부 클래스 입 니 다.다음 예제 코드 와 같이:
public class InnerClass {
    private static String nickName = "anan";
    private String name;
    private int age;
    
    public InnerClass(String name, int age)
    {
        this.name = name;
        this.age = age;
    }
    
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name; 
    }
    
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    
    public static class Inner
    {
        private String heart = "zhaoli";
        public String getHeart()
        {
            return heart;
        }
        public void setHeart(String h)
        {
            this.heart = h;
        }
        
        public void print()
        {
            System.out.println(InnerClass.nickName);
            System.out.println(getHeart());
        }
    }
}

 
public class InnerClassTest {
    public static void main(String[] args)
    {
        InnerClass.Inner inner = new InnerClass.Inner();
        inner.print();
        inner.setHeart("simple-simply");
        inner.print();
    }
}

 테스트 출력:
ananzhaolianansimple-simply
이것 은 Public 가 수식 하 는 정적 내부 클래스 가 외부 클래스 의 사용 과 크게 다 르 지 않다 는 것 을 설명 합 니 다. 'OuterClass. InnerClass' 의 방식 으로 이러한 수식 하 는 정적 내부 클래스 를 참조 합 니 다. <정적 구성원 클래스 특성 >
  • 정적 구성원 류 는 외부 클래스 의 모든 정적 필드 나 정적 방법
  • 에 접근 할 수 있 습 니 다.
  • 정적 방법 이나 정적 필드 처럼 정적 구성원 류 는 Public / private / default 권한 수정자
  • 가 있 습 니 다.
    < 정적 구성원 클래스 제약 조건 >
  • 정적 구성원 클래스 는 외부 클래스 와 이름 을 바 꿀 수 없습니다
  • 외부 클래스 의 정적 방법 처럼 외부 클래스 의 인 스 턴 스 필드 와 인 스 턴 스 방법
  • 에 직접 접근 할 수 없습니다.
  • 정적 구성원 류 는 외부 클래스 의 최상 위 코드 나 외부 클래스 의 다른 정적 구성원 류 의 최상 위 코드 에 만 정의 할 수 있 습 니 다 (끼 워 넣 기 정의).외부 클래스 의 어떤 함수 에 정의 할 수 없습니다.

  • 정적 구성원 클래스 B 를 A 의 보조 클래스 로 언제 사용 하고 A 에 만 사용 할 때 B 를 A 의 정적 구성원 클래스 로 정의 할 수 있 습 니까?예 를 들 어 JDK 의 LinkedList 클래스 에는 Entry 정적 멤버 클래스 가 있 습 니 다.
    public class LinkedList<E> extends AbstractSequentialList<E> 
       …;
       private static class Entry<E> {
        E element;
        Entry<E> next;
        Entry<E> previous;
    
        Entry(E element, Entry<E> next, Entry<E> previous) {
            this.element = element;
            this.next = next;
            this.previous = previous;
        }
        }
        …;
    }

    분명히
    LinkedList
    링크 목록
    자체 사용.
    [비정 상 내부 클래스]
    정적 구성원 클래스
    '키 워드 는 멤버 클래스 가 됩 니 다.
    public class InnerClass {
        private static String nickName = "anan";
        private String name;
        private int age;
        
        public InnerClass(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
        
        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name; 
        }
        
        public int getAge()
        {
            return age;
        }
        public void setAge(int age)
        {
            this.age = age;
        }
        
        public class Inner
        {
            private String heart = "zhaoli";
            public String getHeart()
            {
                return heart;
            }
            public void setHeart(String h)
            {
                this.heart = h;
            }
            
            public void print()
            {
                System.out.println(InnerClass.nickName);
                System.out.println(InnerClass.this.name);
                System.out.println(InnerClass.this.age);
                System.out.println(getHeart());
            }
        }
    }
    public class InnerClassTest {
        public static void main(String[] args)
        {
            InnerClass outer = new InnerClass("simply-simple", 23);
            
            InnerClass.Inner inner = outer.new Inner();
            inner.print();
        }
    }
    

    테스트 출력:
    anansimply-simple23zhaoli
    외부 클래스 와 유사 한 인 스 턴 스 함수, 구성원 클래스 에는 Public / private / default 이 있 습 니 다.
    권한 수정자
    하나의 구성원 클래스 인 스 턴 스 는 반드시 외부 클래스 인 스 턴 스 에 속 합 니 다. 구성원 클래스 는 외부 클래스 의 모든 인 스 턴 스 필드 와 인 스 턴 스 함수 에 접근 할 수 있 습 니 다.하나의 구성원 클래스 인 스 턴 스 는 반드시 외부 클래스 에 속 하 는 인 스 턴 스 입 니 다. 그러면 어떻게 구성원 클래스 내부 에서 외부 클래스 인 스 턴 스 를 얻 습 니까?예시 코드 에서 보 듯 이 "OuterClass. this" 를 사용 합 니 다.
    '라 는 형식 이다.
    내부 클래스 인 스 턴 스 가 속 한 외부 클래스 인 스 턴 스 를 지정 합 니 다.
    내부 클래스 인 스 턴 스 는 외부 클래스 의 인 스 턴 스 방법 에서 만 들 수 있 습 니 다. 내부 클래스 인 스 턴 스 가 속 한 외부 인 스 턴 스 를 새로 만 듭 니 다.
    일부 인 스 턴 스 는 자 연 스 럽 게 외부 인 스 턴 스 를 만 드 는 방법 에 대응 하 는 외부 인 스 턴 스 입 니 다.
    또한 예제 코드 에서 보 듯 이 주어진 외부 클래스 인 스 턴 스 outerClass 에 대해 내부 클래스 인 스 턴 스 를 직접 만 들 수 있 습 니 다. 문법 형식 은 다음 과 같 습 니 다.
    OuterClass.InnerClass innerClass = outerClass.new InnerClass();
    < 멤버 클래스 제약 조건 >
  • 구성원 류 는 외부 클래스 와 이름 을 바 꿀 수 없습니다
  • 구성원 클래스 에서 static 필드, 방법 과 클래스 (static final 형식의 상수 정의 제외) 를 정의 할 수 없습니다.한 구성원 클래스 인 스 턴 스 는 반드시 외부 클래스 인 스 턴 스 와 연결 되 기 때문에 이 static 정 의 는 외부 클래스 로 이동 할 수 있 습 니 다
  • 구성원 류 는 인터페이스 (interface) 가 될 수 없습니다.구성원 류 는 반드시 외부 클래스 의 실례 에 의 해 실례 화 될 수 있어 야 하기 때문에 인 터 페 이 스 는 실례 화 할 수 없다.사실은 예제 코드 에서 보 듯 이 구성원 류 의 형식 으로 인 터 페 이 스 를 정의 하면 이 인 터 페 이 스 는 실제 적 으로 정적 구성원 류 이 고 static 키 워드 는 inner interface 에 포함 되 어 있 습 니 다 (implicit).

  •  
    멤버 클래스 는 언제 사용 하나 요?
    구성원 류 의 현저 한 특성 은 구성원 류 가 외부 클래스 의 인 스 턴 스 를 방문 할 수 있 는 임의의 필드 와 방법 이다.하나의 유형 이 대외 적 으로 공공 인 터 페 이 스 를 제공 하 는 실현 을 편리 하 게 하 는 것 은 구성원 류 의 전형 적 인 응용 이다.JDK Collection 라 이브 러 리 의 경우 각 Collection 클래스 는 클 라 이언 트 가 하나의 Collection 인 스 턴 스 를 통일 적 으로 수행 할 수 있 도록 해당 하 는 Iterator 를 제공 해 야 합 니 다.각 Collection 류 의 Iterator 구현 은 이 Collection 류 의 구성원 류 로 정의 된다.예 를 들 어 JDK 에서 AbstractList 류 의 코드 세 션:
    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
        private class Itr implements Iterator<E> {
             ………;
        }
    
         public Iterator<E> iterator() {
            return new Itr();
         }
    }

     
    AbstractList 에 정 의 된 Itr 는 AbstractList 의 임의의 필드 와 방법 을 방문 할 수 있 기 때문에 Iterator 를 실현 하기 편리 하고 AbstractList 가 외부 에 더 많은 인 터 페 이 스 를 노출 하지 않 아 도 됩 니 다.
    구성원 클래스 메커니즘 이 없 으 면 Abastractlist 소스 코드 외 에 Iterator 를 실현 하 는 클래스 Itr 만 정의 합 니 다. 이 클래스 는 AbstractList 인 스 턴 스 구성원 list 가 있 습 니 다. Itr 가 목록 의 내부 정 보 를 가 져 와 서 옮 겨 다 닐 수 있 도록 AbstractList 는 반드시 Itr 에 추가 접근 인 터 페 이 스 를 개방 해 야 합 니 다.

    좋은 웹페이지 즐겨찾기