>  기사  >  Java  >  Java에서 오버로딩과 재작성의 차이점

Java에서 오버로딩과 재작성의 차이점

巴扎黑
巴扎黑원래의
2017-06-23 16:37:341312검색

Java를 배우는 학생들 주목! ! !
학습 과정에서 문제가 발생하거나 학습 리소스를 얻고 싶다면 Java 학습 교류 그룹 159610322에 가입하세요. 함께 Java를 배우자!

먼저 이야기해 보겠습니다. 오버로딩


(1) 메서드 오버로딩은 클래스가 다양한 유형의 데이터를 통합된 방식으로 처리하는 수단입니다. 동일한 이름을 가진 여러 함수가 동시에 존재하며 매개변수의 수/유형이 다릅니다.

오버로딩은 클래스의 다형성을 나타냅니다.


(2) Java 메소드 오버로드는 이름은 같지만 매개변수와 정의가 다른 여러 메소드를 작성할 수 있음을 의미합니다.

메서드를 호출할 때 전달된 매개변수의 수와 유형에 따라 사용할 메서드를 결정합니다. 이것이 다형성입니다.


(3) 오버로딩 시 메소드 이름은 동일해야 하지만 매개변수 유형과 개수가 다르며, 반환값 유형은 동일하거나 다를 수 있습니다. 반환 유형은 오버로드된 함수를 구별하는 기준으로 사용될 수 없습니다.


다음은 오버로딩의 예입니다.
package c04.answer;//패키지 이름입니다
//이 프로그램의 첫 번째 프로그래밍 방법입니다. 메인 메서드에서 먼저 Dog 클래스 인스턴스를 생성하고, then in Dog 이 키워드는 클래스 생성자에서 다양한 껍질 메서드를 호출하는 데 사용됩니다.

다양한 오버로드 메서드 바크는 매개변수 유형에 따라 구별됩니다.

//참고: 생성자를 제외하고 컴파일러는 다른 곳에서는 생성자를 호출하는 것을 금지합니다.
패키지 c04.answer;

공개 클래스 Dog {
Dog()
{
this.bark();
}
void 껍질()//bark() 메서드는 오버로드된 메서드입니다.
                          | 짖는 소리!");
This.bark("female", 3.4);
}
void짖는 소리(String m, double l)//참고: 오버로드된 메서드의 반환 값은 동일합니다.
{
              시스템. out.println("짖는 개!"); 
                                                                                                     '매개변수 유형'과 '클래스 이름'으로만 구별할 수 있습니다.                     System.out. Dog dog = new Dog()


  그럼 재정의에 대해 이야기해 보겠습니다


(1) 상위 클래스와 하위 클래스 간의 다형성으로 상위 클래스의 기능을 재정의합니다. 하위 클래스에 정의된 메서드가 상위 클래스와 동일한 이름과 매개변수를 갖는 경우 해당 메서드가 재정의되고 있다고 말합니다. Java에서 하위 클래스는 동일한 메서드를 다시 작성하지 않고도 상위 클래스의 메서드를 상속받을 수 있습니다.

그러나 때로는 하위 클래스가 상위 클래스의 메서드를 변경 없이 상속하기를 원하지 않지만 특정 수정을 하려고 하는데, 이 경우 메서드를 다시 작성해야 합니다.

메소드 재작성은 메소드 덮어쓰기라고도 합니다.


(2) 하위 클래스의 메서드가 상위 클래스의 메서드와 동일한 메서드 이름, 반환 유형, 매개변수 목록을 갖는 경우 새 메서드가 원래 메서드를 덮어씁니다.

부모 클래스에서 원래 메소드가 필요한 경우 현재 클래스의 부모 클래스를 참조하는 super 키워드를 사용할 수 있습니다.


(3) 하위 클래스 함수의 액세스 수정 권한은 상위 클래스의 액세스 수정 권한보다 작을 수 없습니다.
다음은 다시 작성하는 예입니다.


개념: 객체 메서드를 호출하는 메커니즘.

동적 바인딩의 내부 이야기:

1. 컴파일러는 모든 후보 메소드를 얻기 위해 객체 선언의 유형과 메소드 이름을 확인합니다. 위 예제에서 Base 클래스의 테스트를 주석 처리하려고 하면 컴파일이 통과되지 않습니다.

2. 오버로드 결정: 컴파일러는 메소드 호출의 매개변수 유형을 확인하고 위의 후보 메소드 중에서 하나만 선택합니다(이 프로세스 중에 암시적 유형 변환이 발생합니다).

컴파일러가 둘 이상을 발견하거나 아무것도 발견하지 못한 경우 컴파일러는 오류를 보고합니다. 위 예제에서 Base 클래스의 테스트(바이트 b)를 주석 처리해 보세요. 실행 결과는 1 1입니다.

3. 메소드 유형이 priavte static final이고 Java가 정적 컴파일을 사용하는 경우 컴파일러는 호출할
메소드를 정확히 알 수 있습니다.

4. 프로그램이 실행 중이고 동적 바인딩을 사용하여 메소드를 호출할 때 가상 머신은 객체의 실제 유형과 일치하는 메소드 버전을 호출해야 합니다.

예제에서 b가 가리키는 실제 유형은 TestOverriding이므로 b.test(0)는 하위 클래스의 테스트를 호출합니다.

그러나 하위 클래스는 test(byte b)를 재정의하지 않으므로 b.test((byte)0)는 상위 클래스의 test(byte b)를 호출합니다.

부모 클래스의 (바이트 b)를 주석 처리하면 두 번째 단계에서 암시적 유형이 int로 변환되고, 최종적으로 하위 클래스의 test(int i)가 호출됩니다.

학습 요약:

다형성은 객체 지향 프로그래밍의 특징이며 메서드와는 아무런 관련이 없습니다.
간단히 말해 동일한 메서드라도 다른 입력 데이터에 따라 다른 처리를 수행할 수 있습니다. 즉, 메서드
오버로딩 - 다른 매개변수 목록 사용(정적 다형성)

하위 클래스가 상위 클래스로부터 동일한 메소드를 상속하는 경우 입력 데이터는 동일하지만 상위 클래스와 다른 응답을 만들고 싶은 경우 상위 클래스를 재정의해야 합니다. 클래스 메서드는 하위 클래스의 메서드를 다시 작성하는 것을 의미합니다. - 동일한 매개변수, 다른 구현(동적 다형성)

OOP의 세 가지 주요 특징: 상속, 다형성 및 캡슐화. ​​​System.out.print(b);

}

} L 공개 클래스 테스트 재정의로 Base 확장

{

void test (int i) {
++;
System.out.println (i) s); n 기본 B = 새로운 TestOverriding();



재정의의 주요 장점은 하위 클래스에 고유한 특성을 정의할 수 있다는 것입니다.

public class Father{

public void talk(){

System.out.println(Father);

}

}

public class Son은 Father를 확장합니다{

public void talk(){

System.out.println("son");

}

}

이를 다형성이라고도 하며 재정의 메서드는 In에만 존재할 수 있습니다. 상속 관계에서는 재정의 메서드는 상위 클래스의 비공개 메서드만 재정의할 수 있습니다.

위 예제에서 Father 클래스의 talk() 메서드가 비공개인 경우 Son 클래스는 Father 클래스의 talk() 메서드를 재정의할 수 없습니다. 이때 Son 클래스의 talk() 메서드는 정의된 talk() 메서드와 동일합니다. 아들 수업에서.

Father 클래스의 talk() 메서드가 최종적으로 완료되면 메서드가 public, protected 또는 default로 수정되는지 여부에 관계없이 Son 클래스는 Father 클래스의 talk() 메서드를 전혀 재정의할 수 없습니다.

코드를 컴파일하려고 할 때 컴파일러는 오류를 보고할 것입니다. 예:

public class Father{

final public void talk(){

System.out.println("Father");

}

}

public class Son 확장 Father{

public void talk( ; 서브클래스에 의해 재정의되며 동일한 패키지에 없으면 재정의될 수 없습니다.

Father 클래스의 talk() 메서드가 프로토타입되면 동일한 패키지의 하위 클래스에 의해 재정의될 뿐만 아니라 다른 패키지의 하위 클래스에 의해 재정의될 수도 있습니다.

메서드 재정의 규칙:

1. 매개변수 목록은 재정의된 메서드와 완전히 동일해야 합니다. 그렇지 않으면 덮어쓰기가 아니라 오버로드라고 할 수 있습니다.

2. 반환 유형은 항상 재정의된 메서드의 반환 유형과 동일해야 합니다. 그렇지 않으면 덮어쓰기가 아니라 오버로드라고 할 수 있습니다.

3. 액세스 수정자 제한은 재정의된 메서드의 액세스 한정자보다 커야 합니다(공개> 보호> 기본> 개인)

4 ​​재정의된 메서드는 새 검사 예외를 발생시키지 않거나 재정의된 메서드보다 커야 합니다. 더 넓은 검사 예외. 예:

부모 클래스의 메서드는 확인된 예외 IOException을 선언합니다. 이 메서드를 재정의하는 경우 IOException의 하위 클래스에 대한 예외만 발생할 수 있으며 확인되지 않은 예외도 발생할 수 있습니다.

오버로딩 규칙:

1. 매개변수 목록이 다르면 중요하지 않은 반환 유형을 가질 수 있습니다.

3.

4. 다양한 예외가 발생할 수 있습니다.

재작성과 오버로딩의 차이점은 다음과 같습니다.

재작성 다형성은 작동하며 오버로드된 메서드를 호출할 때 코드 크기를 크게 줄일 수 있습니다. 다른 매개변수가 전달되는 한 다른 함수나 반환 값을 가질 수 있습니다.

재작성과 오버로딩을 잘 활용하면 명확하고 간결한 구조의 클래스를 설계할 수 있습니다. 코드를 작성하는 과정에서 재작성과 오버로딩이 아주 중요한 역할을 한다고 할 수 있습니다.

자바를 배우는 학생들은 주목해주세요. ! ! !

학습 과정에서 문제가 발생하거나 학습 리소스를 얻고 싶다면 Java 학습 교류 그룹 159610322에 가입하세요. 함께 Java를 배우자!

위 내용은 Java에서 오버로딩과 재작성의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.