내부 류 의 네 가지 용법
11052 단어 자바내부 류자바 익명 내부 클래스생 성 대상대상
관련 종 류 를 한데 묶 어 네 임 스페이스 의 혼란 을 낮 췄 다.하나의 내부 클래스 는 다른 클래스 에 정의 할 수 있 고 함수 에 정의 할 수 있 으 며 표현 식 의 일부분 으로 도 정의 할 수 있 습 니 다.자바 의 내부 클래스 는 모두 네 가지 로 나 뉜 다. 정적 내부 클래스 static inner class (also called nested class) 구성원 내부 클래스 member inner class 부분 내부 클래스 local inner class 익명 내부 클래스 anonymous inner class
정적 내부 클래스 Static Inner Class
가장 간단 한 내부 유형.클래스 정의 에 static 키 워드 를 추가 합 니 다.외부 클래스 와 같은 이름 을 가 질 수 없습니다.OuterClass $InnerClass. class 라 는 완전히 독립 된. class 파일 로 컴 파일 되 었 습 니 다.외부 클래스 의 정적 구성원 과 정적 방법 에 만 접근 할 수 있 으 며, 개인 적 인 정적 구성원 과 방법 을 포함 합 니 다.정적 내부 클래스 대상 을 생 성 하 는 방식 은 OuterClass. InnerClass inner = new OuterClass. InnerClass () 입 니 다.정적 내부 클래스 사용 코드:
package com.learnjava.innerclass;
class StaticInner
{
privatestaticint a = 4;
// publicstaticclass Inner
{
publicvoid test()
{
//
//
System.out.println(a);
}
}
}
publicclass StaticInnerClassTest
{
publicstaticvoid main(String[] args)
{
StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
}
}
구성원 내부 클래스 Member Inner Class
구성원 내부 클래스 도 다른 클래스 에 정의 되 지만 정의 할 때 static 로 수식 하지 않 습 니 다.구성원 내부 클래스 와 정적 내부 클래스 는 비정 상 구성원 변수 와 정적 구성원 변수 로 분류 할 수 있다.구성원 내부 클래스 는 인 스 턴 스 변수 와 같 습 니 다.이것 은 정적 이 든 비 정적 이 든 외부 클래스 의 모든 구성원 변수 와 방법 에 접근 할 수 있 습 니 다.외부 클래스 에 구성원 내부 클래스 를 만 드 는 인 스 턴 스: this. new Innerclass ();외부 클래스 외 에 내부 클래스 를 만 드 는 인 스 턴 스: (new Outerclass (). new Innerclass ();내부 클래스 에서 외부 클래스 에 접근 하 는 구성원: Outerclass. this. member 자세 한 내용 은 코드 예 참조:
package com.learnjava.innerclass;
class MemberInner
{
privateint d = 1;
privateint a = 2;
// publicclass Inner2
{
privateint a = 8;
publicvoid doSomething()
{
//
System.out.println(d);
System.out.println(a);// a, a
// a ?
System.out.println(MemberInner.this.a);
}
}
}
publicclass MemberInnerClassTest
{
publicstaticvoid main(String[] args)
{
//
//
MemberInner.Inner2 inner = new MemberInner().new Inner2();
inner.doSomething();
}
}
부분 내부 클래스 Local Inner Class
부분 내부 류 의 정 의 는 방법 에서 방법의 범위 보다 작다.내부 클래스 에서 가장 적 게 사용 되 는 유형 입 니 다.부분 변수 처럼 Public, proctected, private, static 에 의 해 수식 되 어 서 는 안 됩 니 다.접근 방법 에서 정 의 된 final 형식의 부분 변수 만 접근 할 수 있 습 니 다.부분 내부 류 는 방법 에서 정의 되 기 때문에 방법 에서 만 사용 할 수 있 습 니 다. 즉, 방법 에서 부분 내부 류 의 인 스 턴 스 를 생 성하 고 그 방법 을 호출 할 수 있 습 니 다.
package com.learnjava.innerclass;
class LocalInner
{
int a = 1;
publicvoid doSomething()
{
int b = 2;
finalint c = 3;
// class Inner3
{
publicvoid test()
{
System.out.println("Hello World");
System.out.println(a);
// final
// error: Cannot refer to a non-final variable b inside an inner
// class defined in a different method
// System.out.println(b);
// final
System.out.println(c);
}
}
// new Inner3().test();
}
}
publicclass LocalInnerClassTest
{
publicstaticvoid main(String[] args)
{
//
LocalInner inner = new LocalInner();
//
inner.doSomething();
}
}
익명 내부 클래스 Anonymous Inner Class
익명 내부 클래스 는 이름 이 없 는 부분 내부 클래스 로 키워드 class, extends, implements 를 사용 하지 않 고 구조 방법 이 없습니다.익명 내부 클래스 는 부모 클래스 를 암시 적 으로 계승 하거나 인 터 페 이 스 를 실현 했다.익명 내부 클래스 는 일반적으로 하나의 방법 매개 변수 로 많이 사용 된다.
package com.learnjava.innerclass;
import java.util.Date;
publicclass AnonymouseInnerClass
{
@SuppressWarnings("deprecation")
public String getDate(Date date)
{
return date.toLocaleString();
}
publicstaticvoid main(String[] args)
{
AnonymouseInnerClass test = new AnonymouseInnerClass();
// :
String str = test.getDate(new Date());
System.out.println(str);
System.out.println("----------------");
//
String str2 = test.getDate(new Date()
{
});// , ,
// Date
System.out.println(str2);
System.out.println("----------------");
// ,
String str3 = test.getDate(new Date()
{
//
@Override
@Deprecated
public String toLocaleString()
{
return "Hello: " + super.toLocaleString();
}
});
System.out.println(str3);
}
}
생 성 된. class 파일 에서 익명 클래스 는 OuterClass $1. class 파일 을 생 성 합 니 다. 숫자 는 몇 번 째 익명 클래스 에 따라 유 추 됩 니 다.Swing 에서 내부 클래스 를 사용 하 는 예 는 다음 과 같 습 니 다.
package com.learnjava.innerclass;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
publicclass SwingTest
{
publicstaticvoid main(String[] args)
{
JFrame frame = new JFrame("JFrame");
JButton button = new JButton("JButton");
button.addActionListener(new ActionListener()
{
// new ActionListener
@Override
publicvoid actionPerformed(ActionEvent arg0)
{
System.out.println("Hello World");
}
});
//
frame.getContentPane().add(button);
//
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.addWindowListener(new WindowAdapter()
{
//
@Override
publicvoid windowClosing(WindowEvent e)
{
System.out.println("Closing");
System.exit(0);
}
});
frame.setVisible(true);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.