자바 내장 클래스 의 상세 한 해석 및 인 스 턴 스 코드

5712 단어 자바상감 류
자바 내장 클래스
지금까지 우 리 는 자바 파일 에서 클래스 를 직접 정의 했다.이러한 종 류 는 가방(package)의 등급 에 나타난다.자바 허용 클래스 의 끼 워 넣 기 정의.
한 클래스 에 다른 클래스 를 끼 워 넣 는 방법 을 설명 합 니 다.
내부 류
자바 는 클래스 내부 에서 클래스 를 정의 할 수 있 도록 합 니 다.이 클래스 가 static 수정자 가 없다 면 내부 에 포 함 된 클래스 를 내부 클래스(inner class)라 고 합 니 다.
내부 류 는 외부 대상 의 한 구성원 으로 여 겨 진다.내부 클래스 를 정의 할 때 저 희 는 접근 권한 제어(Public,private,proctected)가 있 습 니 다.
내부 클래스 를 사용 할 때,우 리 는 먼저 외부 대상 을 만들어 야 한다.내부 클래스 는 외부 대상 의 한 구성원 이기 때문에 우 리 는 대상 의 내부 에서 내부 클래스 를 자 유 롭 게 사용 할 수 있다.
인 스 턴 스 코드:

public class Test
{
  public static void main(String[] args)
  {
    Human me    = new Human("Vamei");
    me.drinkWater(0.3);
  }
}

class Human
{
  /**
   * inner class
   */
  private class Cup
  {
    public void useCup(double w)
    {
      this.water = this.water - w;
    }

    public double getWater()
    {
      return this.water;
    }

    private double water = 1.0;
  }

  /**
   * constructor
   */
  public Human(String n)
  {
    this.myCup = new Cup();
    this.name = n;
  }

  public void drinkWater(double w)
  {
    myCup.useCup(w);
    System.out.println(myCup.getWater());
  }


  private Cup myCup;
  private String name;
}

위의 예 에서 Cup 류 는 내부 류 이다.이 내부 클래스 는 private 접근 권한 이 있어 Human 내부 에서 만 사용 할 수 있 습 니 다.이렇게 되면 컵 류 는 Human 류 에 의 해 전용 되 는 클래스 가 된다.
만약 우리 가 다른 접근 권한 을 사용한다 면 내부 클래스 도 외부 에서 접근 할 수 있 습 니 다.예 를 들 어:

public class Test
{
  public static void main(String[] args)
  {
    Human me    = new Human("Vamei");
    me.drinkWater(0.3);

    Human.Cup soloCup = me.new Cup(); // be careful here
  }
}

class Human
{
  /**
   * inner class
   */                                                                               
  class Cup
  {
    public void useCup(double w)
    {
      this.water = this.water - w;
    }

    public double getWater()
    {
      return this.water;
    }

    private double water = 1.0;
  }

  /**
   * constructor
   */
  public Human(String n)
  {
    this.myCup = new Cup();
    this.name = n;
  }

  public void drinkWater(double w)
  {
    myCup.useCup(w);
    System.out.println(myCup.getWater());
  }


  private Cup myCup;
  private String name;
}

내부 클래스 는 기본 접근 권한(패키지 접근 권한)입 니 다.Test 클래스 에서 Human 의 내부 클래스 Cup 을 방문 하고 이 내부 클래스 를 사용 하여 대상 을 만 들 수 있 습 니 다.우리 가 만 들 때 유형 을 설명 하고 new 를 사용 하 는 방법 에 주의 하 십시오:
Human.Cup soloCup = me.new Cup();
내부 클래스 대상 을 만 들 때 외부 클래스 대상(me)을 기반 으로 이 외부 클래스 대상 을 통 해 Cup 대상(me.new)을 만들어 야 합 니 다.나 는 다음 절 에서 그 속 의 의 미 를 이야기 할 것 이다.
폐쇄 하 다
우리 가 내부 클래스 대상 을 직접 만 들 때 외부 클래스 대상 을 기반 으로 해 야 한 다 는 것 을 알 수 있다.내부 대상 은 반드시 외부 대상 에 의존 해 야 한 다 는 것 이다.

                                            내부 대상 과 외부 대상
이와 함께 내부 클래스 대상 은 외부 클래스 대상 의 구성원(private 멤버 라 도)을 방문 할 수 있다.다른 측면 에서 볼 때 내부 클래스 대상 은 생 성 시의 환경 정보,즉 다른 언어 에서 의 패 킷(closure)특성 을 추가 합 니 다.파 이 썬 패키지 참조
우 리 는 아래 의 예 를 본다.

public class Test
{
  public static void main(String[] args)
  {
    Human me    = new Human("Vamei");
    Human him    = new Human("Jerry");

    Human.Cup myFirstCup = me.new Cup();
    Human.Cup mySecondCup = me.new Cup();
    Human.Cup hisCup   = him.new Cup();
    System.out.println(myFirstCup.whosCup());
    System.out.println(mySecondCup.whosCup());
    System.out.println(hisCup.whosCup());
  }
}

class Human
{
  /**
   * inner class
   */
  class Cup
  {
    public String whosCup()
    {
      return name; // access outer field
    }
  }

  /**
   * constructor
   */
  public Human(String n)
  {
    this.name = n;
  }


  public void changeName(String n)
  {
    this.name = n;
  }

  private String name;
}

실행 결과:

Vamei
Vamei
Jerry

 위의 예 에서 저 희 는 내부 클래스 대상 을 통 해 외부 클래스 대상 의 name 구성원 을 방문 합 니 다.우리 가 서로 다른 외부 대상 을 바탕 으로 내부 대상 을 만 들 때 얻 은 환경 정보 도 이에 따라 달라 질 것 이다.
모자이크 static 클래스
우 리 는 클래스 내부 에서 static 클래스 를 정의 할 수 있 습 니 다.이러한 종 류 를 내장 static 류(nested static class)라 고 합 니 다.
외부 클래스 에 의존 하지 않 고 static 클래스 의 대상 을 직접 만 들 수 있 습 니 다.이에 따라 static 류 를 끼 워 넣 어도 외부 대상 의 방법 을 호출 할 수 없고 외부 대상 의 데 이 터 를 읽 거나 수정 할 수 없습니다.효과 적 으로 볼 때 static 류 를 포함 하여 네 임 스페이스(name space)를 넓 혔 습 니 다.예 를 들 어 아래 Human.Mongolian:

public class Test
{
  public static void main(String[] args)
  {
    Human.Mongolian him = new Human.Mongolian();
    him.Shout();
  }
}

class Human
{
  /**
   * nested class
   */
  static class Mongolian
  {
    public void Shout()
    {
      System.out.println("Oh...Ho...");
    }
  }
}

새 겨 진 static 클래스 를 정의 할 때,우 리 는 서로 다른 접근 권한 수식 자 를 가 질 수 있 습 니 다.
총결산
플러그 인 클래스 는 우리 가 더 좋 은 조직 클래스 를 허용 한다
내부 클래스 가 폐쇄 를 실현 하 였 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기