>  기사  >  Java  >  Java의 오버로딩과 재작성의 차이점 분석 예

Java의 오버로딩과 재작성의 차이점 분석 예

高洛峰
高洛峰원래의
2017-01-21 17:09:022069검색

이 기사는 Java에서 오버로딩과 재작성 간의 차이점을 자세히 분석하기 위해 예제를 사용합니다.

1. 오버로딩:

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

(2) Java 메소드 오버로드는 이름은 같지만 매개변수와 정의가 다른 여러 메소드를 작성할 수 있음을 의미합니다.
메서드를 호출할 때 전달된 매개변수의 수와 유형에 따라 사용할 메서드를 결정합니다. 이것이 다형성입니다.

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

다음은 오버로딩의 예입니다:

package c04.answer;//这是包名
//这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog类的构造方法中利用this关键字调用不同的bark方法。
不同的重载方法bark是根据其参数类型的不同而区分的。
//注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
package c04.answer;
public class Dog {
Dog()
{
this.bark();
}
void bark()//bark()方法是重载方法
{
System.out.println(\"no barking!\");
this.bark(\"female\", 3.4);
}
void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
{
System.out.println(\"a barking dog!\");
this.bark(5, \"China\");
}
void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
{
System.out.println(\"a howling dog\");
}
public static void main(String[] args)
{
Dog dog = new Dog();
//dog.bark(); [Page]
//dog.bark(\"male\", \"yellow\");
//dog.bark(5, \"China\");

2. 오버라이딩(Overriding)

(1) 부모 클래스 함수에 대한 부모 클래스와 자식 클래스 간의 다형성은 다음과 같습니다. 재정의되었습니다. 하위 클래스에 정의된 메서드가 상위 클래스와 동일한 이름과 매개변수를 갖는 경우 해당 메서드가 재정의되고 있다고 말합니다. 에서 하위 클래스는 동일한 메서드를 다시 작성할 필요 없이 상위 클래스로부터 메서드를 상속받을 수 있습니다.
그러나 때로는 하위 클래스가 상위 클래스의 메서드를 변경 없이 상속하기를 원하지 않지만 특정 수정을 하려고 하므로 메서드를 다시 작성해야 합니다.
메서드 재정의를 메서드 덮어쓰기라고도 합니다.

(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)가 호출됩니다.

3. 학습 요약:

다형성은 객체지향 프로그래밍의 특징이며 메소드와는 관련이 없습니다.
간단히 말하면 동일한 메소드로 입력 데이터를 변경할 수 있습니다. 서로 다른 입력 데이터에 따라 서로 다른 처리를 수행합니다. 즉,
메서드 오버로드 - 서로 다른 매개변수 목록(정적 다형성)
하위 클래스가 상위 클래스에서 동일한 메서드를 상속하는 경우 입력 데이터는 동일하지만 상위 클래스와 다른 응답을 생성하는 경우 상위 클래스 메서드를 재정의해야 합니다.
즉, 하위 클래스에서 메서드를 다시 작성해야 합니다. - 동일한 매개변수, 다른 구현(동적 다형성)

OOP 세 가지 주요 기능: 상속, 다형성, 캡슐화.

public class Base
{
void test(int i)
{
System.out.print(i);
}
void test(byte b)
{
System.out.print(b);
}
}
public class TestOverriding extends Base
{
void test(int i)
{
i++;
System.out.println(i);
}
public static void main(String[]agrs)
{
Base b=new TestOverriding();
b.test(0)
b.test((byte)0)
}
}

이때 출력 결과는 1 0인데, 이는 런타임 시 동적 바인딩의 결과입니다.

오버라이딩의 가장 큰 장점은 특정 하위 클래스에 고유한 특성을 정의할 수 있다는 것입니다.

publicclassFather{
publicvoidspeak(){
System.out.println(Father);
}
}
publicclassSonextendsFather{
publicvoidspeak(){
System.out.println("son");
}
}

이를 다형성이라고도 합니다. 오버라이딩 메서드는 상속 관계에만 존재할 수 있습니다. 상위 클래스의 비공개 메서드는 재정의될 수 있습니다.
위의 예에서 Father 클래스의 talk() 메서드가 비공개인 경우 Son 클래스는 Father 클래스의 talk() 메서드를 재정의할 수 없습니다. 이때 Son 클래스의 talk() 메서드는 정의된 talk()와 동일합니다. Son 클래스에서.
Father 클래스의 talk() 메서드가 최종적으로 완료되면 메서드가 public, protected 또는 default로 수정되더라도 Son 클래스는 Father 클래스의 talk() 메서드를 전혀 재정의할 수 없습니다.
컴파일하려고 할 때. 코드를 컴파일하고 서버에서 오류를 보고합니다. 예:

publicclassFather{
finalpublicvoidspeak(){
System.out.println("Father");
}
}
publicclassSonextendsFather{
publicvoidspeak(){
System.out.println("son");
}
}//编译器会报错;

Father 클래스의 talk() 메서드가 기본적으로 수정되면 동일한 패키지에 있는 해당 하위 클래스에 의해서만 재정의될 수 있습니다. 동일한 패키지에 없으면 재정의할 수 없습니다.

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

메소드 재정의 규칙:

1. 매개변수 목록은 재정의된 메서드와 완전히 동일해야 합니다. 그렇지 않으면 재작성이라고 할 수 없지만 오버로딩이라고 할 수 있습니다.
2. 반환 유형은 항상 재정의된 메서드의 반환 유형과 동일해야 합니다. 그렇지 않으면 덮어쓰기가 아니라 오버로드라고 할 수 있습니다.
3. 액세스 수정자 제한은 재정의된 메서드의 액세스 수정자보다 커야 합니다(공개>보호>기본>개인)
4. 재정의된 메서드는 새 검사 예외를 발생시키거나 액세스보다 무거워서는 안 됩니다. 재정의된 메서드의 수정자. 보다 일반적인 확인 예외인 메서드 선언을 작성합니다. 예:
상위 클래스의 메서드는 확인된 예외 IOException을 선언합니다. 이 메서드를 재정의하는 경우 IOException의 하위 클래스에 대한 예외만 발생할 수 있으며 확인되지 않은 예외는 발생할 수 있습니다.

오버로딩 규칙:

1. 매개변수 목록이 달라야 합니다.
2. 매개변수 목록이 다른 한, 비난할 수 없는 반환 유형을 가질 수 있습니다. >3. 다양한 액세스 수정자를 가질 수 있습니다.
4. 다양한 예외를 발생시킬 수 있습니다.

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

오버로드된 메소드를 호출하면 동일한 메소드 이름이라도 다른 매개변수가 전달되는 한 다른 함수나 반환 값을 가질 수 있습니다.

리라이팅과 오버로딩을 잘 활용하면 명확하고 간결한 구조의 클래스를 디자인할 수 있다. 코드를 작성하는 과정에서 리라이팅과 오버로딩이 아주 중요한 역할을 한다고 할 수 있다. 오버로딩과 재작성의 차이점에 대한 기사는 PHP 중국어 웹사이트에 주목하세요!

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