자바 전환 (위 또는 아래로 전환)

6129 단어
이른바 상 향 전환 이란 통속 적 으로 말 하면 자 류 가 부 류 로 바 뀌 는 것 이다.
A a=new B();
向上转型,就是说先创建一个B子类对象,然后把它强制转型为A类对象

이것 도 자바 가 제창 하 는 추상 적 인 프로 그래 밍 사상 에 부합된다.다음 코드 보기:
package a.b;
public class A {
public void a1() {
       System.out.println("Superclass");
}
}
A 의 하위 클래스 B:
package a.b;
public class B extends A {
public void a1() {
       System. out. println ("Children class");/부모 클래스 덮어 쓰기 방법
}
       public void b1 () {}/B 클래스 는 자신의 새로운 방법 을 정의 합 니 다.
}
C 클래스:
package a.b;
public class C {
public static void main(String[] args) {
       A a = new B ();/위로 전환
       a.a1();
}
}
C 를 실행 하면 Superclass 를 출력 합 니까? Children class 를 출력 합 니까?네가 원래 예 상 했 던 슈퍼 클래스 가 아니 라 Children class 다.이것 은 a 가 실제로 가리 키 는 것 은 하위 대상 이기 때문이다.물론 자바 가상 기 회 는 어떤 구체 적 인 방법 을 사용 해 야 하 는 지 자동 으로 정확하게 식별 할 수 있 으 니 걱정 하지 마 세 요.그러나 위로 전환 하기 때문에 a 대상 은 아버지 와 다른 방법 을 잃 어 버 릴 수 있다. 예 를 들 어 b1 ().쓸데없는 짓 아니 냐 는 의문 을 제기 할 수도 있다.우 리 는 충분히 이렇게 쓸 수 있다.
B a = new B();
a.a1();
확실히 그렇다!그러나 이 는 추상 적 인 프로 그래 밍 특색 을 잃 고 확장 성 을 떨 어 뜨 렸 다.그 뿐만 아니 라 프로 그래 밍 작업량 도 줄 일 수 있다.모니터 종류 Monitor:
package a.b;
public class Monitor{
public void displayText() {}
public void displayGraphics() {}
}
액정 표시 장치 류 LCDMonitor 는 Monitor 의 하위 클래스 입 니 다.
package a.b;
public class LCDMonitor extends Monitor {
public void displayText() {
       System.out.println("LCD display text");
}
public void displayGraphics() {
       System.out.println("LCD display graphics");
}
}
음극선관 모니터 류 CRTmonitor 는 자연히 Monitor 의 하위 클래스 이기 도 합 니 다.
package a.b;
public class CRTMonitor extends Monitor {
public void displayText() {
       System.out.println("CRT display text");
}
public void displayGraphics() {
       System.out.println("CRT display graphics");
}
}
플라스마 모니터 PlasmaMonitor 도 Monitor 의 하위 클래스 입 니 다.
package a.b;
public class PlasmaMonitor extends Monitor {
public void displayText() {
       System.out.println("Plasma display text");
}
public void displayGraphics() {
       System.out.println("Plasma display graphics");
}
}
현재 MyMonitor 류 가 있 습 니 다.만약 에 위로 전환 하지 않 았 다 면 MyMonitor 류 코드 는 다음 과 같 습 니 다.
package a.b;
public class MyMonitor {
public static void main(String[] args) {
       run(new LCDMonitor());
       run(new CRTMonitor());
       run(new PlasmaMonitor());
}
public static void run(LCDMonitor monitor) {
       monitor.displayText();
       monitor.displayGraphics();
}
public static void run(CRTMonitor monitor) {
       monitor.displayText();
       monitor.displayGraphics();
}
public static void run(PlasmaMonitor monitor) {
       monitor.displayText();
       monitor.displayGraphics();
}
}
위 코드 에 중복 코드 가 많 고 유지 하기 도 쉽 지 않다 는 것 을 깨 달 았 을 것 이다.위로 전환 하면 코드 가 더욱 간결 해 질 수 있 습 니 다.
package a.b;
public class MyMonitor {
public static void main(String[] args) {
       run(new LCDMonitor());                    //상 향 전환
       run(new CRTMonitor());                    //상 향 전환
       run(new PlasmaMonitor());           //상 향 전환
}
public static void run (Monitor monitor) {/부모 클래스 인 스 턴 스 를 매개 변수 로 합 니 다.
       monitor.displayText();
       monitor.displayGraphics();
}
}
우리 도 인터페이스의 방식 을 채택 할 수 있다. 예 를 들 어:
package a.b;
public interface Monitor {
abstract void displayText();
abstract void displayGraphics();
}
액정 표시 장치 류 LCDMonitor 를 약간 수정 합 니 다.
package a.b;
public class LCDMonitor implements Monitor {
public void displayText() {
       System.out.println("LCD display text");
}
public void displayGraphics() {
       System.out.println("LCD display graphics");
}
}
CRTmonitor, PlasmaMonitor 류 의 수정 방법 은 LCDMonitor 와 유사 하지만, MyMonitor 는 아무런 수정 도 하지 않 을 수 있다.
이 를 통 해 알 수 있 듯 이 위로 전환 하 는 것 은 유형의 다 형 성 을 나타 내 고 프로그램의 간결 성 을 강화 했다.
 하향 전환
자 류 가 부 류 로 전환 하 는 것 은 위로 전환 하 는 것 이다. 반대로 부 류 는 자 류 로 전환 하 는 것 이 바로 아래로 전환 하 는 것 이다. 그러나 하나의 조건 을 만족 시 켜 야 한다. 아래로 전환 할 때 현재 대상 이 하위 클래스 의 대상 이라는 것 을 알 아야 한다.
다음 의 예 를 보십시오.
A 클래스:
package a.b;
public class A {
void aMthod() {
       System.out.println("A method");
}
}
A 의 하위 클래스 B:
package a.b;
public class B extends A {
void bMethod1() {
       System.out.println("B method 1");
}
void bMethod2() {
       System.out.println("B method 2");
}
}
C 클래스:
package a.b;
public class C {
     public static void main(String[] args) {
            A a1 = new B ();/위로 전환
            a1.aMthod();   //부모 클래스 aMthod (), a1 분실 B 클래스 방법 bMethod 1 (), bMethod 2 () 호출
            B b1 = (B) a1;/아래로 전환, 컴 파일 오류 없 음, 실행 중 오류 없 음
            b1.aMthod();   //부모 클래스 A 호출 방법
            b1. bMethod 1 ();//B 클래스 호출 방법
            b1. bMethod 2 ();//B 클래스 호출 방법
            A a2 = new A();
            B b2 = (B) a2;/아래로 전환, 컴 파일 오류 없 음, 실행 중 오류 발생
            b2.aMthod();
            b2.bMethod1();
            b2.bMethod2();
     }
}
위의 코드 에서 우 리 는 다음 과 같은 결론 을 얻 을 수 있다. 아래로 전환 하려 면 강제 변환 을 사용 해 야 한다. C 프로그램 을 실행 하면 콘 솔 은 출력 할 것 이다.
Exception in thread "main"java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at                 a.b.C.main(C.java:14)
A method
A method
B method 1
B method 2
사실 흑체 부분의 아래로 전환 코드 후의 설명 은 실행 중 오류 가 발생 할 것 이 라 고 알려 주 었 습 니 다. 왜 앞의 한 마디 는 아래로 전환 코드 가 가능 하지만 뒤의 한 마디 는 오류 가 발생 합 니까? 이것 은 a1 이 하위 클래스 B 의 대상 을 가리 키 기 때문에 하위 클래스 B 의 인 스 턴 스 대상 b1 도 당연히 a1 을 가리 킬 수 있 습 니 다. a2 는 부모 클래스 대상 입 니 다. 하위 클래스 대상 b2 는 부모 클래스 대상 a2 를 가리 킬 수 없습니다. 그러면아래로 전환 을 실행 할 때 ClassCastException 이상 이 발생 하 는 것 을 어떻게 피 합 니까? 5.7.7 절 에서 배 운 인 스 턴 스 of 를 사용 하면 됩 니 다. C 류 코드 를 수정 합 니 다.
A a2 = new A();
if (a2 instanceof B) {
B b2 = (B) a2;
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
이렇게 처리 하면 유형 전환 시 ClassCastException 이상 이 발생 할 염려 가 없다.

좋은 웹페이지 즐겨찾기