>  기사  >  백엔드 개발  >  메소드 재작성 및 메소드 오버로딩

메소드 재작성 및 메소드 오버로딩

伊谢尔伦
伊谢尔伦원래의
2016-11-30 09:37:191913검색

상속과 다형성은 모두 객체 지향 프로그래밍의 특징입니다. 상속을 사용하면 상위 클래스를 기반으로 하위 클래스를 만들 수 있습니다. 이 하위 클래스는 상위 클래스의 속성과 메서드를 가질 뿐만 아니라 자체 속성과 메서드도 만들 수 있습니다. 하위 클래스와 상위 클래스 간의 관계로 인해 메서드 재작성 및 메서드 오버로드 문제가 발생합니다. 상속 및 다형성에서 메소드 재작성 및 메소드 오버로드 적용에는 많은 문제가 있습니다. 기초.

1. 메소드 오버라이딩(0veriding)
재작성을 정의하는 방법: Java 프로그램에서는 클래스의 상속 관계에 따라 하위 클래스가 상위 클래스를 상속하며 모든 기능을 갖습니다. 부모 클래스의 특성은 부모 클래스의 모든 메서드와 변수를 상속합니다. 서브클래스는 새로운 기능을 정의할 수 있습니다. 서브클래스가 기능을 확장하고 증가시키기 위해 부모 클래스의 일부 메서드를 수정해야 하는 경우 프로그램 디자이너는 이러한 작업 메서드 재작성을 종종 덮어쓰기 또는 덮어쓰기라고도 합니다. 재작성은 Java의 우월성을 반영합니다. 재작성은 상속 관계를 기반으로 하므로 언어 ​​구조가 더욱 풍부해집니다. Java의 상속에서 하위 클래스는 상위 클래스의 메서드를 숨기고 액세스할 수 있으며 상위 클래스에서 상속된 메서드를 재정의할 수도 있습니다. Java에서 상속된 부모 클래스 메서드를 재정의하는 것은 메서드 재작성을 통해 이루어집니다.

소위 메소드 재작성이란 하위 클래스의 메소드가 상위 클래스에서 상속된 메소드와 정확히 동일한 반환 값 유형, 메소드 이름, 매개변수 수 및 매개변수 유형을 갖는다는 것을 의미합니다. 이런 방식으로 상위 클래스 메서드를 덮어쓸 수 있습니다. 예: 다음 코드는 메서드 재정의를 구현합니다.

class Person//定义父类
fpublic void print(){//父类中的方法
System.out.println( 父类Person的print方法! );
}
}
class Student extends Person//定义子类继承Person类
{public void print(){//方法的重写
System.out.println( 子类Student的print方法! );
}
}
public class 0verrideExampleO1
{public static void main(String args[])
{Student s=new Student();
S.print();
}
}
실행 결과: 하위 클래스 Student의 인쇄 메소드!


하위 클래스가 상위 클래스의 print() 메소드를 재정의할 때 S를 사용하는 것을 볼 수 있습니다. () 하위 클래스의 메서드가 호출되고 상위 클래스의 print() 메서드가 재정의됩니다. 즉, 이제 하위 클래스가 상위 클래스의 메서드를 재정의하면 호출 시 반드시 재정의된 메서드를 호출하게 됩니다. 그렇다면 이때 상위 클래스의 메서드를 호출해야 한다면 어떻게 될까요? super 키워드는 하위 클래스에서 상위 클래스의 콘텐츠에 액세스할 수 있습니다. 재정의된 메서드에 액세스하려면 "super.method 이름(매개변수 목록)" 형식을 사용하여 을 호출하세요.


예:

Class Person
{public void print () {
System.out.println( 父类Person的print方法! );
}
}
class Student extends Person
{public void print () {
super.print(://访问父类中被子类覆写过的方法
System.out.println(" 子类Student的print方法!" );
}
}
public class OverrideExample02
{public static void main(String args[])
{Student s=new Student();
S.print();
}
}
실행 결과: Person 클래스의 인쇄 방법

Student 클래스의 인쇄 방법!
super를 사용하려는 경우 키워드는 메소드를 다시 작성한 후에 사용해야 합니다.

은 메소드가 상위 클래스에서 상속되었음을 명확하게 나타낼 수도 있습니다. super

를 사용하면 하위 클래스가 아닌 상위 클래스에서 검색하려는 것이 더 명확해집니다.

2. 규칙 다시 작성

메서드를 다시 작성할 때는 다음 규칙을 따라야 합니다.

(1) 상위 클래스 메서드의 매개변수 목록은 해당 메서드와 완전히 일치해야 합니다. 자식 클래스에 의해 재정의됨 매개변수 목록은 동일합니다. 그렇지 않으면 재정의라고 할 수 없고 오버로드라고 할 수 있습니다. ..
(2) 상위 클래스의 반환 유형은 하위 클래스에 의해 재정의된 메서드의 반환 유형과 동일해야 합니다. 그렇지 않으면 덮어쓰기가 아니라 오버로딩이라고 할 수 없습니다. ..
(3) Java에서는 하위 클래스에 의해 재정의된 메서드가 상위 클래스 메서드보다 더 제한적인 액세스 권한을 가질 수 없다고 규정합니다. 액세스 권한 간의 관계는 다음과 같습니다.

Java 프로그램을 작성해 본 사람이라면 상위 클래스의 메소드가 어떤 상황에서도 다시 작성될 수 없다는 것을 알고 있을 것입니다. 외부 클래스가 아닌 자체 클래스에서만 액세스할 수 있으며 하위 클래스에서는 재정의할 수 없습니다. 상위 클래스에 정의된 메소드가 공개이고 하위 클래스에 메소드가 비공개로 정의된 경우 프로그램이 실행될 때 오류가 보고됩니다. 예:


class Person
{public void print()(//public访问权限
System.out.println( "父类Person的print方法! ");
}
}
Class Stedent extends Person
{private void print()(//重写方法降低了访问权限,错误
System.out.println( "子类Student的print方法!" );
}
}
(4) 상위 클래스의 액세스 권한 수정자는 하위 클래스에 의해 재정의된 메서드의 액세스 권한 수정자보다 커야 하므로 개인 권한은 가장 작은. 따라서 상위 클래스의 특정 메소드에 대한 액세스 권한이 비공개인 경우 하위 클래스에서 이를 재정의할 수 없습니다. 재정의하면 새로운 메소드만 정의할 뿐 재작성 효과는 얻을 수 없습니다.


(5) 상속 과정에서 부모 클래스의 메서드에서 예외가 발생하면 하위 클래스에서 부모 클래스의 메서드를 재정의할 때도 예외가 발생해야 하며 예외 개수는 다음과 같습니다. 던져진 예외는 너무 많을 수 없습니다. 부모 클래스에서 던져진 예외(부모 클래스에서 던져진 예외와 동일할 수 있음) 즉, 재정의된 메서드는 새로운 확인된 예외나 재정의된 메서드에 의해 선언된 것보다 더 넓은 확인된 예외를 발생시켜서는 안 됩니다. 예를 들어 상위 클래스의 메서드는 확인된 예외 IOException을 선언합니다. 이 메서드를 재정의하는 경우 IOException의 하위 클래스에 대한 예외만 발생할 수 있으며 확인되지 않은 예외는 발생할 수 있습니다.

마찬가지로 하위 클래스에서 멤버 변수가 생성되고 해당 변수가
부모 클래스의 변수와 동일한 이름을 갖는 경우 이를 변수 재정의 또는 속성 재정의라고 합니다. 그러나 이
개념은 일반적으로 의미가 거의 없기 때문에 사람들이 거의 연구하지 않습니다.

三、方法重载(Overloading)

(一)  如何定义重载。方法的重写和重载只有一个字不同,很多初学者认为这两者十分相似,其实不然。方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。下面通过一个实例来分析。
重载的定义和使用方法。 

Class Person {
{String name; 
int age;
void print(){ 
System.out.println("姓名:" +name+"年龄:" +age); 
}
void print(String a,int b){ 
System.out.println("姓名:" +a+"年龄:"+b); 
void print(String a,int b,intC){ 
System.out.println("姓名:"+a+"年龄:" +b+"ID号:" +c); 
}
void print(String a,int b,doubleC){ 
System.out.println("姓名:"+a+"年龄:" +b+"ID号:"+c); 
} 
}
public class OverLoadExampleOL 
{publicstaticvoidmain(String args[]) 
{Personpl=newPerson();
p1.nanle="李明";
p1.age=22;
p1.print(); 
p1.print("王小早",19); 
p1.print("金波",18,100325); 
p1.print("婉宁",25,110903); 
} 
}

在上面的程序中,可以看到Person类中有多个名为 void print的方法,这就是方法的重载。执行程序,运行结果如下:

姓名:李明年龄:22
姓名:王小早年龄:l9
姓名:金波年龄:18ID号:10 00325
姓名:婉宁年龄:25ID号:110903

在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法重载规则。重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根
据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型和.. (或)个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。虽然每个重载方法可以有不同的返回类型,
但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:

1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。.. 
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。

6.可以抛出不同的异常。

四、方法重写与方法重载的区别
通过上面例子的分析,我们可以将方法重写和重载的区别总
结成这样一个表格,如下:

메소드 재작성 및 메소드 오버로딩

五、结束语
在面向对象程序设计的思想中,类的继承和多态性主要就是体现在子类重写父类的方法。而构造方法的重载作为方法重载的一个典型特例,可以通过重载构造方法来表达对象的多种初始化行为。灵活的运用方法重写与方法重载,不仅能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。用好重写和重载
可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般。

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