前言
当我没有学习Java之前,我的一个同事就这样考我,问我重载和重写这两者到底有什么不同,在Objective-C中我们经常说我们重写了一个方法,但是很少说重载一个方法,其实在Objective-C是存在不完全重载一个方法,由于Objective-C拼接一个方法的参数不同造成的(在Objective-C中我们使用:来拼接参数).所以我们没有过多注意过这个问题,下面我们就来看两个例子.来看看具体情况.
- (void)test:(int)one {
NSLog(@"one parameter!");
}
- (void)test:(int)one andTwo:(int)two {
NSLog(@"two parameters!");
}
调用方式如下所示.
[self test:1];
[self test:1 andTwo:2];
通常我们会认为test:
和test: andTwo:
是这两个方法的方法名,所以在Objective-C中虽然存在重载说法,但是并不如Swift和Java这种语言中那么重视.
</br>
Java中的重写
在Java中的重写主要是存在于子类与父类之间,父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。这一点和Objective-C是一致的.若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
这里有个注意的问题就是 子类函数的访问修饰权限不能少于父类的访问修饰权限.
</b>
假定我们有Student和People两个类,Student继承于People.我们在People类中定义一个方法,如下所示.
public class People {
public String peopleName = "骚栋";//姓名
protected void printStudentName(String name) {
System.out.println(name);
}
}
在Student中我们可以创建一个和People类中printStudentName
方法名,参数,返回值类型一样的参数.如下所示.
public class Student extends People {
public void printStudentName(String name) {
this.peopleName = "神经骚栋";
System.out.println(super.peopleName);
System.out.println(this.peopleName);
System.out.println(name);
System.out.println(super.getClass());
}
}
然后我们在任意位置创建一个Student对象,并且调用printStudentName
这个方法,如下所示.如果我们没有重写这个方法的话,我们调用的就是父类People中的该方法的实现,但是我们现在在Student类中重写了这个方法,那么我们调用的就是重写之后的这个方法了.
Student student = new Student();
student.printStudentName(student.peopleName);
所以控制台的打印信息如下图所示.
Java中的重载
- 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
- Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
- 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
最常见的重载就是构造器方法的重载了,比如上面的Student类,我们可以根据不同的构造器方法来创建不同Student对象.如下所示.
public class Student extends People {
public int age;//年龄
public String studentName;//学生姓名
Student(int age){
this.age = age;
System.out.println(age);
}
Student(String name){
this.studentName = name;
System.out.println(name);
}
}
我们就可以如下进行调用了Student类的构造器方法了.
Student firstStudent = new Student(18);
Student secondStudent = new Student("骚栋");
本文参考文章链接:java中重载与重写的区别 .本文只是作为学习笔记,如有纰漏或者侵权,欢迎指出.