비디오: 자바 11강. 내부 클래스와 익명 클래스 (1/2) 2024
여기에 큰 소식이 있습니다! 자바에서는 다른 클래스 안에 클래스를 정의 할 수 있습니다! 여기서
GameFrame
클래스는
MyActionListener
라는 클래스를 포함합니다.
import java. awt. FlowLayout;
import java. awt. 행사. ActionEvent;
import java. awt. 행사. ActionListener;
import java. util. 무작위;
import javax. 그네. JButton;
import javax. 그네. JFrame;
import javax. 그네. JLabel;
import javax. 그네. JTextField;
클래스 GameFrame이 JFrame을 확장합니다. { private static final long serialVersionUID = 1L;
int randomNumber = 새 임의 (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = new JTextField (5);
JLabel 레이블 = 새 JLabel (numGuesses + "추측");
public GameFrame () { setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (새 FlowLayout ());
add (텍스트 필드);
add (버튼);
add (레이블);
버튼을 누릅니다. addActionListener (
new MyActionListener ()
);
class MyActionListener는 ActionListener를 구현합니다. { @Override
public void actionPerformed (ActionEvent e) {
문자열 textFieldText =
textField
. getText ();
if (정수. parseInt (textFieldText) == randomNumber) {
버튼. setEnabled (false); 텍스트 필드. setText (textField. getText () + "예!")); 텍스트 필드. setEnabled (false);
} else {
textField. setText ("");
텍스트 필드. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "guess": "guesses";
라벨. setText (numGuesses + guessWord);
}
}
}
위의
MyActionListener
클래스는
내부 클래스입니다.
내부 클래스는 다른 클래스와 매우 비슷합니다. 그러나 내부 클래스의 코드 내에서 둘러싸는 클래스의 필드를 참조 할 수 있습니다. 예를 들어,
MyActionListener
내의 여러 문장은 textField 이름을 사용하고
textField
는
GameFrame
클래스에서 정의됩니다.
위의 코드는
MyActionListener
클래스를 한 번만 사용한다는 점에 유의하십시오. (유일한 사용은
button. addActionListener
버튼을 호출하는 것입니다.) 그래서, 한 번만 사용되는 무언가에 정말로 이름이 필요합니까? 아니, 그렇지 않아.
버튼을 호출 할 때 내부 클래스의 전체 정의를 대체 할 수 있습니다.addActionListener
. 이렇게하면
익명 내부 클래스가 생깁니다.
이것이 작동하는 방식입니다.
import java. awt. FlowLayout;
import java. awt. 행사. ActionEvent; import java. awt. 행사. ActionListener; import java. util. 무작위;
import javax. 그네. JButton;
import javax. 그네. JFrame;
import javax. 그네. JLabel;
import javax. 그네. JTextField;
클래스 GameFrame이 JFrame을 확장합니다. { private static final long serialVersionUID = 1L;
int randomNumber = 새 임의 (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = new JTextField (5);
JButton 버튼 = 새로운 JButton ("추측");
JLabel 레이블 = 새 JLabel (numGuesses + "추측");
public GameFrame () { setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (새 FlowLayout ());
add (텍스트 필드);
add (버튼);
add (레이블);
버튼을 누릅니다. addActionListener () 새로운 ActionListener () { @Override
public void actionPerformed (ActionEvent e) { 문자열 textFieldText = 텍스트 필드 getText ();
if (Integer.parseInt (textFieldText) = = randomNumber) { button setEnabled (false);
textField.setText (textField.getText () + "Yes!"); String guessWord = (numGuesses == 1)? "guesses": "추측하다";
}
}
); pack ();
setVisible (true);
}
}
내부 클래스는
actionPerformed
메소드와 같은 이벤트 핸들러와 같은 것들에 유용합니다.
익명의
내부 클래스에 대해 가장 어려운 점은 괄호, 중괄호 및 들여 쓰기를 추적하는 것입니다. 일부 겸손한 조언: 내부 클래스없이 코드를 작성하는 것으로 시작하십시오. 나중에 일반 자바 클래스에 지루해지면 평범한 클래스 중 일부를 내부 클래스로 변경하여 실험 해보십시오.