Java 프로그래밍의 내부 클래스 전체 해석

6810 단어 Java내부 클래스
Java 내부 클래스 및 실례화
Java에서 한 클래스(또는 메서드, 문장 블록)의 내부에서 다른 클래스를 정의할 수 있습니다. 내부 클래스(Inner Class)라고도 하고 네스트 클래스(Nested Class)라고도 합니다.
내부 클래스와 외부 봉인 클래스 사이에는 논리적인 소속 관계가 존재하기 때문에 일반적으로 그 클래스나 문장 블록을 정의하는 데만 사용되고 통용되지 않는 기능 논리를 실현하며 외부에서 그것을 인용할 때 반드시 완전한 이름을 제시해야 한다.
내부 클래스를 사용하는 주요 원인은 다음과 같습니다.
내부 클래스는 개인 데이터를 포함하여 외부 클래스의 데이터에 접근할 수 있다.
내부 클래스는 같은 가방의 다른 클래스에 대해 숨길 수 있습니다.
리셋 함수를 정의하고 대량의 코드를 작성하지 않으려면 익명 (anonymous) 내부 클래스를 사용하는 것이 비교적 편리하다.
클래스의 이름 충돌을 줄입니다.
다음 예제를 참조하십시오.

public class Outer {
  private int size;
  public class Inner {
    private int counter = 10;
    public void doStuff() {
      size++;
    }
  }
  public static void main(String args[]) {
    Outer outer = new Outer();
    Inner inner = outer.new Inner();
    inner.doStuff();
    System.out.println(outer.size);
    System.out.println(inner.counter);
    //  , 
    System.out.println(counter);
  }
}
이 코드는 내부 클래스 Inner를 포함하는 외부 클래스 Outer를 정의합니다.잘못된 문장을 주석하고 번역하면 두 개가 생성됩니다.class 파일:Outer.class와 Outer$Inner.class.내부 클래스는 독립된 바이트 파일로 컴파일된다는 것이다.
내부 클래스는 일종의 컴파일러 현상으로 가상 기기와 무관하다.컴파일러는 내부 클래스를 $기호로 외부 클래스와 내부 클래스를 구분하는 일반적인 클래스 파일로 번역할 것이며, 가상 머신은 이것에 대해 아무것도 모른다.
주의: 외부 클래스의 대상이 있어야만 내부 클래스의 대상을 생성할 수 있습니다. 내부 클래스는 외부 클래스의 구성원 변수에 접근해야 하기 때문에 구성원 변수는 실례화되어야 의미가 있습니다.
내부 클래스는 자바 1.1의 새로운 특성으로 일부 프로그래머들은 칭찬할 만한 진보라고 생각하지만 내부 클래스의 문법은 매우 복잡하고 좋은 코드 구조를 심각하게 파괴하며 자바가 C++보다 더욱 간단한 디자인 이념에 위배된다.
내부류가 증가한 것 같다. 아름답고 재미있지만 정말 불필요한 특성이다. 이것은 자바를 많은 언어가 고통받는 파멸적인 길로 들어서게 하는 것이 아닐까?이 강좌는 결코 이 문제에 대해 긍정적인 답안을 주려고 하지 않는다.
Java 정적 내부 클래스, 익명 내부 클래스, 구성원 내부 클래스 및 로컬 내부 클래스
내부 클래스는 정적 (static) 으로 사용할 수 있으며,public,protected,private 액세스 제어 문자를 사용할 수 있으며, 외부 클래스는public만 사용하거나 기본값만 사용할 수 있습니다.
구성원 내부 클래스
외부 클래스 내부에서 (방법 내부나 코드 블록 내부에 있지 않음) 직접 정의된 클래스는 구성원식 내부 클래스입니다. 외부 클래스의 모든 변수와 방법을 직접적으로private라고 할 수 있습니다.외부 클래스가 내부 클래스의 구성원 변수와 방법에 접근하려면 내부 클래스의 대상을 통해 얻어야 한다.
다음 코드를 참조하십시오.

public class Outer{
  private int size;
  public class Inner {
    public void dostuff() {
      size++;
    }
  }
  public void testTheInner() {
    Inner in = new Inner();
    in.dostuff();
  }
}
구성원식 내부 클래스는 외부 클래스의 일반 구성원과 같다.
구성원식 내부 클래스는public,protected,private,static,final,abstract를 포함하여 다양한 수식자를 사용할 수 있으며, 쓰지 않을 수도 있습니다.
static 수식자가 있으면 클래스급이고 그렇지 않으면 대상급이다.클래스 레벨은 외부 클래스를 통해 직접 접근할 수 있으며, 대상 레벨은 외부 객체를 먼저 생성한 후에야 접근할 수 있습니다.
비정적 내부 클래스에서static 구성원을 설명할 수 없습니다.
내부 클래스는 다음과 같이 서로 호출할 수 있습니다.

class A {
  // B、C  
  class B {}
  class C {}
}
구성원 내부 클래스 액세스
내부 클래스의 대상은 구성원 변수로 의존하는 외부 클래스 대상의 인용을 기록하기 때문에 이 외부 클래스의 대상을 찾아 구성원에 접근할 수 있다.이 구성원 변수는 시스템이 자동으로 비static의 내부 클래스에 추가합니다. 이름은 "outClassName.this"입니다.
1) 내부 클래스에 정의된 비정적 변수와 방법을 사용할 때 외부 클래스의 대상을 만들고 "outObjectName.new"조작부호에서 내부 클래스의 대상을 만들고 내부 클래스를 호출하는 방법은 다음과 같다.

public class Demo{
  public static void main(String[] args) {
    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();
    inner.dostuff();
  }
}
class Outer{
  private int size;
  class Inner{
    public void dostuff() {
      size++;
    }
  }
}
2) static 내부 클래스는 외부 클래스의 static 구성원에 해당하며 그 대상과 외부 클래스 대상 사이에 의존 관계가 없기 때문에 직접 만들 수 있다.예는 다음과 같습니다.

public class Demo{
  public static void main(String[] args) {
    Outer.Inner inner = new Outer.Inner();
    inner.dostuff();
  }
}
class Outer{
  private static int size;
  static class Inner {
    public void dostuff() {
      size++;
      System.out.println("size=" + size);
    }
  }
}
실행 결과:

size=1
3) 내부 클래스는 외부 클래스의 성분에 직접 접근할 수 있기 때문에 내부 클래스와 외부 클래스에 같은 이름의 속성이나 방법이 존재할 때 명칭 충돌을 초래할 수 있다.따라서 다음 그림과 같이 다중 레이어 호출을 지정할 수 있습니다.

public class Outer{
  private int size;
  public class Inner{
    private int size;
    public void dostuff(int size){
      size++; //   size;
      this.size; //   size
      Outer.this.size++; //   size
    }
  }
}
부분 내부 클래스
로컬 클래스(Local class)는 코드 블록에 정의된 클래스입니다.그것들은 그것들을 정의하는 코드 블록에서만 볼 수 있다.
로컬 클래스에는 다음과 같은 몇 가지 중요한 특성이 있습니다.
  • 그것들을 정의한 코드 블록에서만 볼 수 있다
  • 그들의 코드 블록을 정의하는 모든 부분적인final 변수를 사용할 수 있다
  • 국부류는static일 수 없고 안에서static 구성원을 정의할 수 없다
  • 국부류는public,private,protected로 수식할 수 없고 부족한 것만 사용할 수 있다
  • 국부류는 abstract일 수 있습니다.
    다음 코드를 참조하십시오.
    
    public class Outer {
      public static final int TOTAL_NUMBER = 5;
      public int id = 123;
      public void func() {
        final int age = 15;
        String str = "http://www.weixueyuan.net";
        class Inner {
          public void innerTest() {
            System.out.println(TOTAL_NUMBER);
            System.out.println(id);
            // System.out.println(str); , final 
            System.out.println(age);
          }
        }
        new Inner().innerTest();
      }
      public static void main(String[] args) {
        Outer outer = new Outer();
        outer.func();
      }
    }
    
    실행 결과:
    
    5
    123
    15
    익명 내부 클래스
    익명 내부 클래스는 국부 내부 클래스의 특수한 형식이다. 즉, 변수명이 이 클래스를 가리키는 실례가 없고 구체적인 클래스 구현은 이 내부 클래스에 쓰인다.
    주의: 익명 클래스는 부모 클래스를 계승하거나 인터페이스를 실현해야 합니다.
    익명 내부 클래스를 사용하지 않고 추상적인 방법을 사용합니다.
    
    abstract class Person {
      public abstract void eat();
    }
    class Child extends Person {
      public void eat() {
        System.out.println("eat something");
      }
    }
    public class Demo {
      public static void main(String[] args) {
        Person p = new Child();
        p.eat();
      }
    }
    
    실행 결과:
    
    eat something
    이를 통해 알 수 있듯이 우리는 Child로 Person 클래스를 계승한 다음에 Child의 실례를 실현하여 이를 Person 클래스로 바꾸는 인용을 실현했다.그러나 이곳의 차일드 클래스를 한 번만 사용한다면 독립된 클래스로 작성하는 것은 번거롭지 않겠는가?
    이때 익명 내부류를 도입했다.익명 내부 클래스를 사용하여 다음을 수행합니다.
    
    abstract class Person {
      public abstract void eat();
    }
    public class Demo {
      public static void main(String[] args){
        
        //   Person  
        new Person() {
          public void eat() {
            System.out.println("eat something");
          }
        }.eat();
      }
    }
    익명 클래스는 Person 클래스를 계승하고 대괄호에서 추상적인 클래스를 실현하는 방법을 볼 수 있다.
    내부류의 문법은 비교적 복잡하고 실제 개발에서도 비교적 적게 사용된다. 본 강좌는 깊이 있게 설명할 생각은 없고 독자들도 내부류를 자바 학습의 중점으로 삼아서는 안 된다.

    좋은 웹페이지 즐겨찾기