java 익명 내부 클래스 실례 간략 분석
4870 단어 익명 내부 클래스
interface pr
{
void print1();
}
public class noNameClass
{
public pr dest()
{
return new pr(){
public void print1()
{
System.out.println("Hello world!!");
}
};
}
public static void main(String args[])
{
noNameClass c = new noNameClass();
pr hw=c.dest();
hw.print1();
}
}
pr도 하나의 클래스가 될 수 있지만 외부 호출 방법은 이 클래스나 인터페이스에서 외부에서 익명 클래스 내부를 호출할 수 없다는 것을 설명해야 합니다. 자바에서 내부 익명 클래스가 가장 많이 사용되는 곳은 프레임에 Listner를 넣는 것일 수도 있습니다.아래와 같다. 자바 코드
import java.awt.*;
import java.awt.event.*;
public class QFrame extends Frame {
public QFrame() {
this.setTitle(\"my application\");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
this.setBounds(10,10,200,200);
}
}
내부 익명 클래스는 내부 클래스를 만드는 것이지만 이름을 주지 않았다. 즉, 실례를 인용하지 않은 변수이다.
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
}
new는 Windows Adapter 대상을 만드는 것입니다. 뒤에 있는 {}는 이 괄호의 조작이 이 기본 대명상에 작용하고 위에 있는 자바 프로그램의 뒤에 함수체가 있음을 나타냅니다.이 용법의 역할은 대상의 실례를 만들고 override의 함수를 만드는 것이다.WindowsAdapter의 코드를 열면 알 수 있습니다.그것은 추상류다.Windows Listener 인터페이스의 구현입니다.Frame.addWindowListner(); 의 매개 변수는 Windows Listner이고 실행 중인 것은 Windows Adapter에서 파생된 익명 클래스입니다.1. 익명류의 존재를 어떻게 판단하나요?이름이 안 보여요. 그냥 부류new가 대상을 낸 것 같아요. 익명류의 이름은 없어요.먼저 단락 위조 코드
abstract class Father(){
....
}
public class Test{
Father f1 = new Father(){ .... } //
}
를 보면 일반적으로 new가 대상이 될 때 소괄호를 가진 후에 분호이어야 한다. 즉, new가 대상을 내면 이 문장이 끝난다.그러나 익명 내부 클래스가 나타나면 다르다. 괄호 뒤에 있는 것은 대괄호이고 대괄호 중에는 이 new 출원 대상의 구체적인 실현 방법이다.우리는 추상적인 클래스가 직접적으로 new가 될 수 없다는 것을 알고 있기 때문에 반드시 먼저 실현 클래스가 있어야만 new가 그 실현 클래스를 낼 수 있다.위의 위조 코드는 new가 Father의 실현 클래스이고 이 실현 클래스는 익명 내부 클래스임을 나타낸다.사실 위의 익명 내부 클래스를 분리하면
class SonOne extends Father{
...// ,
}
public class Test{
Father f1 = new SonOne() ;
}
2.익명 내부 클래스의 주의사항 주의 익명 클래스의 성명은 컴파일할 때 진행되고 실례화는 실행할 때 진행된다.이것은 for 순환 중의 new 문장이 같은 익명 클래스의 몇 가지 실례를 만드는 것이지 다른 익명 클래스의 몇 가지 실례를 만드는 것이 아니라는 것을 의미한다.익명 내부 클래스를 사용할 때 다음과 같은 몇 가지 원칙을 기억해야 한다.• 익명 내부 클래스는 정적 구성원, 방법 및 클래스를 정의할 수 없습니다.• 익명 내부 클래스는public,protected,private,static일 수 없습니다.• 익명 내부 클래스의 인스턴스 하나만 만들 수 있습니다.・ 익명 내부 클래스는 반드시 new의 뒤에 있고 그 은유로 하나의 인터페이스를 실현하거나 하나의 클래스를 실현한다.· 익명 내부류는 국부 내부류이기 때문에 국부 내부류의 모든 제한이 적용된다./내부 클래스는 외부 클래스의 정적 변수나 정적 방법에만 액세스할 수 있습니다.익명 클래스와 내부 클래스 중의this: 때로는 내부 클래스와 익명 클래스를 사용합니다.익명 클래스에서this를 사용할 때, 이this는 익명 클래스나 내부 클래스 자체를 가리킨다.이때 우리가 외부 클래스의 방법과 변수를 사용하려면 외부 클래스의 클래스 이름을 붙여야 한다.익명 내부 클래스의 작용 자바의 내부 클래스와 C++의 플러그인 클래스는 본질적으로 다르다. C++의 플러그인 클래스는 포장 클래스를 가리키는 핸들이 없다.단지 하나의 봉인 개념을 나타낼 뿐이다.그러나 자바는 내부 클래스가 다르기 때문에 패키지 클래스의 구성원에 접근할 수 있다. (이것은 패키지 클래스를 가리키는 핸들을 가지고 있음을 나타낸다.)익명 내부 클래스는 내부 클래스의 간단한 쓰기 방법입니다. return new Wrapper {...};등가: Wrapped extends Wrapper {...}return new Wrapped(); 익명 내부류가 이 정도밖에 안 되는 건가?이런 케이스를 고려해 보자.
interface ICount {
int count();
}
class Parent {
int i = 0;
int count() {
return i++;
}
}
일종의 차일드가 있는데 Parent의count()방법을 계승하고 싶을 뿐만 아니라 ICount 인터페이스의count방법을 실현하고 싶다. 이럴 때 어떻게 해야 하나?내부 클래스는 크게 돋보일 수 있다.
class Child extends Parent {
ICount getCount() {
return new ICount {
int i = 0;
int count() {
return (i *= 2);
}
}
}
}
이 코드를 봐라
public static void main(String[] args) {
theApp = new Analyzer();
SwingUtilities.invokeLater(new Runnable() { // Anonymous Runnable class
// object
public void run() { // Run method executed in thread
theApp.creatGUI(); // Call static GUI creator
}
});
}
public static void main(String[] args) {
theApp = new Analyzer(); //
SwingUtilities.invokeLater(new Runnable() { // Anonymous Runnable class
// ,
// Runnable //
// object
public void run() { // Run method executed in thread
theApp.creatGUI(); // Call static GUI creator
}
});
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
내부 클래스, 정적 내부 클래스, 국부 내부 클래스, 익명 내부 클래스정의: 하나의 클래스 내부에서 하나의 클래스를 정의했는데 이 클래스가 바로 내부 클래스이다. 특징: ① 내부 클래스는 해당 클래스의 속성(해당 클래스의 사유 속성 포함)에 접근할 수 있고 내부 클래스가 자체 대상을 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.