> Java > java지도 시간 > Java 기본의 내부 클래스 인스턴스에 대한 자세한 설명

Java 기본의 내부 클래스 인스턴스에 대한 자세한 설명

Y2J
풀어 주다: 2017-04-27 09:30:42
원래의
1331명이 탐색했습니다.

이 글은 주로 Java 기본 내부 클래스에 대한 자세한 설명과 예제를 소개하고 있습니다. 필요한 친구는

Java 기본 내부 클래스에 대한 자세한 설명과 예제

를 참고하세요.

내부 클래스는 이해하기 쉽지 않지만, 직설적으로 말하면 하나의 클래스에는 다른 클래스가 포함되어 있습니다.

사람이 뇌, 팔다리, 장기 및 기타 신체 부위로 구성되어 있고 내부 클래스도 심장과 같은 장기 중 하나: 고유한 속성과 동작(혈액, 박동)도 있습니다

분명히 여기서는 속성이나 방법으로 심장을 일방적으로 표현할 수 없지만 클래스가 필요합니다

사람의 몸에도 심장이 있듯이 내부 클래스가 외부에 있는 것처럼

예시 1: 내부 클래스의 기본 구조

//外部类
class Out {
  private int age = 12;  
  //内部类
  class In {
    public void print() {
      System.out.println(age);
    }
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out.In in = new Out().new In();
    in.print();
    //或者采用下种方式访问
    /*
    Out out = new Out();
    Out.In in = out.new In();
    in.print();
    */
  }
}
로그인 후 복사

실행 결과 :12

위의 예를 보면 내부 클래스가 실제로 좋은 코드 구조를 심각하게 훼손한다는 것을 어렵지 않게 알 수 있는데, 왜 여전히 내부 클래스를 사용해야 할까요?

내부 클래스는 외부 클래스의 객체 생성 없이 외부 클래스의 멤버 변수(프라이빗 포함)를 자유롭게 사용할 수 있기 때문에 이것이 내부 클래스의 유일한 장점이다.

의사를 통해 혈액을 채취하는 대신 심장이 신체의 혈액에 직접 접근할 수 있습니다

프로그램이 컴파일되면 Out.class와 Out$In.class라는 두 개의 .class 파일이 생성됩니다

위 프로그램에서 $는 Out을 의미하는데 .In에 있는 것이

Out.In in = new Out().new In()을 사용하여 내부 클래스의 객체를 생성할 수 있다. 이 방법에서 주의해야 할 소소한 지식 포인트

1. 앞부분의 Out은 내부 클래스 객체가 어떤 외부 클래스를 생성해야 하는지를 가리킨다

2. 반드시 있어야 한다 내부 클래스의 기능은 외부 클래스의 멤버 변수에 액세스하는 것이므로 내부 클래스의 객체가 생성되기 전에 외부 클래스의 객체가 되어야 합니다.

예 2: 내부 클래스의 변수 액세스 형식 클래스

class Out {
  private int age = 12;
   
  class In {
    private int age = 13;
    public void print() {
      int age = 14;
      System.out.println("局部变量:" + age);
      System.out.println("内部类变量:" + this.age);
      System.out.println("外部类变量:" + Out.this.age);
    }
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out.In in = new Out().new In();
    in.print();
  }
}
로그인 후 복사

실행 결과:

지역 변수:14
내부 클래스 변수: 13
외부 클래스 변수: 12

예제 1을 보면 내부 클래스에 동일한 이름의 멤버 변수와 지역 변수가 없는 경우 Out.this 속성을 지정하지 않고 내부 클래스 외부 클래스의 멤버 변수에 직접 액세스하는 것을 확인할 수 있습니다. 그렇지 않으면 내부 클래스의 지역 변수가 외부 클래스

의 멤버 변수를 덮어쓰고 내부 클래스 자체에 액세스할 수 있습니다. 외부 클래스의 멤버 변수인 경우에는 Out.this를 사용해야 합니다. 속성 이름

예 3: 정적 내부 클래스

class Out {
  private static int age = 12;
   
  static class In {
    public void print() {
      System.out.println(age);
    }
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out.In in = new Out.In();
    in.print();
  }
}
로그인 후 복사
실행 결과:

12

내부 클래스를 정적으로 만들기 위해 static을 사용하면 내부 클래스는 외부 클래스의 정적 멤버 변수에만 접근할 수 있다는 것을 알 수 있는데, 이는 한계가 있습니다

둘째, 내부 클래스는 정적으로, Out.In은 전체적으로 볼 수 있으며, 내부 클래스의 객체를 직접 새로 생성할 수 있습니다. (클래스 이름을 통해 static에 접근하며, 외부 클래스 객체 생성 여부는 상관없습니다)

예 4: Private 내부 클래스

class Out {
  private int age = 12;
   
  private class In {
    public void print() {
      System.out.println(age);
    }
  }
  public void outPrint() {
    new In().print();
  }
}
 
public class Demo {
  public static void main(String[] args) {
    //此方法无效
    /*
    Out.In in = new Out().new In();
    in.print();
    */
    Out out = new Out();
    out.outPrint();
  }
}
로그인 후 복사
실행 결과:

12

내부 클래스가 메소드로만 작동하려는 경우 외부 클래스에서 private을 사용하여 내부 클래스를 선언할 수 있습니다

위 코드에서 작업을 위해 In 클래스의 객체를 Out 클래스에서 생성해야 하며 더 이상 Out.In in = new를 사용할 수 없습니다. Out().new In() 내부 클래스 객체 생성

즉, 이때 내부 클래스는 외부 클래스로만 제어할 수 있습니다

마찬가지로 내 마음도 내 몸에 의해 제어되며, 다른 사람이 직접 접근할 수 없습니다

인스턴스 5: 메소드 내부 클래스

class Out {
  private int age = 12;
 
  public void Print(final int x) {
    class In {
      public void inPrint() {
        System.out.println(x);
        System.out.println(age);
      }
    }
    new In().inPrint();
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out out = new Out();
    out.Print(3);
  }
}
로그인 후 복사
실행 결과:

3

12
위 코드에서는 내부 클래스를 외부 클래스의 메소드로 옮긴 후 외부 클래스의 메소드에서 내부 클래스 객체를 생성하여 내부 클래스를 호출했습니다. method

이때 외부 클래스의 메소드를 호출해야 하는 경우 메소드에 매개변수가 전달되면 외부 클래스의 메소드 매개변수는 final

을 사용하여 정의해야 합니다. final의 경우, 여기서는 특별한 의미가 없으며 단지 표현의 한 형태일 뿐입니다.

위 내용은 Java 기본의 내부 클래스 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿