자바 다 중 사용 주의사항
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 대상 이 초기 화 되 기 전에 필드 에 접근 한 것 입 니 다.따라서 우 리 는 실제 응용 에서 구조 함수 에서 다른 방법 을 호출 하거나 개인 적 인 방법 만 호출 하 는 것 을 피해 야 한다(계승 되 지 않 기 때문에 이 문 제 를 일 으 키 지 않 는 다).
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.