클래스 내부 액세스 규칙
- 내부 클래스는 직접 개인 회원을 포함, 외부 클래스 멤버에 액세스 할 수 있습니다.
내부 클래스 외부 클래스에 대한 참조를 보유하고 있기 때문에, 포맷은 다음과 외부 클래스 이름 .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
액세스
- 클래스 정의 된 클래스의 외측 부재의 내측 위치 및 비 특허는 다른 클래스에 직접 외부 클래스 객체 내부에 설정 될 수있는 경우.
형식 : 외부 내부 클래스 이름 클래스 이름 외부 개체 변수 이름 = 내부 클래스 객체 ;. - 경우 클래스 위치에서 내측 부재는 상기 부재가 수정 변경 될 수있다.
예를 들어 외부 클래스에 캡슐화 개인, 내부 클래스입니다.
정적 : 내부 클래스 특성되도록 고정있다. (내부 정적 클래스가 수정되면, 당신은 직접 액세스 한계가 있었다, 외부 클래스의 정적 멤버에 액세스 할 수 있습니다.)
정적 내부 클래스
- 다른 외부 클래스에서, 방법을 직접 액세스 비 정적 멤버의 정적 내부 클래스
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();
}
}
- 내부 클래스 외부 정적 클래스에있어서의 액세스 클래스는 내부 고정해야하는 경우.
원칙 정의 내부 클래스
일을 설명 할 때, 살아있는 것은 물건의 내부, 내부 클래스 내부의 현재 상황이 설명 할 필요가있다.
일부 내부 클래스
- 화제의 내부 클래스 정의 :
- 수정할 수 없습니다 수정 회원.
- 외부 클래스의 멤버에 직접 액세스뿐만 아니라 외부 클래스에 대한 참조를 보유하고있다. 그러나 당신은 단지 최종 수정 된 지역 변수에 액세스 할 수있는 지역 변수에 액세스 할 수 없습니다. (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
익명 내부 클래스
- 익명 내부 클래스는 실제로 속기 형식 내부 클래스입니다.
- 전제는 익명의 내부 클래스를 정의 :
내부 클래스는 클래스를 상속하거나 인터페이스를 구현해야합니다. - 익명 내부 클래스 형식 : 새 상위 클래스 또는 인터페이스 () {} 서브 클래스 내용
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
코드 위의 코멘트 섹션은, 익명의 내부 클래스의 형태는 밖으로 반영합니다.
- 익명 익명의 내부 클래스는 서브 클래스 객체입니다. 이는 해당 콘텐츠의 객체로 이해 될 수있다.
- 정의 가장하지 더 세 이상의 익명 내부 클래스 방법.
- 클래스도 어느 쪽도 상위 클래스 상속 인터페이스를 구현하는 경우, 당신은 익명의 내부 클래스를 만들 개체 클래스를 사용할 수 있습니다.
예를 들면 :
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();
}
}