자바 연구 노트 (XII) 객체 지향 내부 클래스 ---

클래스 내부 액세스 규칙

  • 내부 클래스는 직접 개인 회원을 포함, 외부 클래스 멤버에 액세스 할 수 있습니다.
    내부 클래스 외부 클래스에 대한 참조를 보유하고 있기 때문에, 포맷은 다음과 외부 클래스 이름 .this
  • 클래스의 내부 클래스 외부에 액세스하려면, 우리는 내부 객체를 설정해야합니다.
class Outer {           //外部类
    private int x = 1;
    class Inner{        //内部类
        int x = 2;
        void function() {
            int x = 3;
            System.out.println(x);
            System.out.println(this.x);
            System.out.println(Outer.this.x);
        }
    }
    void method() {
        Inner in = new Inner();
        in.function();
    }
}
public class InnerClassDemo {
    public static void main(String[] args) {
        Outer out = new Outer();
        out.method();
        Outer.Inner in = new Outer().new Inner();
        in.function();
    }
}

결과 :

3
2
1
3
2
1

액세스

  1. 클래스 정의 된 클래스의 외측 부재의 내측 위치 및 비 특허는 다른 클래스에 직접 외부 클래스 객체 내부에 설정 될 수있는 경우.
    형식 : 외부 내부 클래스 이름 클래스 이름 외부 개체 변수 이름 = 내부 클래스 객체 ;.
  2. 경우 클래스 위치에서 내측 부재는 상기 부재가 수정 변경 될 수있다.
    예를 들어 외부 클래스에 캡슐화 개인, 내부 클래스입니다.
    정적 : 내부 클래스 특성되도록 고정있다. (내부 정적 클래스가 수정되면, 당신은 직접 액세스 한계가 있었다, 외부 클래스의 정적 멤버에 액세스 할 수 있습니다.)

정적 내부 클래스

  • 다른 외부 클래스에서, 방법을 직접 액세스 비 정적 멤버의 정적 내부 클래스
class Outer {
    private static int x = 1;
    static class Inner {
        void function() {
            System.out.println(x);
        }
    }
}
public class InnerDemo2 {
    public static void main(String[] args) {
        new Outer.Inner().function();
    }
}
  • 다른 외부 클래스에서, 방법을 직접 액세스 정적 멤버 정적 내부 클래스
class Outer {
    private static int x = 1;
    static class Inner {
        static void function() {
            System.out.println(x);
        }
    }
}
public class InnerDemo3 {
    public static void main(String[] args) {
        Outer.Inner.function();
    }
}
  • 내부 클래스는 내부 클래스의 정적 멤버를 정의 할 때 정적해야합니다
    다음 코드를 컴파일 원인 컴파일 오류
class Outer {
    private static int x = 1;
    class Inner {               //此内部类中定义了静态成员但是此内部类不为静态
        static void function() {
            System.out.println(x);
        }
    }
}
public class InnerDemo3 {
    public static void main(String[] args) {
        Outer.Inner.function();
    }
}
  • 내부 클래스 외부 정적 클래스에있어서의 액세스 클래스는 내부 고정해야하는 경우.

원칙 정의 내부 클래스

일을 설명 할 때, 살아있는 것은 물건의 내부, 내부 클래스 내부의 현재 상황이 설명 할 필요가있다.

일부 내부 클래스

  • 화제의 내부 클래스 정의 :
  1. 수정할 수 없습니다 수정 회원.
  2. 외부 클래스의 멤버에 직접 액세스뿐만 아니라 외부 클래스에 대한 참조를 보유하고있다. 그러나 당신은 단지 최종 수정 된 지역 변수에 액세스 할 수있는 지역 변수에 액세스 할 수 없습니다. (JDK의 현재 버전 최종 생략 할 수 있음)
class Outer {
    void method(final int x) {
        class Inner {
            void function() {
                System.out.println(x);
            }
        }
        new Inner().function();
    }
}
public class InnerDemo4 {
    public static void main(String[] args) {
        Outer out = new Outer();
        out.method(7);
        out.method(8);//因为局部变量在栈内存中,每次一调用入栈,使用结束出栈。所以虽然是被final修饰,但是仍然可以重复调用。
    }
}

결과 :

7
8

익명 내부 클래스

  1. 익명 내부 클래스는 실제로 속기 형식 내부 클래스입니다.
  2. 전제는 익명의 내부 클래스를 정의 :
    내부 클래스는 클래스를 상속하거나 인터페이스를 구현해야합니다.
  3. 익명 내부 클래스 형식 : 새 상위 클래스 또는 인터페이스 () {} 서브 클래스 내용
abstract class Abs {
    abstract void method();
}
class Outer {
    int x = 3;
    /*class Inner extends Abs {
        @Override
        void mthod() {
            System.out.println(x);
        }
    }*/
    public void function() {
        //new Inner().mthod();
        new Abs() {
            @Override
            void method() {
                System.out.println(x);
            }
        }.method();
    }
}
public class InnerDemo5 {
    public static void main(String[] args) {
        new Outer().function();
    }
}

운영 결과

3

코드 위의 코멘트 섹션은, 익명의 내부 클래스의 형태는 밖으로 반영합니다.

  1. 익명 익명의 내부 클래스는 서브 클래스 객체입니다. 이는 해당 콘텐츠의 객체로 이해 될 수있다.
  2. 정의 가장하지 더 세 이상의 익명 내부 클래스 방법.
  3. 클래스도 어느 쪽도 상위 클래스 상속 인터페이스를 구현하는 경우, 당신은 익명의 내부 클래스를 만들 개체 클래스를 사용할 수 있습니다.
    예를 들면 :
public class InnerClassTest {
    public static void main(String[] args) {
        new Object() {  //如果左边有Object类型引用(Object ob = ),将无法调用method方法
            public void method() {
                System.out.println("method run");
            }
        }.method();
    }
}

연습

interface Inter {
    void method();
}
class Test {
    //补足代码,通过匿名内部类
}
public class InnerClassTest {
    public static void main(String[] args) {
        Test.function().method();
    }
}

분석 Test.function () 메소드 ();이 코드 라인 함수 ()가 정적 테스트 클래스의 메소드, 함수있어서 후 방법 () ()를 호출되어야 찾을 수 지정 호출 함수 () 메소드되어야한다는 이 방법은 () 메소드를 호출 계속할 수 있도록 그것은, 객체 및 내부 형식의 개체를 반환합니다.
다음과 같은 코드를 얻을 수 있습니다 :

interface Inter {
    void method();
}
class Test {
    //补足代码,通过匿名内部类
    static Inter function() {    //这里返回值类型为Inner
        return new Inter(){
           @Override
           public void method() {
               System.out.println("Hello World");
           }
       };
    }
}
public class InnerClassTest {
    public static void main(String[] args) {
        Test.function().method();
    }
} 

추천

출처www.cnblogs.com/liyuxin2/p/12324375.html