如何理解这三种定义方式
Collection arr1 = new ArrayList();
List arr2 = new ArrayList();
ArrayList arr3 = new ArrayList();
大家讲道理2017-04-17 16:46:08
업데이트된 답변:
사실 세 가지 상황이 아니라 두 가지 상황이 있습니다.
실제 개발에서 자주 접하게 되는 시나리오의 예를 들어보면 "객체를 사용하기 위해 종종 객체를 부모 클래스나 인터페이스로 변환해야 하는 경우가 많다"는 이유를 이해하게 될 것입니다.
보통 목록을 사용할 때 다음과 같이 작성합니다:
목록 목록 = new ArrayList();
대신
ArrayList 목록 = 새로운 ArrayList();
첫 번째 것이 두 번째 것보다 나은 이유는 무엇인가요?
두 가지 방법으로 목록을 선언한 다음 다른 사람이 참조하거나 다른 곳에서 자신이 사용한다고 가정해 보겠습니다.
어느 날 갑자기 ArrayList를 사용하는 것이 좋지 않아 LinkedList로 대체해야 한다는 사실을 알게 되면 명령문을 다음과 같이 변경해야 합니다.
LinkedList 목록 = 새로운 LinkedList();
이런 방식으로 목록이 사용되는 곳마다 유형 선언을 변경해야 합니다. 더 중요한 것은 귀하의 목록을 사용하는 사람들이 "귀하의 목록은 ArrayList입니다."라는 전제를 바탕으로 자신의 코드를 작성한다는 것입니다. 갑자기 LinkedList로 변경하면 프로그램이 중단되거나 다시 작성되어야 할 수 있습니다.
그러나 처음부터 첫 번째 선언 방식을 사용하면 이런 문제는 발생하지 않습니다. 귀하는 언제든지 목록을 변경할 수 있으며, 귀하의 목록을 참조하는 다른 사람이나 다른 장소에서는 변경할 필요가 없습니다. 예:
목록 목록 = new LinkedList();
따라서 변수를 선언할 때 유형을 가능한 한 일반적으로 만들고, 가능한 한 구체적으로 만드세요. 전자는 수정에 우호적인 반면, 후자는 수정에 우호적이지 않습니다.
마찬가지로 메소드의 접근성(예: 공개, 보호, 기본, 비공개)을 결정할 때 가능하면 작을수록 좋습니다.
PHP中文网2017-04-17 16:46:08
ArrayList는 List 인터페이스를 구현하므로 ArrayList는 List 유형이어야 합니다. 마찬가지로 List는 Collection 인터페이스를 구현하므로 List는 Collection 유형이어야 합니다. ArrayList의 상향 변환으로도 이해될 수 있습니다.
PHP中文网2017-04-17 16:46:08
예를 들어, 당신은 와인의 신이고 와인을 특별히 좋아합니다. 어느 날 집에 갔는데 테이블 위에 화이트 와인이 가득 담긴 잔이 몇 개 있었는데, 겉으로는 어떤 와인인지 알 수가 없었습니다. 마시고 나서야 어떤 와인인지 짐작할 수 있었습니다. 마시면 건안춘, 다시 마시면 우량계, 다시 마시면 구계주... 여기서는 다음과 같이 표현합니다.
와인 a = 젠안춘
술 b = 우량예
술 c = 지우귀 술
…
여기에 표시된 것은 다형성입니다. Jiannanchun, Wuliangye 및 Jiuguijiu는 모두 와인의 하위 클래스입니다. 이는 와인의 상위 클래스를 통해서만 서로 다른 하위 클래스를 참조할 수 있습니다. 이는 실행 시 참조 변수의 특정 지점만 알 수 있습니다.
다형성을 이해하려면 "상향 변환"이 무엇인지 이해해야 한다는 것은 사실입니다. 상속에서는 상향 변환을 간략하게 소개했습니다. 위의 음주 예에서 Wine(Win)이 상위 클래스이고 Jiannanchun(JNC), Wuliangye(WLY) 및 Jiuguijiu(JGJ)가 하위 클래스입니다. 우리는 다음 코드를 정의합니다:
JNC a = 새로운 JNC();
이 코드는 Jiannanchun의 객체를 인스턴스화하는 것에 지나지 않는다는 것을 우리는 매우 쉽게 이해할 수 있습니다! 하지만 이건 어때요?
와인 a = new JNC();
여기서 우리는 JNC 객체 인스턴스를 가리키는 Wine 유형 a가 여기에 정의되어 있음을 이해합니다. JNC는 Wine에서 상속되기 때문에 JNC는 자동으로 Wine으로 변환될 수 있으므로 a는 JNC 인스턴스 개체를 가리킬 수 있습니다. 이렇게 하면 매우 큰 이점이 있습니다. 상속에서는 하위 클래스가 하위 클래스를 가리키는 상위 클래스 참조 유형을 정의하는 경우 상위 클래스보다 더 강력한 기능을 제공할 수 있다는 것을 알고 있습니다. , 그런 다음 상위 클래스의 공통 기능을 참조할 수 있을 뿐만 아니라 하위 클래스의 강력한 기능도 사용할 수 있습니다.