Java 변형(상향 또는 하향) 상세 설명 및 간단한 사례

6567 단어 Java변형
Java 프로그래밍에서 유형 변환을 자주 만나는데 대상 유형 변환은 주로 상향 전환과 하향 전환을 포함한다.
상향 전환
우리는 현실에서 종종 이렇게 말한다. 이 사람은 노래를 할 줄 안다.여기서 우리는 이 사람이 흑인인지 백인인지, 성인인지 아이인지에 대해 전혀 관심을 가지지 않는다. 즉, 우리는 추상적인 개념인'사람'을 사용하는 경향이 있다.그리고 예를 들어 참새는 조류의 일종(조류의 자류)이고 조류는 동물 중의 일종(동물의 자류)이다.우리는 현실에서도 자주 이렇게 말한다. 참새는 새다.이 두 가지 견해는 사실상 이른바 상향 전환이고 통속적으로 말하면 자류가 부류로 전환되는 것이다.이것은 자바가 제창한 추상적인 프로그래밍 사상에 부합된다.다음 코드를 참조하십시오.

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("Childrenclass"); //  
} 
    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가 출력됩니까, 아니면 Childrenclass가 출력됩니까?네가 원래 예상했던 슈퍼클래스가 아니라 Childrenclass야.이것은 a가 실제로는 하위 유형의 대상을 가리키기 때문이다.물론 자바 가상 기회는 어떤 구체적인 방법을 사용해야 할지 자동으로 정확하게 식별할 수 있으니 걱정하지 마세요.그러나 상향 전환으로 인해 a대상은 부류와 다른 방법을 잃어버린다. 예를 들어 b1().이런 짓이 많지 않겠느냐는 의문이 제기될 수도 있다.우리는 충분히 이렇게 쓸 수 있다.

B a = new B(); 
a.a1(); 
확실히 그렇다!그러나 이렇게 하면 추상적인 프로그래밍 특색을 상실하고 확장성을 떨어뜨린다.사실 뿐만 아니라 상향 전환은 프로그래밍 작업량을 줄일 수 있다.다음 모니터 클래스 모니터를 참조하십시오.

package a.b; 
public class Monitor{ 
public void displayText() {} 
public void displayGraphics() {} 
} 
LCD 모니터 클래스 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는 당연히 모니터의 하위 클래스입니다.

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도 모니터의 하위 클래스입니다.

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"); 
} 
} 
현재 My Monitor 클래스가 있습니다.상향 전환이 없는 경우 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(); 
} 
LCD 모니터 클래스 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"); 
} 
} 
CRT Monitor, Plasma Monitor 클래스의 수정 방법은 LCDM Monitor와 유사하지만 My Monitor는 아무런 수정도 하지 않을 수 있습니다.
이를 통해 알 수 있듯이 상향 전환은 유형의 다태성을 나타내고 프로그램의 간결성을 강화했다.
하향식 전환
자류가 부류로 전환하는 것은 위로 전환하는 것이다. 반대로 부류가 자류로 전환하는 것은 아래로 전환하는 것이다.그러나 아래로 전환하면 문제가 생길 수 있다. 우리는 참새를 새라고 할 수 있지만 새를 참새라고 할 수는 없다.다음 예제를 살펴보겠습니다.
클래스 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 bMethod1()、bMethod2() 
      B b1 = (B) a1; //  , ,  
      b1.aMthod();  //  A  
      b1.bMethod1(); //  B  
      b1.bMethod2(); //  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절에서 배운 instanceof를 사용하면 됩니다.C클래스의 코드를 수정합니다.

A a2 = new A(); 
if (a2 instanceof B) { 
B b2 = (B) a2; 
b2.aMthod(); 
b2.bMethod1(); 
b2.bMethod2(); 
} 
이렇게 처리하면 유형 변환 시 ClassCastException 이상이 발생할 염려가 없습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기