자바 내부 클래스 와 이상 클래스 의 개념 및 사용
자바 는 한 클래스 에서 다른 클래스 를 설명 하 는 것 을 지원 합 니 다.이러한 클래스 를 내부 클래스 라 고 부 르 고 내부 클래스 를 포함 하 는 클래스 는 내부 클래스 의 외 장 클래스 가 됩 니 다.
내부 클래스 의 클래스 에 서 는 클래스 변수 와 클래스 방법 을 설명 할 수 없습니다.외 장 류 의 클래스 에 서 는 내부 클래스 로 대상 을 설명 하고 외 장 류 의 구성원 으로 할 수 있 습 니 다.
내부 클래스 의 사용 규칙:
(1)내부 클래스 는 클래스 에서 설명 하 는 방법 이나 변수 와 같이 내부 클래스 를 자신의 구성원 으로 간주한다.
(2)외 장 류 의 유형 체 에서 내부 류 로 성명 할 수 있 는 대상 으로 외 장 류 의 구성원 으로 한다.
(3)외 장 류 의 구성원 변 수 는 내부 클래스 에서 여전히 유효 하 며 내부 클래스 의 방법 도 외 장 류 중의 방법 을 호출 할 수 있다.
(4)내부 클래스 의 클래스 에서 클래스 변수 와 방법 을 설명 할 수 없습니다.
(5)외 장 류 와 내부 류 는 컴 파일 할 때 두 개의'class 파일'을 생 성 합 니 다.
예 를 들 어 어떤 유형의 농장 은 특수 한 종류의 소 를 기 르 지만 다른 농장 에서 이런 특수 한 종류의 소 를 기 르 는 것 을 원 하지 않 는 다.그러면 이런 유형의 농장 은 이런 특수 한 종류의 소 를 자신의 내부 류 로 만 들 수 있다.
다음 예 1(Example 1.1.자바)에는 RedCow Form(붉 은 소 농장)류 가 있 는데,이 류 에는 RedCow(붉 은 소)라 는 내부 류 가 있다.
RedCowForm.java
public class RedCowForm {
static String formName;
RedCow cow; //
RedCowForm() {
}
RedCowForm(String s) {
cow = new RedCow(150, 112, 5000);
formName = s;
}
public void showCowMess() {
cow.speak();
}
class RedCow { //
String cowName = " ";
int height, weight, price;
RedCow(int h, int w, int p) {
height = h;
weight = w;
price = p;
}
void speak() {
System.out.println(" " + cowName + ", :" + height + "cm :" + weight + "kg, " + formName);
}
} //
}
115526523
Example1.1.java
public class Example1_1 {
public static void main(String[] args) {
RedCowForm form = new RedCowForm(" ");
form.showCowMess();
form.cow.speak();
}
}
특히 주의해 야 할 것 은 자바 컴 파 일 러 가 생 성 한 내부 클래스 의 바이트 파일 의 이름과 일반적인 클래스 가 다 르 고 내부 클래스 에 대응 하 는 바이트 파일 의 이름 형식 은'외부 클래스 이름$내부 클래스 이름'입 니 다.예 를 들 어 예 1 에서 내부 클래스 의 바이트 파일 은 RedCow Form$RedCow.class 입 니 다.따라서 바이트 파일 을 다른 개발 자 에 게 복사 해 야 할 때 내부 클래스 의 바이트 파일 을 잊 지 말 아야 한다.내부 클래스 는 static 내부 클래스 로 수식 할 수 있 습 니 다.예 를 들 어 예 1 의 내부 클래스 성명 은 static classRedCow 일 수 있 습 니 다.클래스 는 데이터 형식 입 니 다.그러면 static 내부 클래스 는 외 장 류 중의 하나 입 니 다.그러면 프로그램 은 다른 클래스 에서 static 내부 클래스 를 사용 하여 대상 을 만 들 수 있 습 니 다.그러나 주의해 야 할 것 은 static 내부 클래스 가 외부 클래스 의 인 스 턴 스 구성원 변 수 를 조작 할 수 없습니다.
예 1 의 내부 클래스 RedCow 를 static 내부 클래스 로 변경 하면 예 1 의 Example 11
주 클래스 의 main 방법 에 다음 과 같은 코드 를 추가 합 니 다.
RedCowForm.RedCow redCow = new RedCowForm.RedCow(180,119,6000);
redCow.speak();
메모:내부 클래스 가 아 닌 static 클래스 는 안 됩 니 다.2 익명 클래스
2.1 하위 클래스 와 관련 된 익명 클래스
하위 클래스 대상 을 만 들 때 부모 클래스 의 구조 방법 외 에 도 클래스 가 있 습 니 다.이 체 는 하위 클래스 에서 클래스 성명 을 제거 한 클래스 로 익명 클래스 라 고 합 니 다.
Bank 가 클래스 라 고 가정 하면 다음 코드 는 Bank 의 하위 클래스(익명 클래스)로 대상 을 만 드 는 것 입 니 다.
new Bank() {
};
하위 클래스 와 관련 된 익명 클래스:(1)익명 클래스 는 하위 클래스 로 이름 없 이 사용 할 수 있 기 때문에 익명 클래스 로 대상 을 설명 할 수 없 지만 익명 클래스 로 대상 을 만 들 수 있 습 니 다.
(2)익명 류 는 부 류 를 계승 할 수 있 는 방법 도 부 류 를 다시 쓸 수 있 는 방법 이다.
(3)익명 클래스 를 사용 할 때 특정한 클래스 에서 익명 클래스 로 대상 을 직접 만 들 기 때문에 익명 클래스 는 반드시 내부 클래스 일 것 이다.
(4)익명 류 는 외 장 류 의 구성원 변수 와 방법 에 접근 할 수 있 으 며,익명 류 의 클래스 에 서 는 static 구성원 변수 와 static 방법 을 설명 할 수 없습니다.
(5)익명 류 는 하위 클래스 이지 만 클래스 이름 이 없 기 때문에 익명 류 로 대상 을 만 들 때 부모 류 의 구조 방법 을 직접 사용 해 야 한다.
예 2:이 종 류 는 모두 4 가지 종류 가 있다.(Example 21.자바),쇼 보드 클래스,
OutputAlphabet 형식,OutputEnglish.java.이 익명 의 대상 은 그리스 알파벳 을 출력 하 는 것 을 책임 진다.
OutputAlphabet.java
abstract class OutputAlphabet {
public abstract void output();
}
OutputAlphabet .java
public class OutputEnglish extends OutputAlphabet { //
public void output(){
for (char c='a';c<='z';c++){
System.out.printf("%3c",c);
}
}
}
ShowBoard .java
public class ShowBoard {
void showMess(OutputAlphabet show) { // show OutputAlphabet
show.output();
}
}
Example2_1.java
public class Example2_1 {
public static void main(String[] args) {
ShowBoard board = new ShowBoard();
board.showMess(new OutputEnglish());// OutputAlphabet OutputEnglish
board.showMess(new OutputAlphabet() { // OutputAlphabet
@Override
public void output() {
for (char c = 'α'; c <= 'ω'; c++) //
System.out.printf("%3c", c);
}
});//
}
}
2.2 인터페이스 와 관련 된 익명 클래스
인터페이스 와 관련 된 익명 클래스
Computable 이 인터페이스 라 고 가정 하면 자바 는 인터페이스 이름과 하나의 클래스 로 익명 의 대상 을 직접 만 들 수 있 습 니 다.이러한 체 는 Computable 인터페이스의 클래스 제거 성명 을 실현 한 클래스 로 익명 류 라 고 합 니 다.
다음 코드 는 Computable 인 터 페 이 스 를 실현 한 클래스(익명 클래스)로 대상 을 만 드 는 것 입 니 다.
new Computable(){
};
다음 예 는 인터페이스 와 관련 된 익명 류 의 용법 을 보 여 줍 니 다.
interface SpeakHello {
void speak();
}
class HelloMachine {
public void turnOn(SpeakHello hello) {
hello.speak();
}
}
public class Example7_3 {
public static void main(String[] args) {
HelloMachine machine = new HelloMachine();
machine.turnOn(new SpeakHello() {
@Override
public void speak() {
System.out.println("hello,you are welcome!");
}
});
machine.turnOn(new SpeakHello() {
@Override
public void speak() {
System.out.println(" , !");
}
});
}
}
3 이상 클래스
이상 이란 프로그램 이 실 행 될 때 오류 가 발생 할 수 있 습 니 다.예 를 들 어 존재 하지 않 는 파일 을 열 려 고 하 는 등 이상 처 리 는 프로그램의 제어 절 차 를 바 꾸 어 프로그램 이 오 류 를 처리 할 수 있 도록 합 니 다.프로그램 이 실 행 될 때 자바 실행 환경 은 이상 클래스 Exception 의 해당 하위 클래스 로 이상 대상 을 만 들 고 처 리 를 기다 리 고 있 습 니 다.이상 대상 은 다음 과 같은 방법 으로 이상 한 정 보 를 얻 거나 출력 할 수 있 습 니 다.
이상 대상 은 다음 과 같은 방법 으로 이상 한 정 보 를 얻 거나 출력 할 수 있 습 니 다.
public String getMessage();
public void printStackTrace();
public String toString();
3.1 try-catch 구문자바 는 try-catch 문 구 를 사용 하여 이상 을 처리 합 니 다.발생 할 수 있 는 이상 동작 을 try-catch 문장의 try 부분 에 두 고 이상 이 발생 한 후의 처 리 를 catch 부분 에 두 었 습 니 다.
try-catch 문장의 형식 은 다음 과 같 습 니 다.
try{
}
catch(ExceptionSubClass1 e){
...
}
catch(ExceptionSubClass2 e){
...
}
다음 예 는 try-catch 문장의 용법 을 보 여 줍 니 다.
public class Example3_1 {
public static void main(String[] args) {
int n = 0, m = 0, t = 1000;
try {
m = Integer.parseInt("8888");
n = Integer.parseInt("ab89"); // , catch
t = 7777; //t
} catch (NumberFormatException e) {
System.out.println(" :" + e.getMessage());
}
System.out.println("n=" + n + ",m=" + m + ",t=" + t);
try {
System.out.println(" I/O !");
throw new java.io.IOException(" ");
//System.out.println(" , , ");
} catch (java.io.IOException e) {
System.out.println(" :" + e.getMessage());
}
}
}
finally 서브 문 구 를 가 진 try~catch 문 구 는 문법 형식 이 다음 과 같 습 니 다.
try{ }
catch(ExceptionSubClass e){ }
finally{}
그 실행 체 제 는 try~catch 문 구 를 실행 한 후에 finally 서브 문 구 를 실행 하 는 것 입 니 다.즉,try 부분 에서 이상 이 발생 했 든 없 든 finally 서브 문 구 는 실 행 됩 니 다.3.2 사용자 정의 이상 클래스
(1)하나의 방법 은 그것 이 발생 하 는 이상 을 처리 하지 않 고 호출 차원 을 따라 위로 전달 하 며,그것 을 호출 하 는 방법 으로 이러한 이상 을 처리 하 는 것 을 성명 이상 이 라 고 한다.
이상 설명 방법:
이상 한 방법 명 뒤에 던 질 이상 한 목록 을 추가 합 니 다:
void compute(int x)throwsAri thmeticException
{//여기 이상 이 발생 했 지만 처리 되 지 않 았 습 니 다...}
(2)우 리 는 Exception 류 를 확장 하여 자신의 이상 류 를 정의 한 다음 에 어떤 방법 으로 이런 이상 이 발생 하 는 지 규정 할 수 있다.하나의 방법 은 성명 할 때 throws 키 워드 를 사용 하여 발생 할 몇 가지 이상 을 설명 하고 이 방법의 방법 체 에서 이상 한 체 조 를 구체 적 으로 제시 할 수 있 습 니 다.
즉,해당 이상 클래스 로 대상 을 만 들 고 throw 키 워드 를 사용 하여 이 이상 대상 을 던 져 서 이 방법 이 끝 납 니 다.
(3)일반적인 상황 에서 두 정수 의 합 을 계산 하 는 방법 은 어떠한 이상 도 방출 해 서 는 안 된다.그러나 특정한 특수 한 절차 에 대해 같은 번호 의 정수 에 대해 구 와 연산 을 허용 하지 않 을 수 있다.예 를 들 어 하나의 정수 가 수입 을 대표 하고 하나의 정수 가 지출 을 대표 할 때 이 두 정 수 는 같은 번호 가 될 수 없다.
예(Example 32.자바)에서 Bank 류 에는 income(int in,int out)방법 이 있 습 니 다.대상 이 이 방법 을 호출 할 때 반드시 매개 변수 in 에 게 정수,매개 변수 out 에 음 수 를 전달 해 야 합 니 다.또한 int+out 은 0 보다 커 야 합 니 다.그렇지 않 으 면 이 방법 은 이상(BankException.자바)을 던 집 니 다.따라서 Bank 류 는 income(int in,int out)방법 을 설명 할 때 throws 키 워드 를 사용 하여 이상 을 설명 합 니 다.
BankException.java
public class BankException extends Exception {
String message;
public BankException(int m, int n) {
message = " " + m + " " + n + " , .";
}
public String warnMess() {
return message;
}
}
Bank.java
public class Bank {
private int money;
public void income(int in, int out) throws BankException {
if (in <= 0 || out >= 0 || in + out <= 0) {
throw new BankException(in, out); // ,
}
int netIncome = in + out;
System.out.printf(" :%d
", netIncome);
money = money + netIncome;
}
public int getMoney() {
return money;
}
}
Example3_2.java
public class Example3_2 {
public static void main(String[] args) {
Bank bank = new Bank();
try {
bank.income(200, -100);
bank.income(300, -100);
bank.income(400, -100);
System.out.printf(" %d
", bank.getMoney());
bank.income(200, 100);
bank.income(99999, -100);
} catch (BankException e) {
System.out.println(" :");
System.out.println(e.warnMess());
}
System.out.printf(" %d
", bank.getMoney());
}
}
단언
단언 문 구 는 디 버 깅 코드 단계 에 사용 된다.디 버 깅 코드 단계 에서 단언 문 구 를 역할 을 발휘 하 게 하면 치 명 적 인 오 류 를 발견 할 수 있 습 니 다.프로그램 이 정식 적 으로 실 행 될 때 단언 문 구 를 닫 을 수 있 지만 단언 문 구 를 소스 코드 에 보관 합 니 다.나중에 응용 프로그램 이 디 버 깅 이 필요 하 다 면 단 어 를 다시 사용 할 수 있 습 니 다.
키워드 assert 를 사용 하여 단언 문 구 를 설명 합 니 다.단언 문 구 는 다음 과 같은 두 가지 형식 이 있 습 니 다.
assert booleanExpression;
assert booleanExpression:messagelException;
단언 문 사용 및 닫 기
자바 해석 기 를 사용 하여 프로그램 을 직접 실행 할 때 기본적으로 단언 문 구 를 닫 습 니 다.디 버 깅 프로그램 에서-ea 를 사용 하여 단언 문 구 를 사용 할 수 있 습 니 다.예 를 들 어:
java -ea mainClass
예 4 에서 한 배열 을 이용 하여 한 학생 의 5 개 과정의 성적 을 놓 고 프로그램 은 학생 의 성적 의 총 계 를 계산 하려 고 한다.디 버 깅 프로그램 에서 단언 문 구 를 사 용 했 는데 성적 이 마이너스 인 것 을 발견 하면 프로그램 은 즉시 실행 을 끝 냅 니 다.프로그램 디 버 깅 이 단언 문 을 여 는 운행 효 과 는 그림 4.1 과 같 고 단언 문 을 닫 는 운행 효 과 는 그림 4.2 와 같다.
import java.util.Scanner;
public class Example4 {
public static void main (String args[ ]) {
int [] score={-120,98,89,120,99};
int sum=0;
for(int number:score) {
assert number>0:" ";
sum=sum+number;
}
System.out.println(" :"+sum);
}
}
그림 4.1그림 4.2
5 종합 사례
다음 예 5 에 서 는 화물선 에 컨테이너 를 싣 는 시 뮬 레이 션 을 한다.만약 화물선 이 중량 을 초과 하면 화물선 은 이것 이 이상 이 라 고 생각 하고 컨테이너 를 싣 는 것 을 거절 할 것 이다.그러나 이상 이 발생 하 든 없 든 화물선 은 정시 에 출항 해 야 한다.
DangerException.java
public class DangerException extends Exception {
final String message = " ";
public String warnMess() {
return message;
}
}
CargoBoat.java
public class CargoBoat {
int realContent; //
int maxContent; //
public void setMaxContent(int c) {
maxContent = c;
}
public void loading(int m) throws DangerException {
realContent += m;
if(realContent>maxContent) {
throw new DangerException();
}
System.out.println(" "+realContent+" ");
}
}
Example5.java
public class Example5 {
public static void main(String[] args) {
CargoBoat ship = new CargoBoat();
ship.setMaxContent(1000);
int m =600;
try{
ship.loading(m);
m = 400;
ship.loading(m);
m = 367;
ship.loading(m);
m = 555;
ship.loading(m);
}
catch(DangerException e) {
System.out.println(e.warnMess());
System.out.println(" "+m+" ");
}
finally {
System.out.printf(" ");
}
}
}
자바 내부 클래스 와 이상 클래스 의 개념 및 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 류 의 사용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.