자바 다 중 사용 주의사항

5098 단어 Java다 형
자바 다 태 는 어떻게 실현 되 었 습 니까?자바 의 다 태 는 C++와 마찬가지 로 지연 귀속(late binding)이나 실행 시 귀속(runtime binding)을 통 해 이 루어 진다.어떤 대상 이 인용 하 는 방법 을 호출 할 때 컴 파일 러 는 이 인용 이 변수 성명 을 가리 키 는 유형 대상 인지,아니면 이 유형의 하위 클래스 의 대상 인지 모 르 기 때 문 입 니 다.따라서 컴 파일 러 는 이번 호출 을 위해 구체 적 인 방법 으로 연결 할 수 없습니다.자바 에서 실 행 될 때 형식 인식(RTTI,Runtime type identification)을 통 해서 만 실 행 될 때 구체 적 인 방법 으로 연결 합 니 다.다음은 구체 적 인 예 이다

class shape
{
    public void draw()
    {

   print("shape");
    }
}
class triangle extends shape
{
    public void draw()
    {

   print("triangle");
    }
}
public class Polymorphism {
public static void main(String[] args)
{
    shape s=new triangle();
    s.draw();
}

결 과 는 triangles 는 shape 참조 이지 만 실행 할 때 triangle 대상 이기 때문에 triangle 의 draw 방법 을 호출 했다.
자바 다 중 함정
개인 적 인 방법 을 다시 쓰 시 겠 습 니까?자바 에 서 는 개인 적 인 방법 을 다시 쓸 수 없습니다.이것 은 사실 이해 하기 쉽 습 니 다.개인 적 인 방법 은 하위 클래스 에서 볼 수 없 기 때 문 입 니 다.자 류 는 부 류 를 물 려 받 을 사유 방법 이 없 으 며,다시 쓰 는 것 은 말 할 것 도 없다.그래서 자 류 에서 동명 의 방법 은 새로운 방법 이다

public class Polymorphism {
    private void show()
    {

   print("show parent");
    }
public static void main(String[] args)
{
    Polymorphism p=new privateMethod();
    p.show();
}
}
class privateMethod extends Polymorphism
{
    public void show()
    {

   print("show derived");
    }
}

결 과 는 show parent.
필드 와 정적 방법의 다 중?하위 클래스 는 부모 클래스 의 비 개인 필드 를 계승 할 수 있 습 니 다.하위 클래스 의 필드 도 다 형 성 을 가지 고 있 습 니까?우 리 는 실제 적 인 예 를 살 펴 보 자

class shape
{
    protected int perimeter=1;
    public void draw()
    {

   print("shape");
    }
    public int getPerimeter()
    {

   return perimeter;
    }
}
class triangle extends shape
{

int perimeter=3;
    public void draw()
    {

   print("triangle");
    }
    public int getPerimeter()
    {

   return perimeter;
    }
    public int getSuperPerimeter()
    {

   return super.perimeter;
    }
}
public class Polymorphism {

public static void main(String[] args)
{
    shape s=new triangle();
    print("s.perimeter:"+s.perimeter);
    print("s.getperimeter:"+s.getPerimeter());
    triangle t=new triangle();
    print("t.perimeter:"+t.perimeter);
    print("t.getperimeter:"+t.getPerimeter());
    print("t.getsuperperimeter:"+t.getSuperPerimeter());
}
}

다음은 운행 결과 이다이 운행 결 과 는 다음 과 같은 정 보 를 포함한다.1.triangle 대상 이 위로 shape 로 전환 한 후 필드 에 직접 방문 하 는 것 은 모두 컴 파일 러 에 의 해 확정 되 기 때문에 다 형 성 을 나타 내지 않 고 돌아 오 는 것 은 1 이다.2.triangle 대상 이 위로 shape 로 전환 한 후 호출 방법 으로 필드 를 방문 하 는 것 은 실행 시 대상 유형 에 따라 triangle 의 getperimeter 방법 을 사용 하 는 것 입 니 다.33.t 대상 에 두 개의 perimeter 필드 가 포함 되 어 있 습 니 다.하 나 는 그 자체 에서 왔 고 하 나 는 그의 부모 클래스 에서 왔 습 니 다.필드 이름 으로 이 필드 를 호출 할 때 기본적으로 그 자체 의 perimeter 필드 를 되 돌려 줍 니 다.부모 클래스 에서 물 려 받 은 이 필드 를 호출 하려 면 슈퍼.perimeter 방법 을 사용 해 야 합 니 다.이 결 과 는 다소 의 심 스 러 워 보 입 니 다.이러한 상황 을 피하 기 위해 서 는 필드 를 private(하위 클래스 는 계승 할 수 없습니다)라 고 밝 히 는 동시에 하위 클래스 에서 설명 하 는 필드 는 부모 클래스 에서 계승 하 는 필드 와 동명 이인 하지 않 는 것 이 좋 습 니 다.정적 방법 은 다 태 성 이 없다.정적 방법 은 클래스 와 연결 되 어 있 기 때문에 구체 적 인 유형 을 모 르 는 상황 이 존재 하지 않 는 다.
구조 함수 의 다 태 성?구조 함 수 는 다 형 성 을 가지 지 않 는 다.구조 방법 자체 가 정태 적 인 방법 이기 때문이다.우리 의 문 제 를 도입 하려 면 먼저 구조 함수 의 호출 순 서 를 살 펴 보 자.1.이 대상 에 게 분 배 된 저장 공간 은 모두 0(대상 이 null 로 초기 화 됨)2.부모 클래스 의 구조 함수 호출(그래 야 하위 클래스 의 구조 함수 에 접근 하 는 필드 가 초기 화 됨)3.구성원 변수 초기 화 4.하위 클래스 의 구조 함수 호출
지금 만약 에 두 번 째 단계 에서 우리 가 아버지 류 의 구조 함수 에서 어떤 방법 을 호출 했다 고 가정 하면 이 방법 은 다 형 적 인 것 이 아 닙 니까?아니면 구체 적 인 예 를 살 펴 보 자

class shape
{
    protected int perimeter=1;
    public shape()
    {

   draw();

   print("shape created");
    }
    public void draw()
    {

   print("draw shape "+perimeter);
    }

}
class triangle extends shape
{

int perimeter=3;

public triangle()

{

    print("triangle created");

}
    public void draw()
    {

   print("draw triangle "+perimeter);
    }
    public int getPerimeter()
    {

   return perimeter;
    }
}

public class Polymorphism {

public static void main(String[] args)
{
    shape s=new triangle();
}
}

운행 결과:
 
triangle 대상 이 아직 구조 가 끝나 지 않 았 지만 draw 방법 은 여전히 triangle 에 동적 으로 연결 되 어 있 는 draw 방법 을 볼 수 있 습 니 다.동시에 perimeter 의 값 이 3 으로 초기 화 되 지 않 고 0 이라는 것 을 알 게 되 었 다.
이러한 결 과 는 triangle 대상 이 초기 화 되 기 전에 필드 에 접근 한 것 입 니 다.따라서 우 리 는 실제 응용 에서 구조 함수 에서 다른 방법 을 호출 하거나 개인 적 인 방법 만 호출 하 는 것 을 피해 야 한다(계승 되 지 않 기 때문에 이 문 제 를 일 으 키 지 않 는 다).

좋은 웹페이지 즐겨찾기