자바 에서 위로 스타일 링 아래로 스타일 링 과 인터페이스 리 셋 에 관 한 문 제 를 말씀 드 리 겠 습 니 다.

최근 자바 계승 문 제 를 돌 이 켜 보 았 습 니 다.다음은 코드 를 붙 입 니 다.

public class Base {

 protected String temp = "base";
 public void fun(){
 System.out.print("BASE fun()");
 }

 public static void main(String[] args) {
 Base b =new Base();//   Base  
 b.fun();   //     fun()   
 System.out.println(b.temp);//          temp 
 
    /*****************************************************/ 
 System.out.println("/***************/");
 Son son = new Son();//   Son  
 son.fun();  //  son fun  
 System.out.println(son.temp);//  son     temp
 
 Son S_son=new Son();    //   Son  
 Base B_s =(Base)S_son;   //    -----------   Base s =new Son();
 B_s.fun();      //     fun()  
 System.out.println(B_s.temp);//         temp 
 
    /******************************************************/
 System.out.println("/***************/");
 Base s =new Son();//    
 s.fun();     //       
 System.out.println(s.temp);//         temp
 
 Base ba =new Son();
 Son so = (Son)ba;      //    
 so.fun();       //     fun()  
 System.out.println(so.temp);//         temp 
 }
}
class Son extends Base{
 protected String temp = "Son";
 public void fun(){
 System.out.print("SON fun()");
 }
}
실행 결과:

BASE fun()base
/***************/
SON fun()Son
SON fun()base
/***************/
SON fun()base
SON fun()Son
결론 총화:
1.부모 클래스 의 인용 변 수 는 하위 클래스 대상 을 가리 킬 수 있 고 하위 클래스 의 인용 변 수 는 부모 클래스 대상 을 가리 킬 수 없습니다.
2.위로 스타일 링(upcasting):하위 대상 을 부모 클래스 에 직접 부여 하고 위로 전환 할 때 강제 적 으로 전환 하지 않 아 도 됩 니 다.예:
Base base = new Son(); 올 림 스타일 C 암시 적
3.아래로 스타일 링(downcasting):하위 클래스 대상 을 가리 키 는 부모 클래스 인용 을 하위 클래스 에 부여 하고 강제로 전환 해 야 합 니 다.
Base b= new Son();
Son s = (Son)base;----------아래로 스타일 링 C 는 강제 적 으로 전환 되 어야 하 며 계승 관계 가 있어 야 합 니 다.
4.upcasting 는 하위 클래스 특유 의 방법 을 잃 어 버 리 지만 하위 클래스 overriding 부모 클래스 의 방법 은 하위 클래스 대상 이 호출 하 는 방법 이 유효 합 니 다.
5.호출 방법 또는 구성원 변수의 규칙:
전제:하위 클래스 에 재 작성 방법 이 존재 합 니 다.부모 클래스 와 하위 클래스 에 같은 이름 의 구성원 변 수 를 동시에 가지 고 있 습 니 다.
(1)위로 스타일 링 을 하 는 인용 형 변 수―부모 류 인용 변 수 는 하위 클래스 의 재 작성 방법 만 호출 할 수 있 지만 부모 류 의 인용 변 수 는 부모 클래스 의 구성원 변수 에 만 접근 할 수 있다.
(2)아래 스타일 의 인용 형 변 수 를 실 시 했 을 때 하위 클래스 인용 변 수 는 하위 클래스 재 작성 방법 만 호출 하고 하위 클래스 의 인용 변 수 는 하위 클래스 의 구성원 변수 에 만 접근 할 수 있 습 니 다.
(3)자신 이 통속 적 인 표현,호출 방법 을 생각해 서 현재 의 인용 변수 가 가리 키 는 대상 을 얻 었 다.변 수 를 호출 하려 면 현재 인용 변수의 유형 을 봐 야 합 니 다.
즉,조절 방법,대상,변 수 를 보고 유형 을 보 는 것 이다.(시험 해 볼 수 있다)
인터페이스 리 턴 과 위로 스타일 링

/**
 *     ,        
 * @author Character_Painter
 *
 */
public class Inter extends Father implements Person,Teacher{
 public void study(){
 System.out.println("  ");
 }
 public void sleep(){
 System.out.println("  sleep()  ");
 }
 
public static void main(String[] args) {
 Father f = new Inter();
 f.sleep();//    ---  
 
 Person p=new Inter();
 p.eat(); //      
 
 Teacher t = new Inter();
 t.teach(); //      

}

@Override
public void eat() {
 System.out.println("  eat()  "); 
}

@Override
public void teach() {
 System.out.println("  teache()  "); 
 
}

}
 
interface Person{
 public void eat();
}
interface Teacher{
 public void teach();
}
class Father{
 public void sleep(){
 System.out.println("  sleep()  ");
 }
}
실행 결과
하위 sleep()방법
다시 쓰기 eat()방법
teache()재 작성 방법
요약:
인터페이스 방식 을 사용 하 는 목적 은 여러 부모 유형의 방법 을 실현 하고 여러 가지 실현 을 강조 하 는 것 이 어야 한다.위로 스타일 링 을 하 는 것 은 일대일 의 계승 관 계 를 대상 으로 위로 스타일 링 을 한 후에 하위 류 의 재 작성 방법 을 사용 할 수 있다.이것 이 바로 내 가 생각 하 는 그들의 차이 이다.
보충 지식:자바 아래로 전환 하 는 의미 와 플라스틱 의 세 가지 측면
처음에 자바 를 배 울 때 아래로 전환 하 는 것 을 중시 하지 않 았 다.아래로 전환 하 는 의미 와 용 도 를 잘 모 르 겠 지만 사실은 그렇지 않 습 니 다.그 개발 과정 에서 아래로 전환 하 는 것 도 생각 하지 못 했 을 것 입 니 다.
사실은 위로 전환 하고 아래로 전환 하 는 것 이 모두 중요 하 다.아마도 우 리 는 평소에 위로 전환 하 는 것 을 많이 보고 위로 전환 하 는 것 도 이해 하기 쉬 울 것 이다.
그러나 아래로 전환 하면 바보 같 지 않 습 니까?저 는 하위 클래스 인 스 턴 스 대상 을 사용 하려 고 합 니 다.먼저 하위 클래스 인 스 턴 스 를 생 성하 여 부모 클래스 에 인용 하고 부모 클래스 를 하위 클래스 에 강하 게 전달 하 는 것 은 쓸데없는 일이 아 닙 니까?나 는 위로 전환 하지 도 않 고 아래로 전환 하지 도 않 으 며,직접 하위 사례 를 사용 하면 된다.
제 가 자바 를 배우 기 시 작 했 을 때 도 그렇게 생각 했 습 니 다.이 잘못된 부분 으로 인해 저 는 아래로 전환 하 는 것 이 소 용이 없다 고 생각 합 니 다.
기술 이 향상 되면 서 저 는 개원 프로젝트 를 보고 공 부 를 했 는데 많은 부분 에서 아래로 전환 하 는 기술 을 사 용 했 습 니 다.그래서 저 는 이 지식 을 다시 복습 하고 싶 습 니 다.또한 많은 블 로그 글 을 검 색 했 지만 아래로 전환 하 는 것 에 대해 구체 적 으로 설명 하지 않 았 다.예 를 들 어 어떻게 사용 하 는 지 보 여 주 었 을 뿐 오히려 위로 전환 하 는 것 에 대해 많은 이 야 기 를 했다(아마 내 가 찾 지 못 했 을 것 이다).
이 블 로 그 는 바로 아래로 전환 하 는 것 을 말한다.그러면 우 리 는 아래로 전환 하 는 것 을 배우 고 이런 특성의 의미 와 사용 장면 을 알 아 보 자.
전자 제품 인 터 페 이 스 를 새로 만 듭 니 다.다음 과 같 습 니 다.
public interface Electronics{
}
간단 해,아무 방법 도 없어.
Thinkpad 노트북 종 류 를 새로 만 들 고 전자 제품 인 터 페 이 스 를 실현 합 니 다.

public class Thinkpad implements Electronics{

  //Thinkpad    
  public void boot(){
    System.out.println("welcome,I am Thinkpad");    
  }

  //  Thinkpad   
  public void program(){
    System.out.println("using Thinkpad program");
  }
}
마우스 클래스 를 새로 만 들 고 전자 제품 인 터 페 이 스 를 실현 합 니 다.

public class Mouse implements Electronics{

  //    
  public void move(){
    System.out.println("move the mouse");    
  }

  //     
  public void onClick(){
    System.out.println("a click of the mouse");
  }
}
키보드 키보드 클래스 를 새로 만 들 고 전자 제품 인 터 페 이 스 를 실현 합 니 다.

public class Keyboard implements Electronics{

  //        
  public void input(){
    System.out.println("using Keyboard input");
  }
}
이곳 에는 하위 클래스 가 비교적 많은 것 은 더 잘 이해 하기 위해 서 이다.각 유형의 방법의 논리 적 실현 도 간단 하 다.한 줄 의 정 보 를 인쇄 했다.
그 다음 에 우 리 는 쇼핑 몰 에 가서 전자 제품 을 사고 전자 제품 이 많 습 니 다.예 를 들 어 노트북,마우스,키보드,걸음 이 높 은 판독 기 가 어디 를 누 르 지 않 는 지,우리 가 사용 하 는 핸드폰 등 은 모두 전자 제품 에 속 합 니 다.전자 제품 은 추상 적 이다.자,그럼 Thinkpad 한 대,마우스 하나,키보드 하 나 를 사기 로 했 습 니 다.
이때,우 리 는 이 전자 제품 들 을 담 을 카 트 가 필요 하 다.우 리 는 카 트 에 추가 한 후에 카 트 를 통 해 저 장 된 전자 제품 의 수량 을 알 수 있 고 해당 하 는 전자 제품 을 얻 을 수 있다.
그럼 쇼핑 카 트 하나 가 나 왔 습 니 다.다음 과 같 습 니 다.

import java.util.ArrayList;
import java.util.List;
public class ShopCar{

  private List<Electronics> mlist = new ArrayList<Electronics>();
  public void add(Electronics electronics){
    mlist.add(electronics);
  }

  public int getSize(){
    return mlist.size();
  }

  public Electronics getListItem(int position){
    return mlist.get(position);
  }
}
List 집합 은 전자 제품 을 저장 하 는 데 사용 되 며,add 방법 은 전자 제품 을 카 트 에 추가 하 는 데 사용 되 며,getSize 방법 은 저 장 된 전자 제품 의 수량 을 얻 는 데 사용 되 며,getList Item 방법 은 해당 하 는 전자 제품 을 얻 는 데 사용 된다.
List에서 범 형 지식 을 사 용 했 는데 왜 범 형 을 사 용 했 는 지 볼 수 있 습 니 다.이것 은 소 개 를 하지 않 겠 습 니 다.범 형 은 매우 중요 합 니 다.
저 는 왜 Thinkpad,Mouse,Keyboard,Phone 등 을 넣 는 것 이 아니 라 Electronics 를 넣 는 범 형 인지 궁금 합 니 다.
그렇다면 List라면 마우스 마우스 마우스 에 넣 을 수 없 겠 지,설마 3 개의 집합 을 만들어 야 하나?여 기 는 3 개의 전자 제품 류 를 정 의 했 지만 제 가 100 가지 전자 제품 이 있다 면 100 개의 집합 을 정의 해 야 합 니까?
이거 너무 무서워.그래서 전에 우 리 는 Electronics 인 터 페 이 스 를 써 서 하나의 Electronics 기준 을 제공 한 다음 에 모든 Electronics 서브 클래스 가 이 인 터 페 이 스 를 실현 하도록 했다.
실제로 여 기 는 위로 전환 하 는 지식 과 관련 되 었 다.우 리 는 add 방법 으로 하위 인 스 턴 스 를 전달 하여 보관 하지만 하위 인 스 턴 스 는 전달 하 는 과정 에서 도 위로 전환 했다.
따라서 이때 카 트 에 저 장 된 하위 클래스 인 스 턴 스 대상 은 위로 전자 제품 으로 전환 되 어 하위 클래스 만 의 방법 을 잃 어 버 렸 다.상기 예 를 들 어 Thinkpad 인 스 턴 스 는 boot()와 program()두 가지 방법 을 잃 어 버 렸 고 Mouse 인 스 턴 스 는 move()와 onClick()두 가지 방법 을 잃 어 버 렸 다.
하지만 실제 Thinkpad 나 Mouse 나 Keyboard 를 사용 할 때 는 우리 가 원 하 는 것 이 아 닐 것 이다.
이어서 우 리 는 카 트 안의 전자 제품 을 테스트 하기 위해 테스트 클래스 Test 를 썼 다.
테스트 클래스 Test 는 다음 과 같 습 니 다.

public class Test{

  public static final int THINKPAD = 0;
  public static final int MOUSE = 1;
  public static final int KEYBOARD = 2;

  public static void main(String[] args){

    //      
    ShopCar shopcar = new ShopCar();
    shopcar.add(new Thinkpad());
    shopcar.add(new Mouse());
    shopcar.add(new Keyboard());

    //    
    System.out.println("              ――> "+shopcar.getSize());


    //    thinkpad  
    Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
    thinkpad.boot();
    thinkpad.program();

    System.out.println("-------------------");

    //    Mouse  
    Mouse mouse = (Mouse)shopcar.getListItem(MOUSE);
    mouse.move();
    mouse.onClick();

    System.out.println("-------------------");

    //    Keyboard  
    Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD);
    keyboard.input();
  }

}
캡 처 실행:

예 를 들 어 분석 하면 돼 요.

//    thinkpad  
Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
thinkpad.boot();
thinkpad.program();
shopcar.getListItem(THINKPAD)
이 코드 는 Electronics 형식의 인 스 턴 스 를 얻 은 것 입 니 다.Thinkpad 의 인 스 턴 스 가 아 닙 니 다.
아래로 전환 하여 하위 클래스 에 값 을 부여 합 니 다.
Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
이러한 인 스 턴 스 는 위로 전환 해서 잃 어 버 린 방법(boot 와 program)을 다시 얻 었 습 니 다.
정리 해 보 세 요.많은 경우 에 우 리 는 여러 종류의 실례 대상 을 모두 하나의 집합 에 던 져 야 합 니 다.(이 말 은 매우 중요 하 다)
이 예 에서 Thinkpad 노트북,마우스 마우스,KeyBoard 키보드 등 인 스 턴 스 대상 을 모두 하나의 Shopcar 카 트 에 던 져 모 으 는 것 이다.
그러나 그들 에 게 모든 종 류 를 하나의 독립 된 집합 으로 저장 할 수 는 없 을 것 이다.이 럴 때 우 리 는 하나의 기준 을 찾 아야 한다.인 터 페 이 스 는 하나의 기준 이다.이것들 은 모두 각종 전자 제품 으로 추상 적 으로 전자 제품 으로 되 어 있다.그리고 전자 인터페이스 가 나 왔 습 니 다.
아까 로 돌아 가서 우 리 는 많은 종류의 실례 대상 을 모두 하나의 집합 에 던 졌 다.아마도 이렇게 하면 비교적 이해 하기 쉬 울 것 이다.여러 종류의 하위 클래스 실례 대상 을 모두 부모 클래스 실례 를 저장 하 는 집합 에 던 져 라.
이 과정 을 거 쳐 하위 클래스 인 스 턴 스 는 부모 클래스 참조(즉,위로 전환 완료)에 할당 되 었 으 나 아 쉽게 도 하위 클래스 확장 방법 을 잃 어 버 렸 습 니 다.
좋 은 것 은 자바 언어 가 아래로 전환 하 는 특성 이 있어 서 우 리 는 잃 어 버 린 방법,즉 하위 클래스 를 강하 게 되 돌 릴 수 있 습 니 다.
그래서 우 리 는 하위 클래스 인 스 턴 스 를 사용 해 야 할 때 그 부모 클래스 집합 에서 꺼 내 서 아래로 전환 하면 됩 니 다.마찬가지 로 하위 클래스 인 스 턴 스 대상 을 사용 할 수 있 습 니 다.
……
나 는 자바 가 아래로 전환 하 는 의 미 를 검색 할 때 비교적 좋 은 답 을 얻 었 다.
가장 큰 용 도 는 자바 의 일반적인 프로 그래 밍 으로 용도 가 매우 크 고 자바 의 집합 류 는 모두 이렇다.
안 드 로 이 드 개발 에 서 는 Layout 폴 더 에서 xml 로 작 성 된 컨트롤 입 니 다.왜 Activity 등 구성 요소 에서 findView ById()방법 으로 찾 을 수 있 습 니까?왜 findView ById(R.id.textview)방법 이 TextView 의 id 에 들 어간 후에 TextView 로 전환 해 야 합 니까?이것 이 바로 자바 가 아래로 전환 하 는 응용 이다.
이상 의 자바 에서 위 를 향 해 아래로 스타일 링 과 인터페이스 리 셋 의 문 제 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기