자바 내부 클래스 와 이상 클래스 의 개념 및 사용

1 내부 클래스
자바 는 한 클래스 에서 다른 클래스 를 설명 하 는 것 을 지원 합 니 다.이러한 클래스 를 내부 클래스 라 고 부 르 고 내부 클래스 를 포함 하 는 클래스 는 내부 클래스 의 외 장 클래스 가 됩 니 다.
내부 클래스 의 클래스 에 서 는 클래스 변수 와 클래스 방법 을 설명 할 수 없습니다.외 장 류 의 클래스 에 서 는 내부 클래스 로 대상 을 설명 하고 외 장 류 의 구성원 으로 할 수 있 습 니 다.
내부 클래스 의 사용 규칙:
(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("       ");
        }
    }
}
在这里插入图片描述
자바 내부 클래스 와 이상 클래스 의 개념 및 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 류 의 사용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기