자바 에서 위로 스타일 링 아래로 스타일 링 과 인터페이스 리 셋 에 관 한 문 제 를 말씀 드 리 겠 습 니 다.
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
이거 너무 무서워.그래서 전에 우 리 는 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 로 전환 해 야 합 니까?이것 이 바로 자바 가 아래로 전환 하 는 응용 이다.
이상 의 자바 에서 위 를 향 해 아래로 스타일 링 과 인터페이스 리 셋 의 문 제 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 많은 응원 부 탁 드 리 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.